0x01 环境搭建
参考一下文章
文章环境配置:
Tomcat 8.5.56
Java 1.8
0x02 搭建中的问题
IDEA启动配置问题
Tomcat 参数
Configurations-Server-VM options:
-Dlog4j.debug
-Dfile.encoding=UTF-8
-noverify
-Xbootclasspath/p:Agent.jar(后续检测的代理jar包)
-javaagent:Agent.jar(后续检测的代理jar包)
Configurations-Deployment:
注意war包和Application context
依赖版本问题:
参考的文章2019,时间久远,有部分依赖已经升级
<dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>9.7.1</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-commons</artifactId> <version>9.7.1</version> </dependency>
同时,修改文章中的TestClassVistor
import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.commons.AdviceAdapter; public class TestClassVisitor extends ClassVisitor implements Opcodes { public TestClassVisitor(ClassVisitor cv) { super(Opcodes.ASM5, cv); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); if ("start".equals(name) && "()Ljava/lang/Process;".equals(desc)) { System.out.println(name + "方法的描述符是:" + desc); return new AdviceAdapter(Opcodes.ASM5, mv, access, name, desc) { @Override public void visitCode() { // 这里使用 AdviceAdapter 自身的方法来操作字节码,避免直接使用 mv this.visitVarInsn(ALOAD, 0); this.visitFieldInsn(GETFIELD, "java/lang/ProcessBuilder", "command", "Ljava/util/List;"); this.visitMethodInsn(INVOKESTATIC, "cn/org/javaweb/agent/ProcessBuilderHook", "start", "(Ljava/util/List;)Z", false); Label l1 = new Label(); this.visitLabel(l1); super.visitCode(); } }; } return mv; } }
0x03 项目结构
整个项目分为2个部分,agent和Web。
agent 后续计划是用于检测攻击,修改字节码等操作。
Web搭建一些CVE漏洞的靶场,目前已经加入了log4j2。
Web中目前不计划加入的:
XSS、SQL,
原因:
1、通过检测是否调用JDBC类或者其他数据库相关类,来阻断SQL注入,不现实;
2、如果是通过正则去判断,不如使用WAF;
3、个人认为RASP不能作为唯一的防护手段:a.Rasp做不了抗D,b.目前通过正则等方式拦截SQL、信息泄露误报率较高,且数量较多,从修改策略、服务器负载等方面来看waf更容易,c.如果防护设备出现问题,waf的部署调整更容易。
├─agent │ ├─src │ │ ├─main │ │ │ ├─java │ │ │ │ └─cn │ │ │ │ └─JavaStudy │ │ │ │ └─Rasp │ │ │ │ └─agent │ │ │ └─resources │ │ │ └─META-INF │ │ └─test │ │ └─java │ └─target │ ├─classes │ │ ├─cn │ │ │ └─JavaStudy │ │ │ └─Rasp │ │ │ └─agent │ │ └─META-INF │ ├─generated-sources │ │ └─annotations │ ├─generated-test-sources │ │ └─test-annotations │ ├─maven-archiver │ ├─maven-status │ │ └─maven-compiler-plugin │ │ ├─compile │ │ │ └─default-compile │ │ └─testCompile │ │ └─default-testCompile │ └─test-classes └─Web ├─src │ ├─main │ │ ├─java │ │ │ └─Cve │ │ │ └─Log4j2 │ │ ├─resources │ │ └─webapp │ │ └─WEB-INF │ └─test │ └─java └─target ├─archive-tmp ├─classes │ └─Cve │ └─Log4j2 ├─generated-sources │ └─annotations ├─maven-archiver ├─maven-status │ └─maven-compiler-plugin │ ├─compile │ │ └─default-compile │ └─testCompile │ └─default-testCompile └─web ├─META-INF └─WEB-INF ├─classes │ └─Cve │ └─Log4j2 └─lib