Struts2 S2-029远程代码执行漏洞初探

2016-03-18 550733人围观 ,发现 19 个不明物体 WEB安全漏洞

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

Image

0×01 Struts2标签库

Struts2的标签库使用OGNL表达式来访问ActionContext中的对象数据。为了能够访问到ActionContext中的变量,Struts2将ActionContext设置为OGNL的上下文,并将OGNL的跟对象加入ActionContext中。

在Struts2中,如下的标签就调用了OGNL进行取值。

<p>parameters: <s:property value="#parameters.msg" /></p>  

Struts2会解析value中的值,并当作OGNL表达式进行执行,获取到parameters对象的msg属性。

S2-029仍然是依靠OGNL进行远程代码执行。

0×02 触发途径

如果使用Struts2的web应用将用户提交的数据未经过滤,直接通过Struts2的标签设置成属性值,就被Struts2进行执行。

attr.JPG

之后若页面被渲染,会传至OgnlValueStack进行执行。

ognlstack.JPG

OGNL表达式会被转换成AST语法树,语法树上每个分支执行前会对其进行Accessible安全检查。

之前的Struts2远程代码执行poc,一般是通过修改StaticMethodAccess或是创建ProcessBuilder对象。

#_memberAccess["allowStaticMethodAccess"]=true

new java.lang.ProcessBuilder(new java.lang.String[]{'cat','/etc/passwd'})).start()

不过现在的Struts封装的xwork中的OGNL已经加强了安全校验。

memberAccess.JPG

allowStaticMethodAccess已经变成的final属性。

excludedClasses增加的禁用列表。

[interface ognl.ClassResolver, class java.lang.Runtime, class java.lang.ClassLoader, class com.opensymphony.xwork2.ActionContext, interface ognl.MemberAccess, class java.lang.Object, class ognl.OgnlContext, class java.lang.Class, class java.lang.Shutdown, class java.lang.System, interface ognl.TypeConverter]

excludedPackageNamePatterns同样增加了禁用列表。

[^java\.lang\..*, ^(?!javax\.servlet\..+)(javax\..+), ^ognl.*]

在我们的测试中allowPrivateAccess、allowProtectedAccess、excludedClasses、excludedPackageNamePatterns、acceptProperties、excludeProperties等一系列参数仍然能够修改。

private.JPG

修改allowPrivateAccess后,如果能够在OGNL上下文中能找到与excludedClasses类型相匹配的变量,将excludedClasses指向新的对象,就有可能绕过_memberAccess的保护。

0×03 结束

Struts2作为广泛应用的Web框架,安全问题一直层出不穷。为了保证安全,在业务处理中不应信任用户提交上来的任何数据,做好安全过滤。最好能在Ognl的执行入口加入过滤黑名单,并及时将Struts更新至2.3.25。

更多精彩

这些评论亮了

  • dinglang 回复
    你说执行流程干毛啊
    )9( 亮了
  • 周鸿祎 回复
    我的手下还有搞不定的漏洞?
    )9( 亮了
  • 哈哈 回复
    360有poc,但是打马了, 马赛克真是马式家族败类
    )8( 亮了
  • 归丶海 回复
    [哆啦A梦吃惊]
    )8( 亮了
  • genxor (2级) 安全研究员 回复
    我去 直接写进去也能算呀 无语中...
    )8( 亮了
发表评论

已有 19 条评论

取消
Loading...

特别推荐

推荐关注

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php