freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

JSP Webshell中的编码问题
superLeeH 2023-12-09 23:22:53 696765

前言

前面提及了最普通的JSP Webshell的构造,以及通过分析在java编译过程中对unicode编码的解码过程学习了一些在JSP中的关于unicode编码的绕过方法

这里主要是通过学习了在动态生成java文件的过程中,针对标准的JSP语法和XML格式的语法的编码的获取和解码进行编码~~~~

embed encoding

这里主要是使用在JSP页面中支持的编码进行多次不同的编码进行混淆

主要是Y4tacker师傅的研究成果进行一些代码上面的复现

针对编码的探测主要集中在generateJava方法(通过jsp页面生成等价的servlet页面)中

image-20231107124458984.png

根据注释的内容我们可以明白主要是通过两步

  1. step1: 首先解析jsp中的所有指令

  2. step2: the whole translation unit

指令的解析集中在ParserController#parseDirectives

image-20231107124835548.png

image-20231107124925939.png

我们这仅关注一些关于编码的内容

这里的jspConfigPageEnc变量,是通过getJspConfigPageEncoding方法中Jsp config中获取的,也就是在web.xml中的<page-encoding>标签中的内容

image-20231107125208796.png

之后就是通过determineSyntaxAndEncoding来探测我们需要处理的是标准的JSP语法还是通过XML语法编写的jsp页面,并且获取他们所使用的编码

image-20231107125404516.png

并通过isXmlsourceEnc分别来保存探测的结果,默认不是xml格式

image-20231107125803835.png

可以通过在jsp config中的<is-xml>来判断,或者通过.jspx / .tagx这两个后缀作为标志

image-20231107131137864.png

如果是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>标签进行显示的指明

image-20231107224512472.png

将会通过EncodingDetector进行编码的自动探测

在Y4tacker师傅中,环境是tomcat 8.0.50版本的,是通过XMLEncodingDetector类对象进行自动探测的,该类在高版本中被遗弃甚至移除

image-20231107224759736.png

但是不影响,我们关注EncodingDetector

image-20231107224903525.png

对于auto detect核心是通过processBom进行BOM的解析

image-20231107225012940.png

通过stream流中的前四个字节进行编码的判断,如果探测失败,默认是UTF-8编码

image-20231107225224184.png

支持有很多编码--UTF-16BE / UTF-16LE / UTF-8 / ISO-10646-UCS-4 / CP037 ......等等

通过BOM探测失败,默认为UTF-8编码

以上就是第一处的编码的解析,即通过BOM对stream流进行探测

紧接着就是就是通过XML形式的语法,通过获取他的encoding属性值

这里主要是逻辑是:

  1. 如果在<?xml encoding='xx'中存在有编码的指定,优先是选择encoding中的编码

  2. 当然如果没有该属性值,则还是指定为前面通过BOM判断出的编码

image-20231108225112578.png

而对于encoding的值的获取

image-20231108225403548.png

image-20231108225505533.png

最后上面获取的编码方法保存在sourceEnc中,而是否是通过BOM探测到编码通过isBomPresent来标识

接下来会继续判断是否是在解析一个XML语法的文件

image-20231108230921976.png

核心是通过创建一个JspReader,通过hasJspRoot方法检测在JSP页面中是否存在有xxx:root标签,如果有则证明正在解析的是一个XML语法,将isXml置为true

image-20231108231459737.png

这里规定了<xx:root>标签一定要是第一个元素,之后通过切片获取xx

参考

https://tttang.com/archive/1840/#toc__7

https://y4tacker.github.io/2022/05/16/year/2022/5/JspWebShell%E6%96%B0%E5%A7%BF%E5%8A%BF%E8%A7%A3%E8%AF%BB/#%E5%86%99%E5%9C%A8%E5%89%8D%E9%9D%A2

https://www.eclipse.org/articles/Article-Internationalization/how2I18n.html

https://yzddmr6.com/

Webshell攻防下的黑魔法-yzddmr6

# web安全 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 superLeeH 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
superLeeH LV.5
这家伙太懒了,还未填写个人描述!
  • 50 文章数
  • 29 关注者
hutool组件下dynamic proxy和JDBC的部分可用链
2025-03-18
Vaadin组件下的新反序列化链寻找
2025-02-11
json组件下的原生反序列化getter触发
2025-01-13
文章目录