Jsp中的jsp标准语法和XML语法的多重编码混淆

💡 原文中文,约1400字,阅读约需4分钟。
📝

内容提要

本文介绍了在WebShell检测引擎中对编码的探测方法。通过解析JSP页面中的指令和获取web.xml中的配置,可以确定JSP页面所使用的编码。如果没有特定的后缀和配置,会通过自动探测的方式获取编码。探测方法包括通过BOM解析和获取XML语法中的encoding属性值。以上是第一处编码解析的方法。

🔎

延伸解读

编码探测的优先级逻辑

文章指出,JSP页面编码的确定存在明确的优先级:首先检查web.xml中<page-encoding>的配置;若未指定,则通过BOM解析自动探测;对于XML语法页面,<?xml encoding='xx'?>中的encoding属性值优先级高于BOM探测结果。这种分层设计意味着检测引擎必须按顺序处理,否则可能误判编码,影响后续解码和检测准确性。

BOM探测的局限与默认回退

EncodingDetector通过读取流的前四个字节进行BOM解析,支持UTF-16BE、UTF-16LE、UTF-8、ISO-10646-UCS-4等多种编码。但若BOM探测失败,则默认使用UTF-8。这一回退机制虽然保证了处理流程的连续性,但也可能掩盖实际编码,导致解码错误。攻击者可能利用无BOM或伪造BOM的方式绕过检测,因此引擎需结合其他线索综合判断。

版本差异对检测的影响

文中提到,在Tomcat 8.0.50中通过XMLEncodingDetector类进行自动探测,但该类在高版本中被遗弃甚至移除。这意味着不同Tomcat版本下,JSP编码探测的行为可能不一致。对于WebShell检测引擎而言,需要兼容不同版本的行为差异,否则可能在某些环境下漏检或误判,尤其是在处理XML语法JSP时需注意encoding属性的解析方式。

❓

Q&A

WebShell检测引擎中如何探测JSP页面的编码?

主要通过解析JSP页面中的指令和获取web.xml中的配置来确定编码。如果没有特定后缀和配置,则通过自动探测方式获取编码,包括BOM解析和获取XML语法中的encoding属性值。

JSP页面编码探测的两个步骤是什么?

第一步是解析JSP中的所有指令;第二步是确定语法(标准JSP语法或XML语法)并获取编码,结果分别保存在isXml和sourceEnc变量中。

如何判断一个JSP页面使用的是标准JSP语法还是XML语法?

可以通过jsp-config中的<is-xml>标签判断,或者通过文件后缀.jspx或.tagx作为标志。默认不是XML格式。

当JSP页面没有指定编码时,编码是如何自动探测的?

通过EncodingDetector类进行自动探测,核心是processBom方法解析BOM。通过stream流中的前四个字节判断编码,如果探测失败,默认使用UTF-8编码。

XML语法中encoding属性值与BOM探测结果的优先级如何?

如果在<?xml encoding='xx'?>中指定了编码,优先使用encoding属性值;如果没有该属性,则使用通过BOM判断出的编码。

EncodingDetector支持哪些编码?

支持多种编码,包括UTF-16BE、UTF-16LE、UTF-8、ISO-10646-UCS-4、CP037等。

🏷️

标签

➡️

继续阅读