作者:leveryd
本文为作者投稿,Seebug Paper 期待你的分享,凡经采用即有礼品相送!
投稿邮箱:[email protected]
看过从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. 看看"不同语言 对 == 后面是否忽略" 2. 看看"不同语言 对 . 号是否忽略"
因此,对hello
base64编码并做点变形,得到下面三个测试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),都存在第一种情况的绕过。
rfc规范 中说的是,"没有特殊情况下,遇到非字母就应该报错并拒绝继续解码"。
看官方文档 shiro 是根据另外一个邮件相关的规范来做的base64编解码。
所以,现在你清楚怎么绕过shiro漏洞的防护了么?
另外,如果读者有第二种情况绕过的案例,欢迎公众号后台私信我。
本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1600/