1 | 最近一直在学习关于WAF绕过的知识,本次选择阿里云这款云WAF来测试关于MSSQL注入的绕过。因为阿里云主站可能不 |
绕过过程
逻辑判断语句绕过
我们知道在检测一个注入点的时候,首先会加上and 1=1之类的判断语句,如果页面返回的逻辑符合我们设想的逻辑,那么就有可能有注入。
利用%特性绕过
在iis+asp的环境中,在关键字中间加%不会影响程序的正常执行,因此可以在关键字and中添加%来绕过阿里云的检测。
利用unicode编码绕过
在ASP+IIS环境中,有某些特性的字符可能会有多个unicode编码,因此可以通过对关键字进行unicode编码进行绕过,比如字符A有多个unicode编码,使用%u0061,%u0041等可能无法绕过,但是使用%u00AA则可以绕过。
参数污染
同样,我们也可以使用参数污染来绕过阿里云的检测,可能阿里云这种云WAF在设计上没有考虑到容器特性导致的绕过,只是适配于大多数网站的一般防护。
绕过order by拦截
阿里云对order by的拦截比较奇怪,如果order by后面跟的是个字符,则不会拦截,跟的是数字就会拦截,因此我们可以这样构造,order by “a”,1
上面是针对阿里云拦截的通用绕过方法,我们也可以结合asp的特性来进行绕过,比如%,参数污染等等
换行+注释,这里阿里云是这样的
1 | --%0a 不拦截,这个是mssql的注释+换行 |
这就可以说明阿里云这款云WAF的主要拦截规则是为mysql设计的,至少在edu.aliyun.com这个站是这样的,至于其他的网站,我没有找到用阿里云的asp的站,所以没有测试。
联合注入绕过
在ASP+IIS的环境中,%11等也可以代替空白字符,这个阿里云也没有考虑到,因此也可以达到绕过的目的。
至于union和select之后的其他字符,并不会被拦截
假如现在要通过union注入获取数据,比如version,数据库等等,我们看下怎么绕过。
获取版本信息
比如获取version,直接使用version关键字是不拦的,只有使用@@version时才会拦截。而且单独的@@version也是会被阿里云拦截的
所以这里要绕过的话,就是要想办法破坏@@version这个关键字,方法也挺多的。
获取数据库
使用db_name()获取数据库,这个直接没有拦截,没什么好说的
获取其他的数据库,源语句如下:
1 | union select null,null,null,name from master..sysdatabases where name not in('master') |
前面union select的绕过方法不变,这里我测试过程中发现当我使用master..sysdatabases会被阿里云拦截。
但是master..sysdatabases单独出现并不会被拦截,因此绕过的思路有两种,第一种是破坏master..sysdatabases出现的上下文环境,另一种就是就是对这个关键字自身做一些操作。
方法一:参数污染
使用这种方式进行处理,就是破坏这个关键字出现的上下问环境
方法二:破坏关键字本身
这里阿里云是将master..sysdatabases整体当作一个拦截规则进行拦截的,因此我们可以破坏这个关键字本身来达到绕过的目的。
注释+换行,在.中间加上注释和换行不会影响程序的正常解析,但是却可以绕过阿里云
当然,我们也可以使用unicode编码
获取表名
这个阿里云不拦截,因此没什么好说的
1 | union--xxxx%0aselect null,null,null,name from 数据库名..sysobjects where xtype='U' |
获取列名
1 | union--xxxx%0aselect null,null,null,name from%11sysobjects where id=(select id |
这里阿里云拦截了select id from这部分,但是单独的select id from是不会拦截的,所以我们要把这个语句放在上下问环境下来测试绕过。首先我发现select xxx也是会被拦截的,我在select中假如了%达到了此处的绕过。
后面的部分也就不会拦截了,所以绕过语句如下
1 | union--xxxx%0aselect null,null,null,name from%11sysobjects where id=(sele%ct id from sysobjects where name='x') |
获取数据
这个没啥说的,本身就可以直接绕过
1 | union--xxxx%0aselect null,null,null,name from%11数据库..表名 |
命令执行绕过
很多时候我们拿到MSSQL的注入,可能是直接执行命令而不是出数据,对吧?
首先是不是要判断能不能执行多语句,我最常用的是waitfor delay ’00:00:05‘这样的语句来判断是否支持多语句,所以我们首先看下怎么使用这个语句绕过阿里云。
这里讲一下,我在对WAF进行绕过测试的思路。
1 | 首先,我要判断出这个WAF的拦截规则,比如waitfor delay ’00:00:05‘,这个直接会被阿里云拦的,所以我要 |
绕过一:unicode编码
通过之前的测试,我们知道关键字a的unicode编码是没有被阿里云拦截的,因此我们可以通过unicode编码绕过。
绕过二:空白字符
绕过三:注释+换行
然后假如我们要调用xp_cmdshell执行命令,该怎么绕过。
1 | exec master..xp_cmdshell 'whoami' |
这里我经过测试,发现当exec和 master..xp_cmdshell一起出现时,则会被拦截,因此绕过一方面时破坏exec和master..xp_cmdshell中间的内容,还有就是master..xpcmdshell本身。可能是这个比较重要,我这里发现,当
exec 和xp_cmdshell同时出现,不管中间是什么字符,都会被拦截。
绕过一:参数污染
绕过二:%
绕过三:unicode编码
我这里找了个e的unicode编码进行绕过
总结
其实这些方法在几年前都有很多大佬总结过,我也不过是按照他们提供的思路进行尝试,这里会发现云WAF的一个问题,就是他们针对于mysql拦截的比较全面,但是对于其他的数据库,可能没有那么全面。还有一些针对于容器的绕过方法,比如参数污染,%,甚至在aspx中还有%00特性也没有考虑到,当然,这个也有可能是因为我测试的这个站不是用的ASP+IIS的环境,才能让我顺利绕过。总之,WAF也是人写的,并没有那么可怕。