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)
调用点 -
检查反射操作的目标类是否包含敏感方法(如
shutdown
、delete
等) -
结合调用栈分析(是否用户输入控制了反射的类/方法名)
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/
-
特别关注
InvokerTransformer
、TemplatesImpl
等危险类
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(#换成@)