前言
单纯的通过单个编码,在WebShell检测引擎中会检测编码,并将其进行解码
这里主要是使用在JSP页面中支持的编码进行多次不同的编码进行混淆
混淆绕过
embed encoding
主要是Y4tacker师傅的研究成果进行一些代码上面的复现
针对编码的探测主要集中在generateJava方法(通过jsp页面生成等价的servlet页面)中
根据注释的内容我们可以明白主要是通过两步
step1: 首先解析jsp中的所有指令
step2: the whole translation unit
指令的解析集中在ParserController#parseDirectives
我们这仅关注一些关于编码的内容
这里的jspConfigPageEnc
变量,是通过getJspConfigPageEncoding
方法中Jsp config中获取的,也就是在web.xml中的<page-encoding>
标签中的内容
之后就是通过determineSyntaxAndEncoding
来探测我们需要处理的是标准的JSP语法还是通过XML语法编写的jsp页面,并且获取他们所使用的编码
并通过isXml
和sourceEnc
分别来保存探测的结果,默认不是xml格式
可以通过在jsp config中的<is-xml>
来判断,或者通过.jspx / .tagx
这两个后缀作为标志
如果是JSP语法格式,就从jsp-config中获取特定的编码,如果在jsp-config中并没有指定具体的编码,将在后面通过BOM进行探测
https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding
上面是通过jsp-config中的配置进行编码的获取的
而如果没有如上面的后缀,只是一个简单的.jsp后缀,而且也没有在jsp-config中使用<is-xml>
标签进行显示的指明
将会通过EncodingDetector
进行编码的自动探测
在Y4tacker师傅中,环境是tomcat 8.0.50版本的,是通过XMLEncodingDetector
类对象进行自动探测的,该类在高版本中被遗弃甚至移除
但是不影响,我们关注EncodingDetector
对于auto detect核心是通过processBom
进行BOM的解析
通过stream流中的前四个字节进行编码的判断,如果探测失败,默认是UTF-8编码
支持有很多编码--UTF-16BE / UTF-16LE / UTF-8 / ISO-10646-UCS-4 / CP037 ......
等等
通过BOM探测失败,默认为UTF-8编码
以上就是第一处的编码的解析,即通过BOM对stream流进行探测
紧接着就是就是通过XML形式的语法,通过获取他的encoding
属性值
这里主要是逻辑是:
如果在
<?xml encoding='xx'
中存在有编码的指定,优先是选择encoding中的编码当然如果没有该属性值,则还是指定为前面通过BOM判断出的编码
而对于encoding的值的获取