[suctf 2019]EasySQL
[suctf 2019]EasySQL
根据题目,应该要 sql 注入,先判断过滤了哪些东西
随便输个 1 ,Burpsuite 抓请求包发到 Intruder 模块,在要爆破的地方做记号
跑字典,速度放慢点防止 429 报错
Length 为 503 是什么也没回显
Length 为 510 回显 Nonono ,很显然是被过滤了
Length 为 512 回显 Too long
除此之外的 Length 为正常回显,由此可以看出:输入数字回显数字、输入字符无回显、sql语句大部分被过滤( ; 和 select 未被过滤)
我这个字典在这题不是很适合,主要是演示一下思路
所以联合注入和盲注等是不太可能,因为 ; 未被过滤,尝试堆叠注入
1;show databases;
回显出数据库的信息,存在堆叠注入
1;show tables;
回显出表的信息
由于 from 和 flag 都被过滤了,查询 flag 肯定不行,这时候要猜测后端的查询语句
由于:POST 提交 query 参数、只有一个 Flag 表、输入数字回显相同数字、输入字符无回显(因为 Flag 表没有这个字段所以没有回显)
初步猜测后端的代码可能是select $_POST['query'] from Flag;
但是这样的话由于 from 和 flag 都被过滤,题目就无解
所以后端的代码应该是select $_POST['query']||flag from Flag;
(其他大佬猜出来的,我没猜出来😰)
$_POST[‘query’]||flag :逻辑或运算,如果左边的是数字(真),数字||flag 的结果就是那个数字
相关实验:
解法一:
payload:*,1
后端代码:select *,1||flag from Flag;
既查询 * ( flag 表的所有数据),也查询 1||flag
相关实验:
解法二:
set sql_mode=PIPES_AS_CONCAT;
可以将 || 逻辑或的功能改成连接字符的功能,类似 concat
payload:1;set sql_mode=PIPES_AS_CONCAT;select 1
后端代码:select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag;
先查询1;再将 || 的功能改成连接功能;再查询 1||flag ,即把查询 1 的结果和查询 flag 的结果拼接起来,所以输出的是 1和1NSSCTF{xxxxxxxx}
相关实验:
欲将心事付瑶琴。知音少,弦断有谁听?