BUUCTF-Web-[SUCTF 2019]EasySQL
打开题目环境,界面如下:
结合题目名称,考虑到应该是sql注入,可以使用fuzz字典来跑一下,字典跑后发现有三种结果
第一种,没有任何回显
第二种,回显nonono,是被过滤的关键字
第三种,返回了数据
查看大佬的sql注入葵花宝典
发现可能是堆叠注入
查看数据库
1;show databases;
结果如下:
Array ( [0] => 1 ) Array ( [0] => ctf ) Array ( [0] => ctftraining ) Array ( [0] => information_schema ) Array ( [0] => mysql ) Array ( [0] => performance_schema ) Array ( [0] => test )
查看数据表
1;show tables;
结果如下:
Array ( [0] => 1 ) Array ( [0] => Flag )
猜测flag是在flag表中的flag字段中
1;select flag from flag;
发现flag也被过滤了。
别人的wp:
这道题目需要我们去对后端语句进行猜测,有点矛盾的地方在于其描述的功能和实际的功能似乎并不相符,通过输入非零数字得到的回显1和输入其余字符得不到回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用,猜测后端语句为:
select $post['query']||flag from Flag
- 官方给的 payload 是
1;set sql_mode=PIPES_AS_CONCAT;select 1
- 拼接一下就是
select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
- 关于
sql_mode
: 它定义了 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的PIPES_AS_CONCAT
将||
视为字符串的连接操作符而非 “或” 运算符 - 关于
sql_mode
更多可以查看这个链接 : MySQL sql_mode 说明 - 还有就是这个模式下进行查询的时候,使用字母连接会报错,使用数字连接才会查询出数据,因为这个
||
相当于是将select 1
和select flag from flag
的结果拼接在一起
方法2:
非预期
*,1,构造成select *,1 || flag from flag
内置的sql语句为sql=”select”.sql=”select”.post[‘query’].”||flag from Flag”;
如果$post[‘query’]的数据为,1,sql语句就变成了select ,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容