博客
关于我
S2-005 远程代码执行漏洞检测与利用
阅读量:172 次
发布时间:2019-02-28

本文共 1676 字,大约阅读时间需要 5 分钟。

漏洞信息

漏洞成因官方概述:XWork ParameterInterceptors bypass allows remote command execution


漏洞影响:


漏洞分析:

S2-005是由于官方在修补S2-003不全面导致绕过补丁造成的。我们都知道访问Ognl的上下文对象必须要使用#符号,S2-003对#号进行过滤,但是没有考虑到Unicode编码情况,导致\u0023或者8进制\43绕过。

S2-005则是绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成漏洞。


Payload如下:

http://www.xxxx.com/aaa.action?('\u0023_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('\u0023context['xwork.MethodAccessor.denyMethodExecution']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1

将编码转换为以下三个步骤:

  • ?('#_memberAccess['allowStaticMethodAccess']')(meh)=true
  • &(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))
  • &(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1

  • 第一步通过设置_memberAccess变量中的allowStaticMethod为true,通过括号遵循Ognl语法树规则。第一步完成后,就可以执行静态方法了。

    第二步将上下文中的xwork.MethodAccessor.denyMethodExecution设置为false,允许方法执行。

    第三步是真正的攻击代码,通过调用Runtime类的静态方法获取Runtime对象并执行关闭服务器的代码。


    深入分析:

    为什么提交这个攻击URL就能使服务器down掉?仅仅看这三句不要以为就懂了,要理解其中的奥妙,必须要阅读源码。

    服务器接收到请求后会读取web.xml文件,里面有个过滤器叫StrutsPrepareAndExecuteFilter。然后这个过滤器执行完之后,就可以执行我们的Action了。

    StrutsPrepareAndExecuteFilter执行完之后,会执行Struts2默认拦截器栈defaultStack。拦截器栈的结构如下:

  • params拦截器:处理URL中的参数,将参数作为键值对加入值栈。
  • Ognl拦截器:处理Ognl表达式。
  • params拦截器中的doIntecept()方法会将请求中的参数作为键值对加入值栈。Ognl解析引擎会按照规定的语法规则解析字符串并执行Ognl表达式。


    Ognl的解析:

    为什么\u0023形式的POC能够被解析?

    OgnlUtil.setValue方法会将\u0023转换为#,从而绕过了过滤。

    Ognl解析引擎会调用Ognl.parseExpression方法解析字符串,返回语法树。parseExpression方法会调用OgnlParser.topLevelExpression(),开始解析语法树。

    OgnlParser会读取字符,处理Unicode转义,解析表达式。


    漏洞检测与利用:

  • 检测:使用工具进行自动化扫描,寻找类似参数。
  • 命令执行:通过构造特定URL,验证漏洞是否存在。

  • 工具下载地址:请通过合法渠道获取。


    参考链接:(此处不提供具体链接)

    转载地址:http://krgc.baihongyu.com/

    你可能感兴趣的文章
    Mysql学习总结(70)——MySQL 优化实施方案
    查看>>
    Mysql学习总结(71)——MySQL 重复记录查询与删除总结
    查看>>
    Mysql学习总结(71)——数据库介绍(MySQL安装 体系结构、基本管理)再回顾
    查看>>
    Mysql学习总结(72)——MySQL 开发者开发,设计规范再总结
    查看>>
    Mysql学习总结(73)——MySQL 查询A表存在B表不存在的数据SQL总结
    查看>>
    Mysql学习总结(74)——慢SQL!压垮团队的最后一根稻草!
    查看>>
    Mysql学习总结(75)——并发量大、数据量大的互联网业务数据库设计军规
    查看>>
    Mysql学习总结(76)——MySQL执行计划(explain)结果含义总结
    查看>>
    Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
    查看>>
    Mysql学习总结(78)——MySQL各版本差异整理
    查看>>
    Mysql学习总结(79)——MySQL常用函数总结
    查看>>
    Mysql学习总结(7)——MySql索引原理与使用大全
    查看>>
    Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
    查看>>
    Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
    查看>>
    Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
    查看>>
    Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
    查看>>
    Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
    查看>>
    Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
    查看>>
    Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
    查看>>
    Mysql学习总结(9)——MySql视图原理讲解与使用大全
    查看>>