文章总结: 本文探讨利用Base64解码差异绕过WAF的原理。测试发现PHP、Python及Shiro对非法字符处理宽松,存在WAF无法解码而后端可解码的差异,导致检测绕过。实测显示主流云WAF受影响。建议确保WAF与后端解析逻辑一致,防止此类边界规避。 综合评分: 89 文章分类: 渗透测试,Web安全,漏洞分析,安全工具
你的扫描器可以绕过防火墙么?(一)
原创
leveryd leveryd
leveryd
2021年6月7日 19:33
背景
看过从shiro-550漏洞品阿里云waf规则引擎文章的,应该知道阿里云是怎么防护shiro反序列化漏洞的利用,那么我们有办法绕过防护么?
先把上面的问题放一放,看看几个base64解码相关的case吧。
base64解码时,不同语言的接口实现有略微区别,目前知道有两种”边界情况”:
- 字符串中包含
. %等符号时,是选择忽略这些符号,还是报错 - 字符串中包含
=符号,解析到=时,是认为解析完成了,还是忽略”等号”继续解析
比如:Python base64解码时,会忽略”=”号后面的字符串
import binascii
binascii.a2b_base64(b'aGVsbG8=') # b'hello' (valid)
binascii.a2b_base64(b'aGVsbG8==') # b'hello' (ignoring data)
binascii.a2b_base64(b'aGVsbG8=python') # b'hello' (ignoring data)
PHP base64解码时,支持编码中有. % 等符号,会忽略这些符号
P.HNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
P%HNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
我也是从别人给Python提交的这个bug[1] 学到的一些姿势。
所以,我想研究以下问题:
-
哪些语言受影响?
-
会有什么影响?
-
什么时候会产生绕过?
-
哪些waf可以绕过?
哪些语言受影响?
-
测试思路
有两个两个测试目标:
1. 看看"不同语言 对 == 后面是否忽略"
2. 看看"不同语言 对 . 号是否忽略"
因此,对hellobase64编码并做点变形,得到下面三个测试paylaod
aGVsbG8=test
aGVs.bG8
aGVs.bG8=
另外额外测一下shiro中base64的解码
- 测试的语言、版本、解码接口如下
php(7.3.11): base64_decode
python(3.7): binascii.a2b_base64、base64.b64decode
openresty(1.19): ngx.base64.decode_base64url
java(jshell 14.0.1): Base64.getDecoder().decode
shiro(1.5.1): org.apache.shiro.codec.Base64.decode
-
测试结果
| payload | php | python | openresty | java | shiro | | — | — | — | — | — | — | |
aGVsbG8=test| hello-z� | hello | hello | 抛异常 | hello-z� | |aGVs.bG8| hello | 解码失败 | 解码失败 | 抛异常 | hel | |aGVs.bG8=| hello | hello | 解码失败 | 抛异常 | hello | |aGVsbG8=| hello | hello | hello | hello | hello | -
结论
-
php、python、openresty、shiro 都不同程度地受变形payload影响
会有什么影响?
-
什么时候适用这种绕过方式?
以下情况下会存在绕过:
1. waf不能解码,后端可以解码
2. waf解码后,只检测解码后的数据,不检测原始payload
第一种情况的例子:比如发送 PHN.jcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==,如果waf不能解码,就会放行。
第二种情况的例子:发送a=aGVsbG8=' union select 1 and ',有可能waf解码成 “hello”,认为没有危害,也会放行
第一种情况很常见,第二种情况目前还没有遇到案例。
-
哪些waf可以绕过?
只测试了我心中的”最强王者”(阿里云waf和长亭云waf),都存在第一种情况的绕过。
规范
-
规范中是怎么定义”base64解码时对非字母如何处理”?
rfc规范[2] 中说的是,”没有特殊情况下,遇到非字母就应该报错并拒绝继续解码”。
看官方文档[3] shiro 是根据另外一个邮件相关的规范[4]来做的base64编解码。
最后
所以,现在你清楚怎么绕过shiro漏洞的防护了么?
另外,如果读者有第二种情况绕过的案例,欢迎公众号后台私信我。
参考资料
[1]
这个bug: https://bugs.python.org/issue43086
[2]
rfc规范: https://datatracker.ietf.org/doc/html/rfc4648#section-3.3
[3]
官方文档: https://shiro.apache.org/static/1.3.0/apidocs/org/apache/shiro/codec/Base64.html
[4]
邮件相关的规范: https://www.ietf.org/rfc/rfc2045.txt
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:leveryd leveryd leveryd《你的扫描器可以绕过防火墙么?(一)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论