打开题目,只有一个输入框,照例尝试一下注入点,发现输入纯数字时只有一个回显:
输入字符时的则没有回显,输入万能密码、尝试order by时回显是nonono,尝试堆叠注入:
1;show databases;
发现可以,然后来查表:
1;show tables;
得到了表名:
然后再进行接下来的步骤是发现都不行。
在网上查看WP,说有大佬根据回显猜出了源码:(膜拜ing)
select $_POST[‘query’] || flag from Flag
|| 具体语法规则为:
当两个操作数都为非 NULL 值时,如果有任意一个操作数为非零值,则返回值为 1,否则结果为 0;
当有一个操作数为NULL 时,如果另一个操作数为非零值,则返回值为 1,否则结果为NULL;
假如两个操作数均为 NULL 时,则返回值为 NULL。
这也是为什么在输入框中输入任何数字都会返回1,因为他进行了运算。
而你在输入框中输入任何非数字,都不会有反应。因为报错了。
根据这个有两种解法:
第一种:
*,1
语句就成了 :select *,1||flag from Flag
等同于select *,1 from Flag
(这个好像是一个sql语法,1就是向flag表中又加了一名为1,值全为1的列)
第二种:
1;set sql_mode=PIPES_AS_CONCAT;select 1
拼接一下就是select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
第二句语句 : 定义 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的PIPES_AS_CONCAT将 ||视为字符串的连接操作符而非 “或” 运算符
关于 sql_mode 更多可以查看这个链接 : https://www.cnblogs.com/piperck/p/9835695.html
(若作者介意请联系删除!!!)
我本身对SQL注入的知识有很大的欠缺,再加上SQL语句我也忘得差不多了,对于这道题我并不是很懂,只是有一个大概的,模糊的概念,尤其是第二种解法,若有大佬愿意指点,请在评论区留言,感激不尽!