[SUCTF 2019]Easy SQL
日常and or
一圈测试之后发现,and or && from都过滤了,很奇怪 || 这个没有过滤。
接着尝试,试试堆叠注入。
可以,接着看表
发现flag
尝试desc
经测试,Flag被过滤了。
想过之前碰到一个预处理的,尝试之后发现限制了输入长度。
concat char 都不行,prepare被过滤
突然想到and or &&都被过滤了,唯独留了 ||,可能有什么猫腻
查了一下mysql ||这个符号。
结果发现oracle || 还有连接的作用
但这里是或
所以尝试一下有没有办法能把 || 改成oracle那样的连接符
然后就没有然后了,不会了,看了wp,发现还有个sql_mode这个东西
关于sql_mode : 它定义了 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的PIPES_AS_CONCAT将 || 视为字符串的连接操作符而非 “或” 运算符。
具体说明:https://www.cnblogs.com/piperck/p/9835695.html
还有就是这个模式下进行查询的时候,使用字母连接会报错,使用数字连接才会查询出数据,因为这个 | | 相当于是将 select 1
和 select flag from flag
的结果拼接在一起。
看了关键的查询代码是 :
select $post['query']||flag from Flag
官方给的 payload 是
1;set sql_mode=PIPES_AS_CONCAT;select 1
拼接一下就是
select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
关于 *,1
拼接一下就是
select *,1||flag from Flag
select *,1 from Flag
可以,脑洞清奇,记下来了。