长话短说,我们用2024长城杯的一道AWD赛题中的漏洞修复来演示,首先我们先看一下这道题,首先将jar包进行反编译,在配置文件pom.xml中发现了shiro的特征,并且在lib中发现了shiro相关的jar包
上工具进行爆破key和利用链,发现不成功,但是在源码中的shiro配置文件中,我们还是发现了shiro的key
通过工具验证可以发现key正确,并且成功发现了利用链
并且继续审计源码,发现TestController存在后门,可任意命令执行
1
| payload:test/backd0or?cmd=whoami
|
接下来开始修复,首先先将jar包进行解压
随后创建文件夹,并且复制class相关文件到目录中
使用下面的脚本,将class转换成java文件,如果能看到.java说明成功反编译了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
CFR_JAR="cfr-0.152.jar"
CLASS_ROOT="src/main/java"
find $CLASS_ROOT -name "*.class" | while read class_file; do class_dir=$(dirname "$class_file") class_name=$(basename "$class_file" .class) echo $class_name ~/java/jdk1.8.0_181/bin/java -jar $CFR_JAR "$class_file" > "$class_dir/$class_name.java" done
|
将shiro配置文件中的key值进行修改
修改完成之后进行打包
1 2
| CLASS_LIB=$(find example/BOOT-INF/lib/ -name "*.jar" | tr '\n' ':'); javac -cp ".:${CLASS_LIB%:}" src/main/java/com/example/doctoolkit/shiro/ShiroConfig.java
|
但是发现了四个错误,通过报错提示可以看到,需要将这几个java文件一起进行编译
1
| javac -cp ".:${CLASS_LIB%:}" src/main/java/com/example/doctoolkit/shiro/ShiroConfig.java src/main/java/com/example/doctoolkit/shiro/UserRealm.java src/main/java/com/example/doctoolkit/controller/admin/AdminController.java
|
此时class文件已经产生,我们需要进行重新打包,在此之前,首先需要替换原来的class文件
替换结束之后重新打包,解压每一个嵌套的JAR文件到单独的目录中
再重新打包嵌套的JAR文件
最后,重新打包主jar文件
1
| jar -cvfM0 ../example_repacked.jar -C . .
|
运行jar文件,重启服务测试,可以发现原来的key已经失效