SQL堆叠注入
这个就不再写原理了,之前也遇到很多了,就是一个sql语句";"后面可以继续执行sql查询语句。
试一下堆叠注入查询数据库
1;show databases;
查询表名
1;show tables;
按着思路往下走查字段的时候就不行了
1;show columns from Flag;
山穷水尽,百度wp,发现大佬居然可以从报错中猜出查询语句是:
select $_GET['query'] || flag from Flag
这里的"||"是啥意思,查了一下mysql中表示或,如果前一个操作数为真,则不看后面的语句
然后构造payload
*,1
这啥意思,我来解释一下
sql=select.post['query']."||flag from Flag";
如果$post['query']的数据为*,1,sql语句就变成了select *,1||flag from Flag,
就是select *,1 from Flag,执行这条查询语句会将表中的所有数据查询出来并且在后面增加一列列名和内容都是1的列,如下:
后端是只有一个Flag表,表里只有一个字段flag,也只有一行数据,所以显示的结果就应该是下面这样:
另外一种解法
思想是把"||"变成字符串连接符,而不是或。
这里就涉及到修改mysql中sql_mode参数设置,设置 sql_mode=pipes_as_concat字符就可以了。
在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接。
但在mysql 缺省不支持。需要调整mysql 的sql_mode
模式:pipes_as_concat 来实现oracle 的一些功能。
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参数后,此时的 || 已经是链接符的意思了,这个语句会把表中所有的数据查询出来并且在后面加一行数据列明为 1|| flag 的数据,重点都在select 1 这,如下:
没修改参数前:拿本地环境举例,select 1|| flag from Flag
更改参数后:
会将表中的password字段内容带出来,列名是1||password;
这题就学到了 MySQL修改sql_mode=pipes_as_concat的用法和适用场景和oracle与MySQL " || " 符号的区别,至于猜测后端代码还是需要经验的累积。
大佬时时刻刻提醒我是个菜鸡。