做一些简单的测试,输入数字发现有回显,输入字母符号却没有。
尝试执行注入语句,出现Nonono.猜测有注入点,查询列,无回显,联合注入也无需尝试
不用没关系,咱了解了解
联合注入:(给我戳它)
MySQL数据库联合查询与连接查询 - Prinlily - 博客园 (cnblogs.com)https://www.cnblogs.com/Prinlily/p/10030157.html
尝试堆叠注入,查询数据没有回显,查询表名,回显
直接访问flag,没用,尝试布尔盲注
布尔盲注:(挺有意思的)
https://cloud.tencent.com/developer/article/1632161(想详细了解的,去看看这位大佬的博客吧)
回显漏漏漏,说明Flag被过滤了
输入1有回显,但0没有,说明只有非零数字才可
查看源码猜测后端语句 有||操作符,当我们输入非零数字,才可满足||的逻辑为真进而回显。
但要查找flag,后端又有“或”逻辑存在,我们需要将||视作字符串连接符,相当于CONCAT() 函数。因此需要借用sql_mode=PIPES_AS_CONCAT转换操作符,起到连接符的作用。
构造payload:select 输入数据|| flag from Flag(select语句用于从数据库中选取数据,返回的数据会储存在结果表中。)
select $post['query']||flag from Flag(猜测后端语句)
1;set sql_mode=PIPES_AS_CONCAT;select 1(payload)
select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag(拼接后)
select 1 from Flag和select flag from Flag(同上)
非预期解:
当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数,就按默认没有配置来进行,此时||就是逻辑或。
command1;command2顺序执行
command1 || command2
如果command1执行失败,则执行command2
command1 && command2
如果command1执行成功,则执行command2在MySQL中,操作符||表示“或”逻辑:
command1 || command2
c1和c2其中一侧为1则取1,否则取0mssql中||表示连接操作符,不表示或的逻辑。
因此需要将$_POST[‘query’]提交的数据换成*,1
解释:
sql=select.post[‘query’]."||flag from Flag";(拼接语句),如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,相当于select *,1 from Flag(select *和select 所有列的意义相同),这样就直接查询出了Flag表中的所有内容。(1||flag是个短路算法,直接输出1)此处的1是临时增加一列,列名为1且这一列的所有值都为1
执行payload:*,1