绕过WAF

安全狗

这里我用的3.5版本,后面4.0的版本也会进行讨论.

image-20250811104931772

SQL注入

image-20250811105858760

在进行注入的时候,如果输出诸如:unionselect这样的关键字,就会触发WAF拦截。

换不同的函数组合

1
2
3
4
5
6
7
8
9
10
11
拆分字符串函数:mid、left、lpad等

编码函数:ord、hex、ascii等

运算函数:+ - * / & ^ ! like rlike reg等

空格替换部分:09、0a、0b、0c、0d等

关键数据函数:user()、version()、database()等

然后将这些不同类型的函数组合拼接在一起

但是上面这些这是关于mysql的,其他数据库需要在去查询一下。

例子:

在安全狗中,如果使用andor这样的关键字的时候就会触发拦截,那么就可以使用其他函数进行绕过。比如:like

image-20250811110459627

1
http://10.20.0.5/sqli-labs-master/Less-2/index.php?id=1 like 1

image-20250811110632114

页面返回正常,输入:

1
http://10.20.0.5/sqli-labs-master/Less-2/index.php?id=1 like 112

image-20250811110700026

替换提交方式

1
2
3
4
如果get方式进行拦截,是否可以使用post提交。
如果域名进行拦截,是否可以使用ip进行提交。
https进行拦截,是否可以使用http进行提交。
更改Referer,是否有白名单。

image-20250811111038988

这里将get请求替换成post请求,虽然没有拦截了,但是没有正常回显了。所以这里需要源码支持。视频中是可以正常回显的,我估计是小迪改了源码。

分块传输

1
https://github.com/c0ny1/chunked-coding-converter

缺陷:只能支持post请求体的注入点。

image-20250811113601365

直接编码请求体就行。

http参数污染

1
2
3
4
5
6
7
8
9
什么是参数污染?
举个例子,一个转账网站的URL:
www.xxxxx.com/xxxx.php?username=jack&to=mar
这是jack用户向mar用户进行转账。
如果有攻击者,就像这样:
www.xxxxx.com/xxxx.php?username=jack&to=mar&to=hack
那么请问此时jack是向hack转账还是mar转账呢?这样就是http参数污染。下图列出了不同平台所支持的情况不同,有的平台就拿这个案例来说就是给mar转账,有的平台就是hack

就是因为这样的特性。所以导致了。在绕过WAF的时候,可以用这种方式绕过,比如上传文件的时候的,如果你上传的文件名字,是filename=1.jpg&filename=1.php,那么此时如果waf接收的是1.jpg,然后后端的php接收的是最后一个值,那么就会出现1.php被上传。

image-20250811135526683

FUZZ测试过狗

1
2
3
4
5
常见的就是使用注释符,然后往里填充特殊字符,达到绕过
/**/
/*! ...*/

使用burp的暴力破解模块不断的往注释里面添加垃圾数据

同含义函数

image-20250812133207688

image-20250812133247578

image-20250812133325479

image-20250812133345277

文件上传

image-20250811161139598

只要上传php后缀的文件 ,就会被拦截。但是你上传:ph这样的后缀又不会过滤,这样就是典型的格式过滤。

安全狗的规则:

image-20250811161608381

绕过方式—去掉引号(不行)

这里本来在文件名这里有一个冒号。但是这里将其去掉之后,可以尝试绕过,但是我这里没有成功。

image-20250811161716442

1
2
3
原理:如果在不加上双引号的情况下,waf有可能会将1.php当做和filename一样的变量。

可能在waf的程序源码中,会首先将上传的文件名当做一个字符串进行处理,如果你没有加上双引号,可能会认为这是一个参数。而不是提交的文件名

加上等于号,使赋值变为比较(可行)

1
2
3
4
5
在程序中,两个等于号是比较的意思,而一个等于号是赋值,所以可以尝试:
==
===
或者多写几个:=====
这种方式进行绕过

image-20250811162207334

image-20250811162339296

将后缀换行(不行)

1
原理:在waf程序判断中,你传输的文件可能是:filename="2.p\nh\np"这样拥有换行符的后缀,导致绕过,但是我这里并不行

image-20250811162922745

垃圾数据堆叠(可行)

1
原理:程序对数据包接收的大小有限,如果超出程序所能承受的范围,将会溢出,从而绕过

image-20250811163902554

image-20250811164010960

无限变量传递(可行)

1
2
3
4
5
原理:和垃圾数据一样,还有点参数污染的味道,不知道不同后端,所带来的变化是不是和参数污染一样。
这里是:filename="1.php";filename="1.php"
如果实战中对这种进行拦截,可以尝试:
filename="1.jpg";filename="1.jpg";filename="1.php"
就是前面是正常的,后面传输一个错误的

image-20250811164334726

多值传递(可行)

1
2
原理:waf在进行接收的时候,可能就接受第一个传递进来的值。
filename="xxx"hack.php"

image-20250811165359067

分号隔断(可行)

1
2
3
原理:waf接受最后一个值(所以这个值得是白名单),但是程序在接受的时候只接收了第一个,分号后面认为是其他参数的值

filename=2.php;1.jpg

image-20250811170521160

image-20250811170538398

注意我这里上传的时候,我把双引号去掉了,如果你没有去掉:

image-20250811170851110

image-20250811170839581

冒号隔断

1
2
3
这种方式进行隔断,文件能正常上传,但是会把后面上传的文件内容一并隔断,导致最后上传了一个空的php文件,但是这种方式为啥我还要记录,因为直接创建一个恶意的php文件和创建了之后在往里面写恶意的内容,这两种方式的敏感程度不一样,可能在未来的某一天可以使用某个漏洞往某个文件里面写内容,就可以使用这种方式。

filename=3.php:1.jpg

image-20250811171008485

1
2
而且这里我还没有去掉双引号也可以隔断。
filename="4.php:1.jpg"

image-20250811171100424

image-20250811171137619

文件包含&代码执行

在安全狗的拦截规则里,他没有关于文件包含和代码执行的规则

image-20250811172024768

but!!!他拦截我的exec这个恶意函数(估计),我连这个靶场都打不开。

image-20250811172230775

看了一下日志,还真是因为靶场本身有恶意函数,在打开页面被安全狗检测到了。

image-20250811172421458

宝塔

没安装明白,简单的办法是有一个公网服务器,但是我没有公网的服务器,所以这里直接就使用视屏中的截图替代吧

宝塔是可以拦截一些代码执行和文件包含的

image-20250811172559162

在宝塔的规则里,如果你传入的参数有这种恶意的关键字的话,就会触发拦截。

1
2
3
txt=Sy=str replace('x','','pxhpxinxfo()');assert ($y);&submit=8688

这里的规则就是将phpinfo这个关键字混淆,然后在通过代码执行,自己构造一段可以传递小代码。这里是将其中的x替换为空。因为一般的waf他的规则是死的,就是静态检测,不会动态的追踪你的代码。所以就导致了绕过。(花钱的WAF这样估计就饶不了QWQ)

文件上传

用安全狗思路,直接全寄,都不行,宝塔还是太权威了。QWQ

image-20250811173541657

image-20250811173618675

可以换成其他后缀进行上传。但是一般网站本身的源码都会有白名单或者黑名单,这个玩意看命。

SQL注入

用安全狗的思路还可以~

XSS绕过工具

1
2
https://github.com/s0md3v/XSStrike
https://github.com/payloadbox/xss-payload-list