Java代码审计的技巧

2025-03-27 15 0

1. 反射魔法——绕过安全检查

// 案例:通过反射调用私有危险方法
try {
    Class<?> clazz = Class.forName("com.vuln.InternalService");
    Method method = clazz.getDeclaredMethod("deleteAllData");
    method.setAccessible(true);  // 关键点:强制开启访问权限
    method.invoke(null);        // 执行敏感操作
} catch (Exception e) {
    e.printStackTrace();
}

审计技巧

  • 搜索 setAccessible(true)调用点

  • 检查反射操作的目标类是否包含敏感方法(如 shutdowndelete等)

  • 结合调用栈分析(是否用户输入控制了反射的类/方法名)


2. 反序列化Gadget链构造

// 利用Apache Commons Collections链
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
Object obj = ois.readObject();  // 反序列化入口

// 攻击载荷构造(伪代码):
ChainedTransformer chain = new ChainedTransformer(transformers);
TransformedMap.decorate(map, null, chain);
...

审计技巧

  • 识别所有 readObject/readUnshared调用点

  • 使用工具检测危险依赖链:

# 使用GadgetInspector检测
java -jar gadget-inspector.jar --target lib/
  • 特别关注 InvokerTransformerTemplatesImpl等危险类


3. 注解绕过鉴权

// Spring Security错误配置案例
@PreAuthorize("hasRole('USER')")
public void viewProfile() { /* ... */ }

// 错误配置允许所有访问
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = false)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().permitAll(); // 致命错误
    }
}

审计技巧

  • 检查安全注解与实际配置是否一致

  • 搜索 @PreAuthorize@Secured等注解的空表达式

  • 验证 WebSecurityConfigurerAdapter是否错误开放权限


4. Lambda表达式注入

// 动态生成Lambda导致RCE
public interface Command {
    void execute(String cmd) throws Exception;
}

public static void main(String[] args) {
    String userInput = "java.lang.Runtime.getRuntime().exec('calc');";

    // 动态生成恶意Lambda
    Command cmd = (Command) LambdaMetafactory.metafactory(
        null, null, null, 
        (MethodType)MethodType.methodType(void.class, String.class),
        MethodHandles.lookup().findVirtual(Runtime.class, "exec", 
            MethodType.methodType(Process.class, String.class)),
        (MethodType)MethodType.methodType(void.class, String.class)
    ).getTarget().bindTo(Runtime.getRuntime()).invokeWithArguments(userInput);

    cmd.execute(""); // 触发命令执行
}

审计技巧

  • 查找 LambdaMetafactory使用点

  • 跟踪用户输入是否参与Lambda生成

  • 结合动态代理分析(ASM字节码操作)


5. 内部类逃逸攻击

// 案例:通过内部类暴露私有字段
public class BankAccount {
    private BigDecimal balance; // 本应是私有字段

    public class Auditor {
        public void checkBalance() {
            System.out.println(balance); // 内部类直接访问外部类私有字段
        }
    }
}

// 攻击者通过反射获取内部类
Class<?> innerClazz = Class.forName("com.vuln.BankAccount$Auditor");
Object auditor = innerClazz.getDeclaredConstructor(BankAccount.class)
                          .newInstance(account);
Method method =

4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

大模型安全警报:你的AI客服正在泄露客户银行卡号
HTB-Devvortex-WriteUp
WEB漏洞——越权
新型SectopRAT木马利用Cloudflare验证系统攻击Windows用户
医疗行业网络安全现状令人担忧
2025年全球网络安全支出预计增长12.2%

发布评论