JSP命令执⾏的各种姿势(⼀)

发布于: 2024-07-05 15:46
来源: 卓识网安


JSP命令执⾏的各种姿势(⼀)








JSP 基础


JSP,全称JavaServer Pages,是⼀种开发动态Web⻚⾯的技术。它允许开发⼈员将Java代码嵌⼊到HTML⻚⾯中,从⽽实现⻚⾯的动态⽣成。JSP⻚⾯可以包含静态内容(如HTML、XML)和Java代码,这些Java代码通常⽤于动态⽣成内容,访问数据库,执⾏业务逻辑等。

JSP的基本原理是在服务器端将JSP⻚⾯编译成Servlet。当客户端请求⼀个JSP⻚⾯时,服务器将⾸先将该JSP⻚⾯编译成Java Servlet,然后再执⾏Servlet代码,⽣成最终的HTML⻚⾯,最终将HTML⻚⾯发送给客户端浏览器。这种⽅式使得JSP具有了动态⽣成内容的能⼒,同时也能够与Java Servlet技术⽆缝集成。

在JSP中常见的标签有以下⼏种:



常规命令执⾏


原始命令执⾏⽅式:

● Runtime.getRuntime().exec()

● ProcessBuilder().start()

● 反射调⽤ProcessImpl



EL表达式实现命令执⾏


1

EL表达式基础

Java Expression Language (EL) 是⽤于在Java EE应⽤程序(尤其是JSP和JSF)中简化数据访问和表达式计算的语⾔。EL主要⽤于在JSP/JSF⻚⾯中从Java对象获取数据、调⽤⽅法等操作。在JSP中通过EL表达式只能调⽤静态⽅法所以⼀般需要使⽤反射实现调⽤⽅法和创建对象,以下是⼏个EL表达式的重要特性。

●EL表达式标签格式

●EL表达式内置的隐式对象如下,常⽤的param、header、cookie等,这些隐式对象可⽤于获取 webshell的相关参数。

●在EL表达式中“ [] ”和“ . ”是通⽤的,其属性取值相当于执⾏对象的getter⽅法,=赋值则等同于执⾏setter⽅法。

通过如上特性可以构造出⼀个花⾥胡哨的⽆回显Webshell,在EL表达式中通过反射调⽤java.lang.Runtime.getRuntime()⽅法获取Runtime对象,调⽤其exec⽅法执⾏系统命令。

在花⾥胡哨的基础上加回显

利⽤“[]”变形并把所有参数都放⼊请求当中




2

EL表达式注⼊

服务端构造—个EL表达式注⼊点,⽽payload使⽤EL表达式,实际上就是将上—步构造的webshell 作为参数提交给PageContextImpl.proprietaryEvaluate让其执⾏EL表达式。




ScriptEngineManager实现命令执⾏


ScriptEngineManager是—个Java⾃带的⽤于解析js的库,根据其特性利⽤js中eval函数可以执⾏Java代码,具体操作:使⽤ScriptEngineManager类来获取—个ScriptEngineManager实例,执⾏eval函数⼊参为特定的js代码以实现命令执⾏和获取执⾏结果,需要注意的是在JDK⼤于 8时即可以使⽤Java.type("类名")来引⼊对应类也可以通过全权限定类名引⼊,但JDK版本低于8时需要权限定类名来引⼊使⽤,因此payload直接使⽤通⽤的全限定全类名来引⼊ 。

数据包和js内容,参数位置和编码可以⾃⾏调整。

ScriptEngineManager实现命令执⾏的本质是任意代码执⾏,所以可以实现像冰蝎那样通过⾃定义类加载器来加载⾃定义的任意字节码。



两者结合


结合EL表达式和ScriptEngine可以构造—个极短的JSP webshell如下。

⽆回显

有回显,⽅式—(通过ProcessBuilder,执⾏系统命令)

有回显,⽅式⼆(通过defineClass加载恶意类执⾏系统命令)

上述⽅式蚁剑已经集成⽀持,可以直接使⽤蚁剑连接。




参考链接:

https://yzddmr6.com/posts/a-new-type-java-webshell/

https://www.modb.pro/doc/115910



本篇文章来源于微信公众号:卓识网安
分享