环境搭建

安全狗的安装

image-20231023135744444

安装过程中如果报错找不到apache2.4服务,解决方法:将apache重新安装一下

image-20231023140046111

找到你apache安装目录找到bin目录

image-20231023140328355

打开cmd执行以下两条命令,重新安装安全狗就可以了或者是安装结束之后安装对应的插件

1
2
3
httpd.exe  -k install
httpd.exe -k start
在虚拟机环境下不同的操作系统的版本执行这两条命令的报错不一样忽略即可

image-20231023140634051

安装完成需要打开安全狗的防护功能,重新启动PHP study

image-20231027142402847

常见WAF绕过的方法

  1. 双写绕过

    • 某些WAF只对关键字进行一次过滤处理,可使用双关键字绕过。例如,WAF可能会过滤”SELECT”,但不会过滤”SEL”+“ECT”,通过拆分关键字,可以绕过过滤机制。
  2. 大小写绕过

    • 某些WAF只过滤全大写或全小写的敏感字符,但未对大小写混用进行过滤。因此,可以对关键字进行大小写转换进行绕过,例如将”sleep”改写成”sleeP”或”slEEp”。
  3. 脏数据绕过

    • WAF通常有数据包大小的限制,旨在防止大型攻击载荷。通过发送超大的数据包,可能会使WAF在处理时耗尽资源或发生错误,从而绕过其检测和保护机制。
  4. 复参数绕过

    • filename=;filename=”1.php”
  5. 高并发绕过

    • 对请求进行并发,攻击请求会被负载均衡调度到不同节点,导致某些请求绕过了waf的拦截
  6. 特殊字符绕过

    • WAF过滤了某些关键字
    • 比如WAF过滤了空格,可以使用其他字符代替比如在mysql中%0a是换行,可以代替空格,这个方法也可以部分绕过最新版本的WAF,在sqlserver中可以用/**/代替空格
  7. 使用其他变量或者命令对注入语句进行替换

  8. HTTP参数污染

    • 在 php 语言中 id=1&id=2 后面的值会自动覆盖前面的值,不同的语言有不同的特性。可以利用这点绕过一 些 waf 的拦截。
  9. 特殊字符拼接

    • 把特殊字符拼接起来绕过WAF的检测,比如在Mysql中,可以利用注释/**/来绕过,在mssql中,函数里面可以用+来拼接
  10. 数据格式混淆

    • 利用数据格式解析缺陷,存在两种提交表单数据的请求类型
  11. 编码绕过

    • 使用各种编码进行绕过,例如URL编码、Unicode编码、HTML实体编码等。这种方法的前提是,提交的编码后的参数内容在进入数据库查询语句之前会有相关的解码代码。
    • 例如最常见的url编码,对数据进行二次url编码,waf进行一次解码并不能解析到有效的数据,而后端在进行解码时传入的为有效的恶意数据。
  12. 利用WAF本身功能绕过

    • 把”*”替换为空

      例:union+select+1,2,3,4….

      假如发现WAF会把*替换为空,那么就可以利用这一特性来进行绕过‍‍ ?id=-15+uni*on+sel*ect+1,2,3,4....

  13. 利用HTTP协议绕过

    • 分块传输:将请求分成多个小块进行传输,以混淆和绕过WAF的检测。攻击者可以使用分块传输来逃避WAF对请求长度或特定标记的规则检测。
    • 畸形包绕过(pipline绕过)
    • 协议覆盖
  14. 请求方式绕过

    • 某些WAF可能对不同请求方式(GET、POST、PUT等)的处理规则不一致。通过变换请求方式,可以绕过WAF的特定规则。
    • 常规的使用的GET和POST传参方式可能被WAF设定了不同的匹配规则,可以尝试使用potions和head等方式绕过
  15. 伪造IP绕过

    • 通过伪装自己的源IP地址来绕过WAF的防御机制。攻击者可以设置任意源IP地址,使得WAF无法正确追踪和过滤恶意请求。
  16. %00截断

    • %00截断产生的原因是0x00为十六进制的表示方法,ASCII码里就为0,而有些函数在进行处理的时候会把这个当作结束符
  17. 修改文件后缀名绕过

    • 文件上传时可能只过滤了php,但是php3,php2等文件名没有被过滤但是可以被当作php解析

文件上传绕过

本文使用的DVWA靶场演示等级为low,安全狗的防护规则是默认的没有新增或者删除规则

上传参数是否可以修改

  • Content-Disposition
  • name
  • filename
  • Content-Type

上传文件时waf会检查哪里?

  • 请求的url
  • Boundary边界
  • MIME类型
  • 文件扩展名
  • 文件内容

常见扩展名黑名单:个人写网站可能会写的很全但是waf不一定会写这么全

1
2
3
4
asp|asa|cer|cdx|aspx|ashx|ascx|asax
php|php2|php3|php4|php5|asis|htaccess
htm|html|shtml|pwml|phtml|phtm|js|jsp
vbs|asis|sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini

测试时的准备工作:

  • 网站是什么语言,什么系统,都是什么版本的
  • 测试网站可以上传什么格式的文件,不允许上传什么格式的文件
  • 上传的文件会不会被重命名或者二次渲染

溢出绕过

waf对于Content-Disposition字段的长度验证不是很准确,填充垃圾数据让waf匹配不到就可以绕过

image-20231029174615454

复参数绕过

filename=;filename="shell.php" 参数之间以;分隔,让waf认为filename=null从而绕过 有多个相同的参数,只匹配第一个

image-20231029171815619

多个等于号绕过

两个或者两个以上等号都可以绕过 filename========"shell.php"

image-20231029173140847

去除form-data

删除form-data前面的空格可以绕过

image-20231029174133552

直接把form-data删除也可以绕过

image-20231029174258454

去除 Content-Type

image-20231029173904439

经典的apache解析漏洞绕过

filename=shell.php; 去除原来的双引号加上分号绕过

image-20231029175441294

filename

这里可以让waf对filename这个字符串匹配不到,但是服务器又可以接收,加入换行这类的干扰

filename之后的="shell.php"换到下一行或者加一个空格

image-20231029180251432

image-20231029180214291

%00截断

%00截断产生的原因是0x00为十六进制的表示方法,ASCII码里就为0,而有些函数在进行处理的时候会把这个当作结束符

image-20231029181138780

修改后缀名

将后缀名改成php2,php3等可以被当作php解析的后缀名

image-20231029203900731