Struts2漏洞浅析之Ongl代码执行分析

admin 2021年4月3日19:26:17评论36 views字数 2107阅读7分1秒阅读模式

唐门三少 发表于 2012-12-9 13:38

0x01 简述

2010年7月exploitdb爆出的《Struts2/XWork

0x02 Ognl表达式实现代码执行

Ognl表达式是一种基于Java的功能强大的表达式。通过使用它,我们能够通过表达式存取Java对象树中的任意属性和调用Java对象树的方法,可以轻松解决在数据流转的过程中所碰到的各种问题。但是在实际使用中,编程人员更多使用的是Ognl的数据流转传输的功能,却忘记了Ognl表达式可以执行Java代码的功能。下面我们来通过一个常用的方法来看下它的实现过程。

public class Login extends ActionSupport{
    public String execute() {
        ActionContext AC = ActionContext.getContext();
        Map Parameters = (Map)AC.getParameters();
        String[] username = (String[])Parameters.get("username");
        System.out.println(AC.getValueStack().findValue(username[0]));
        return SUCCESS;
    }
}

上面这段代码是我自己搭建的一个Struts2实现的简单java web功能的action部分的代码,具体功能就是,获得用户提交的username参数,然后从值栈(Value Stack)中找到符合参数值的内容,并打印。红色字体部分的findValue方法是关键点,下面我将在这句代码中加上断点,来跟踪分析它的行为。

跟踪进入OgnlValueStack文件中的findValue(String expr)方法,关键代码如下:

Object value = ognlUtil.getValue(expr, context, root);

继续深入追踪进入OgnlUtil文件,看到如下代码:

public Object getValue(String name, Map context, Object root) throws OgnlException {
    return Ognl.getValue(compile(name), context, root);
}

红色部分为Ognl类自带的方法,其作用是根据表达式(参数1),在上下文(参数2)和指定类中(参数3)查找响应的内容,并返回,若没有则返回空。在查询的过程中,表达式会被执行,这使得攻击者有可乘之机,可以利用这个方法来执行一些恶意的行为。

0x03利用实现

还是使用之前部分构造的代码,搭建一个可以用于web交互的测试平台。通过传递名为username的参数来看下这个函数的威力。提交如下url:

http://target:8080/Login.action?username='#_memberAccess["allowStaticMethodAccess"]=true,@java.lang.Runtime@getRuntime().exec('calc'))'

在目标服务器中,弹出了计算器

我们所传递的内容被作为参数传递给了AC.getValueStack().findValue,之后它的内容便被执行了。解释下传入的语句作用,首先是给#_memberAccess["allowStaticMethodAccess"]变量赋予true值,这个变量是Xwork用于管理Ognl权限类中的成员,它控制Ognl是否可以执行Java的静态方法。第二句调用Java方法执行系统调用,“@”是Ognl调用Java静态方法的标识。

0x04总结

Ognl被用户Xwork和Struts框架的核心代码中,在这些框架中很多地方都存在findValue的调用,例如:Struts的校验框架,如果类型不匹配则默认也会调用findValue函数来检索用户输入的内容。2010年爆出的Struts2远程代码执行和其之后出现的代码执行问题,都和这个函数有关系。

findValue函数很像是PHP中的eval、assert函数,可以造成代码执行,但又是必须存在的函数。看Struts和Xwork修补它们漏洞的补丁也是,去对用户输入的内容进行过滤或检验。这方面的漏洞没有被大范围的发现和发掘,个人认为主要原因是因为,使用这些框架进行开发的源码大多是闭源的,外界很难获得,所以少有人去审计。但是,它的威胁性极其强大,本篇文章所涉及的不过是九牛一毛,相对于已经有完善审计方法的PHP,Java Web还算得上是尚未开发的处女地。

转自:https://www.t00ls.net/viewthread.php?tid=21166

文章来源于lcx.cc:Struts2漏洞浅析之Ongl代码执行分析

相关推荐: 【文章】信道 阈下信道 应用 杜绝阈下的签名

4.2 阈下信道     假设Alice和Bob被捕入狱。他将去男牢房,而她则进女牢房。看守Walter愿意让Alice和Bob交换消息,但他不允许他们加密。Walter认为他们可能会商讨一个逃跑计划,因此,他想能够阅读他们说的每个细节。     Walter…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年4月3日19:26:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Struts2漏洞浅析之Ongl代码执行分析https://cn-sec.com/archives/322482.html

发表评论

匿名网友 填写信息