记MSSQl绕过阿里云

1
2
最近一直在学习关于WAF绕过的知识,本次选择阿里云这款云WAF来测试关于MSSQL注入的绕过。因为阿里云主站可能不
是ASP+IIS的环境,所以我不清楚如果真的是ASP+IIS的环境,阿里云的拦截规则是否会有相应的变化。

绕过过程

逻辑判断语句绕过

我们知道在检测一个注入点的时候,首先会加上and 1=1之类的判断语句,如果页面返回的逻辑符合我们设想的逻辑,那么就有可能有注入。

利用%特性绕过

在iis+asp的环境中,在关键字中间加%不会影响程序的正常执行,因此可以在关键字and中添加%来绕过阿里云的检测。

image-20200726131616934

利用unicode编码绕过

在ASP+IIS环境中,有某些特性的字符可能会有多个unicode编码,因此可以通过对关键字进行unicode编码进行绕过,比如字符A有多个unicode编码,使用%u0061,%u0041等可能无法绕过,但是使用%u00AA则可以绕过。

image-20200726132202139

参数污染

同样,我们也可以使用参数污染来绕过阿里云的检测,可能阿里云这种云WAF在设计上没有考虑到容器特性导致的绕过,只是适配于大多数网站的一般防护。

image-20200726132416572

绕过order by拦截

阿里云对order by的拦截比较奇怪,如果order by后面跟的是个字符,则不会拦截,跟的是数字就会拦截,因此我们可以这样构造,order by “a”,1

image-20200726133941676

上面是针对阿里云拦截的通用绕过方法,我们也可以结合asp的特性来进行绕过,比如%,参数污染等等

image-20200726134347117

image-20200726134426821

换行+注释,这里阿里云是这样的

1
2
--%0a 不拦截,这个是mssql的注释+换行
--+%0a 拦截,mysql注释+换行

这就可以说明阿里云这款云WAF的主要拦截规则是为mysql设计的,至少在edu.aliyun.com这个站是这样的,至于其他的网站,我没有找到用阿里云的asp的站,所以没有测试。

image-20200726134723900

联合注入绕过

在ASP+IIS的环境中,%11等也可以代替空白字符,这个阿里云也没有考虑到,因此也可以达到绕过的目的。

image-20200726135438964

至于union和select之后的其他字符,并不会被拦截

image-20200726135841710

假如现在要通过union注入获取数据,比如version,数据库等等,我们看下怎么绕过。

获取版本信息

比如获取version,直接使用version关键字是不拦的,只有使用@@version时才会拦截。而且单独的@@version也是会被阿里云拦截的

image-20200726140854413

所以这里要绕过的话,就是要想办法破坏@@version这个关键字,方法也挺多的。

image-20200726140950076

image-20200726141003116

image-20200726141022204

image-20200726141048780

获取数据库

使用db_name()获取数据库,这个直接没有拦截,没什么好说的

image-20200726141206749

获取其他的数据库,源语句如下:

1
union select null,null,null,name from master..sysdatabases where name not in('master')

前面union select的绕过方法不变,这里我测试过程中发现当我使用master..sysdatabases会被阿里云拦截。

image-20200726141611877

但是master..sysdatabases单独出现并不会被拦截,因此绕过的思路有两种,第一种是破坏master..sysdatabases出现的上下文环境,另一种就是就是对这个关键字自身做一些操作。

方法一:参数污染

使用这种方式进行处理,就是破坏这个关键字出现的上下问环境

image-20200726142000412

方法二:破坏关键字本身

这里阿里云是将master..sysdatabases整体当作一个拦截规则进行拦截的,因此我们可以破坏这个关键字本身来达到绕过的目的。

注释+换行,在.中间加上注释和换行不会影响程序的正常解析,但是却可以绕过阿里云

image-20200726142708993

image-20200726142729333

当然,我们也可以使用unicode编码

image-20200726142856285

获取表名

这个阿里云不拦截,因此没什么好说的

1
union--xxxx%0aselect null,null,null,name from 数据库名..sysobjects  where xtype='U'

image-20200726143029949

获取列名

1
2
union--xxxx%0aselect null,null,null,name from%11sysobjects  where id=(select id 
from sysobjects WHERE name = '表名')

这里阿里云拦截了select id from这部分,但是单独的select id from是不会拦截的,所以我们要把这个语句放在上下问环境下来测试绕过。首先我发现select xxx也是会被拦截的,我在select中假如了%达到了此处的绕过。

image-20200726144229258

后面的部分也就不会拦截了,所以绕过语句如下

1
union--xxxx%0aselect null,null,null,name from%11sysobjects where id=(sele%ct id from sysobjects where name='x')

image-20200726145119306

获取数据

这个没啥说的,本身就可以直接绕过

1
union--xxxx%0aselect null,null,null,name from%11数据库..表名

image-20200726145308997

命令执行绕过

很多时候我们拿到MSSQL的注入,可能是直接执行命令而不是出数据,对吧?

首先是不是要判断能不能执行多语句,我最常用的是waitfor delay ’00:00:05‘这样的语句来判断是否支持多语句,所以我们首先看下怎么使用这个语句绕过阿里云。

这里讲一下,我在对WAF进行绕过测试的思路。

1
2
3
4
首先,我要判断出这个WAF的拦截规则,比如waitfor delay ’00:00:05‘,这个直接会被阿里云拦的,所以我要
判断是那部分被阿里云拦了。这里的绕过测试其实和免杀的方法类似,就是特征码定位,比如,我删除了delay后面的
部分,还是会被拦,因此'00:00:05'并不是WAF拦截的部分,我再删除了delay发现不烂了,因此,可能拦截的就
是waitfor delay这个关键字。

绕过一:unicode编码

通过之前的测试,我们知道关键字a的unicode编码是没有被阿里云拦截的,因此我们可以通过unicode编码绕过。

image-20200726150126019

绕过二:空白字符

image-20200726150214566

绕过三:注释+换行

image-20200726150252014

然后假如我们要调用xp_cmdshell执行命令,该怎么绕过。

1
exec master..xp_cmdshell 'whoami'

这里我经过测试,发现当exec和 master..xp_cmdshell一起出现时,则会被拦截,因此绕过一方面时破坏exec和master..xp_cmdshell中间的内容,还有就是master..xpcmdshell本身。可能是这个比较重要,我这里发现,当

exec 和xp_cmdshell同时出现,不管中间是什么字符,都会被拦截。

image-20200726150806727

绕过一:参数污染

image-20200726150914069

绕过二:%

image-20200726150953254

绕过三:unicode编码

我这里找了个e的unicode编码进行绕过

image-20200726151055989

总结

​ 其实这些方法在几年前都有很多大佬总结过,我也不过是按照他们提供的思路进行尝试,这里会发现云WAF的一个问题,就是他们针对于mysql拦截的比较全面,但是对于其他的数据库,可能没有那么全面。还有一些针对于容器的绕过方法,比如参数污染,%,甚至在aspx中还有%00特性也没有考虑到,当然,这个也有可能是因为我测试的这个站不是用的ASP+IIS的环境,才能让我顺利绕过。总之,WAF也是人写的,并没有那么可怕。