Jsp Webshell与unicode的事
2023-12-1 13:0:52 Author: www.freebuf.com(查看原文) 阅读量:7 收藏

freeBuf

主站

分类

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

特色

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

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

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

FreeBuf+小程序

FreeBuf+小程序

引言

在前面主要例举了很多JSP webshell的构造方法,同时也提到了在tomcat jsp解析的时候将会对动态生成的java源码进行编译,在这个过程中将会处理Unicode编码,将unicode编码进行解码

而这里核心是通过跟进编译的过程,了解ecj.jar是如何进行编译的,并且通过其中的细节构造一些混淆方式

  1. 多个u绕过

  2. 使用注释符逃逸

正文

unicode解码过程

具体的解析位置可以跟踪到org.eclipse.jdt.internal.compiler.parser.Scanner#getNextToken0方法中

这里主要是对前面通过generateJava生成的jsp代码进行一个字符一个字符的进行解析

我们简单的看一下原理

getNextToken0的开头将会判断是否diet模式

https://wiki.eclipse.org/JDT_Core_Programmer_Guide/ECJ/Parse

官方文档的描述

image-20231113230928900.png

主要是用来跳过方法体源代码,通过解析源代码中的字符,跳过注释、空白和字符串来定位方法体的结束位置

image-20231111232820410.png

通过一个do-while循环遍历每一个字符

image-20231111233029815.png

通过将jsp源码抽象成一个char数组,其中的\字符会被转义为\\

image-20231112125639469.png

image-20231112125812155.png

通过\u来判断是否处理的是unicode

image-20231113231307009.png

这里通过jumpOverUnicodeWhiteSpace来判断这个unicode字符解码之后是否是一个空白字符,如果是的话,则通过do-while循环继续解析下一个字符

image-20231113231457509.png

具体是通过getNextUnicodeChar来对当前识别到的unicode进行解码之后将解析到的字符保存在currentCharacter属性中

image-20231113231747737.png

简单描述一下这个方法的逻辑

  1. 首先通过this.currentPosition++;跳过u字符

  2. 之后的while循环用来循环的处理多个连续的u字符,所以这也是为什么后面可以通过插入多个u的方式进行混淆,最后获取的u的字符数量会保存在unicodeSize

  3. 如果当前位置指针越过文件末尾,或者在连续的 'u' 后不足 4 个字符,表示无效的 Unicode 转义

  4. 检查并获取 4 个十六进制数字(0-9, A-F)作为 Unicode 编码的四个部分。如果其中任何一个不是有效的十六进制数字,同样抛


文章来源: https://www.freebuf.com/articles/web/385433.html
如有侵权请联系:admin#unsafe.sh