標籤:bool 先來 解決 inpu 分享 這一 isset 資訊 lte
自以為sql注入掌握的還是比較系統的,然而,做了這些題之後才發現,大千世界無奇不有,真是各種猥瑣的思路...還是要多學習學習姿勢跟上節奏呀
登入一下好嗎??
http://ctf5.shiyanbar.com/web/wonderkun/web/index.html
試了一下發現他過濾了/ or union select - #
雖然and ‘ " = + %沒有被過濾,但用%0b和%23都沒效,於是還在想這是用了多麻煩的WAF,越想越複雜我竟然還去用xss,真是跑題了...
然而最後的payload是這樣的...跪了,果然題刷的太少嗎
who are you?
http://ctf5.shiyanbar.com/web/wonderkun/index.php
進入這個頁面,發現他擷取了我的ip,首先想到的就是user agent注入,用updatexml試一下,什麼錯的沒有報...看來這個思路不行
百度了才知道這是一道偽造IP的題,相關知識可以看這裡:http://www.cnblogs.com/x2048/articles/1794020.html
總結下,偽造IP的HTTP頭都有這些:
X-Forwarded-ForClient-IPx-remote-IPx-originating-IPx-remote-addr
一般用的最多的就是前兩個,這裡我們用X-Forwarded-For來偽造
但是很奇怪,不管構造的是什麼語句,都會返回到頁面,看了下別人的writeup發現,他的幕後處理過程大致是這樣的,首先擷取到HTTP-X-Forwarded-For,對他進行字串的處理,只截取逗號前的內容,然後直接將其輸出到頁面,再插入到資料庫,但應該沒有對插入結果做處理,即沒有輸出資料庫的報錯僅輸出空,所以想從資料庫的報錯擷取資訊應該是不行了,返回頁面也是不具判斷性的,那麼可以考慮時間型的盲注
這裡解決的方法可以有三種:
1、寫個盲註腳本跑
這是跑出來的庫名:
表名:
欄位:
於是,我們知道了flag儲存在flag表的flag字元裡,且長度為32,接下來直接跑就行了
2、用burp進行時間盲注
3、用sqlmap進行http頭的盲注
然後,要注意的是跑出來的結果要加在ctf{xxx}裡....被坑的很慘,跑出來flag一直提交不對,最後發現花括弧用的中文字元輸入的...
因缺思汀的繞過
http://ctf5.shiyanbar.com/web/pcat/index.php
查看網頁的源碼,發現登入的源碼路徑是source.txt
於是拿到源碼如下:
1 <?php 2 error_reporting(0); 3 4 if (!isset($_POST[‘uname‘]) || !isset($_POST[‘pwd‘])) { 5 echo ‘<form action="" method="post">‘."<br/>"; 6 echo ‘<input name="uname" type="text"/>‘."<br/>"; 7 echo ‘<input name="pwd" type="text"/>‘."<br/>"; 8 echo ‘<input type="submit" />‘."<br/>"; 9 echo ‘</form>‘."<br/>";10 echo ‘<!--source: source.txt-->‘."<br/>";11 die;12 }13 14 function AttackFilter($StrKey,$StrValue,$ArrReq){ 15 if (is_array($StrValue)){16 $StrValue=implode($StrValue);17 }18 if (preg_match("/".$ArrReq."/is",$StrValue)==1){ 19 print "姘村彲杞借垷錛屼害鍙禌鑹囷紒";20 exit();21 }22 }23 24 $filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";25 foreach($_POST as $key=>$value){ 26 AttackFilter($key,$value,$filter);27 }28 29 $con = mysql_connect("XXXXXX","XXXXXX","XXXXXX");30 if (!$con){31 die(‘Could not connect: ‘ . mysql_error());32 }33 $db="XXXXXX";34 mysql_select_db($db, $con);35 $sql="SELECT * FROM interest WHERE uname = ‘{$_POST[‘uname‘]}‘";36 $query = mysql_query($sql); 37 if (mysql_num_rows($query) == 1) { 38 $key = mysql_fetch_array($query);39 if($key[‘pwd‘] == $_POST[‘pwd‘]) {40 print "CTF{XXXXXX}";41 }else{42 print "浜﹀彲璧涜墖錛?";43 }44 }else{45 print "涓€棰楄禌鑹囷紒";46 }47 mysql_close($con);48 ?>
從源碼中可以知道這些全都被過濾了:and|select|from|where|union|join|sleep|benchmark|,|\(|\)
並且資料庫中只有一條資料
if (mysql_num_rows($query) == 1) {
最核心的部分是這裡
$sql="SELECT * FROM interest WHERE uname = ‘{$_POST[‘uname‘]}‘";
大致的執行過程是先將使用者輸入的uname作為查詢條件,在資料庫中查詢uname和pwd,然後將查詢到的pwd與使用者輸入的pwd進行比較,內容一致才輸出flag
這裡的思路是,利用group by pwd with rollup在查詢中的一個特點,他可以返回pwd所在的那一條記錄,通過limit控制返回哪一條,因此他不可以返回多條,一旦返回2條及以上,pwd就會為空白,但同一條記錄中的其他欄位則是正常的
那麼利用這一點令查詢結果為空白,我們輸入的pwd也為空白值,則構成了if(null == null)為true
簡單的sql注入之三
http://ctf5.shiyanbar.com/web/index_3.php
看源碼,是一個用get方式傳參數id的查詢,於是手工注入一波,發現單引號引起報錯,加上注釋後回顯正常,id在1~3的範圍都可以正常回顯“Hello!”,否則返回空,嘗試邏輯運算,可以正常返回,那這就很好辦了
然後,我就開始入了手注的坑...
首先來試試有幾個欄位
2報錯了,說明只查詢出一個欄位,那麼用union試試
沒有想要的結果回顯,很奇怪,看來這個Hello不是輸出的位置,應該是後台在擷取到id的值後,執行sql語句,如果存在查詢的結果,那麼就輸出Hello,但不輸出結果
如果是這樣的話,那麼只能從報錯回顯入手了,先試試雙注入
很尷尬,做了報錯處理?那試試xpath的報錯
還是不行...好吧,報錯這條路也被堵了,那就考慮盲注吧
,
根據上面頁面中的不同返回,我們可以寫一個bool型的盲註腳本來爆資料庫,當然也可以用burp搞定
這裡偷個懶,因為已經知道ctf的套路了,所以可以直接來猜表名和欄位
參考文獻:
http://www.jianshu.com/p/5d34b3722128
實驗吧web解題記錄