0x0 WAF 概述
什么是 WAF
WAF(Web应用程序防火墙 Web Application Firewall ) 是一种安全工具,用于保护Web应用程序免受各种网络攻击,如SQL注入、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等。WAF可以检测和阻止恶意流量,过滤恶意请求,保护Web应用程序免受攻击。- WAF 是通过执行一系列 针对 HTTP/HTTPS 的安全策略来专门为 Web 应用提供保护 的种网络安全产品
- WAF 可以增大攻击者的攻击难度和攻击成本,但是
不是 100% 安全 的
WAF 分类
- 根据不同部署方式分类
- 软件WAF
- 软件WAF是通过安装在服务器上的软件来实现Web应用程序防护的一种方式。
- 优势:软件WAF易于部署,可以通过在服务器上安装软件或应用程序插件来快速启用防护功能。它可以直接与Web服务器集成,检测和阻止恶意流量,提供实时保护。
- 适用场景:适用于中小型企业或个人网站,成本较低且易于管理。
- 注意事项:软件WAF可能会对服务器性能产生一定影响,需要考虑资源消耗和维护成本。
- 硬件WAF
- 硬件WAF是通过专门的硬件设备来实现Web应用程序防护的一种方式,通常部署在网络边界或数据中心的入口处。
- 优势:硬件WAF具有强大的性能和专业的安全功能,能够处理大量的流量和复杂的攻击。它可以独立运行,不依赖于服务器资源,对Web应用程序的性能影响较小。
- 适用场景:适用于大型企业或需要高性能、高可靠性的Web应用程序。
- 注意事项:硬件WAF通常价格较高,需要专门的硬件设备进行部署,维护和更新可能比较复杂。
- 根据不同工作原理分类
- 基于特征的WAF(Signature-Based WAF):这种类型的WAF使用预定义的规则集或模式来识别和阻止已知的攻击。通常基于特征的WAF能够准确地识别和阻止已经被广泛研究和证实的攻击方法,例如SQL注入、跨站脚本等。这种分类的WAF速度较快,但可能无法检测到新型的、未知的攻击。
- 基于行为的WAF(Behavior-Based WAF):这种类型的WAF根据应用程序的正常行为和特征,来检测和阻止异常或可疑的活动。基于行为的WAF可以检测到未知的攻击方法和零日漏洞,因为它们关注的是攻击行为的异常性而不是特定的攻击模式。这种分类的WAF比较适合发现新型的攻击,但也容易产生误报。
- 云WAF(Cloud WAF):这种分类的WAF部署在云端,通过云服务提供商来提供防护服务。云WAF可以灵活地扩展和部署到全球各地,为Web应用程序提供全面的安全保护。由于云WAF集中管理和更新规则,可以更快地响应新型威胁和漏洞。
- 混合WAF(Hybrid WAF):这种分类的WAF结合了基于特征和行为的检测方法,以提高检测准确性和覆盖范围。混合WAF可以结合多种技术,并根据实际情况动态调整防护策略,以适应不断变化的威胁环境。
WAF 的工作流程
- 检测流量:WAF会监控和分析所有进入Web应用程序的流量,识别潜在的恶意请求。
- 验证请求:对于每个请求,WAF会根据一系列预定义的规则进行验证,包括HTTP方法、参数、Cookie等内容。
- 过滤恶意请求:如果WAF发现请求不符合规则或可能包含恶意内容,它将阻止或过滤这些请求,以防止Web应用程序受到攻击。
- 记录和报告:WAF会记录所有检测到的恶意活动,并生成报告,以帮助管理员了解攻击类型和频率,以便改善安全策略。
判断网站是否存在 WAF
要判断一个网站是否存在WAF(Web应用程序防火墙),可以尝试以下几种方法:
- 请求头检查:你可以通过发送一个HTTP请求到网站,并查看响应头中是否包含一些特定的WAF厂商的标识,例如”X-WAF”、”Server: WAF”等。这些标识可能会显示网站使用了WAF来保护。
- 主动攻击:尝试发送一些具有恶意攻击特征的请求,如SQL注入、XSS攻击等,观察网站的响应情况。如果网站对这些攻击进行了阻止或过滤,可能是WAF在起作用。
- 网站响应:观察网站的响应时间和页面结构,一些WAF可能会引入额外的延迟或对页面内容进行修改以进行安全保护。
- 工具检测:使用一些专门的WAF检测工具,如WAFW00F、Nmap等,来扫描网站以检测是否存在WAF。
需要注意的是,有些网站可能会隐藏WAF的存在,以增加安全性,所以上述方法可能并不总是100%准确。但通过结合多种方法观察和测试,可以较为准确地判断一个网站是否使用了WAF。
0x1 WAF Bypass
- 为什么要绕过 WAF?
- 当我们提交一个正常的 payload 时,会被 waf 防火墙识别出来,并及时阻止它访问 web 容器。
- 但是当我们提交一个特殊的 payload 的时,有些防火墙可能并不会对这些特殊的 payload 进行过滤,从而可以正常访问
- Web 容器为什么 WAF 可以被绕过?
- 安全 与 性能的冲突
- 买了 WAF 不会用,所有都默认设置
- WAF 无法 100% 覆盖语言、中间件、数据库的特性
- WAF 本身存在漏洞
- 大小写混合:攻击者可以混合使用大小写字母来变换恶意代码,绕过 WAF 过滤规则。举例来说,可将关键字 “SELECT” 变成 “sElEcT”。
- 替换关键字:通过替换或插入不寻常字符如双字节字符来绕过 WAF 对关键字的识别。比如,将 “SELECT” 替换为 “SEL\0ECT”。
- 使用编码:使用不同类型的编码方式如 URL 编码、Base64 编码等,对恶意 Payload 进行混淆,以规避 WAF 的检测。
- 使用注释:插入注释 语句 // 、 –、/**/ 、# 、–+、– -、;、–a ,以混淆 Payload,使 WAF 难以识别并阻止攻击。
- 参数污染:通过在 URL 参数中增加额外的参数、特殊字符或敏感关键词,来绕过 WAF 对恶意 Payload 的检测。
- 缓冲区溢出:利用输入的数据超过系统可处理的缓冲区大小,导致系统溢出并执行任意代码,从而绕过 WAF 的防护。
- 分片攻击:将恶意payload分成多个小段,并通过多个请求发送,以绕过WAF对请求体的整体检测。
- 特殊符号:使用反引号,可以用来绕过空格和正则,特殊情况下还可以将其做注释符用,从而绕过 WAF 的防护。
- 性能因素:攻击者可能故意发送大量请求或大数据量的 Payload,来占用 WAF 的资源和带宽,从而干扰其正常运作,造成漏洞。
- 特定规避:了解WAF的规则和过滤机制,并根据具体规则设计恶意payload,以规避WAF的检测。
- 整合绕过:组合多种绕过技术与方法,如结合大小写混合、编码、特殊符号和替换关键字,构建复杂的攻击 Payload,提高绕过 WAF 的成功率。
00 大小写混合
- 用于只针对小写或大写的关键字匹配技术
- 出现原因:在 waf 里,使用的正则不完善或者是没有用大小写转换函数
- 用法:比如,拦截了 union,那就使用 uNIoN
index. php?id = -3 uNIoN sELect 1,2,3
- 注意:对于一些不太成熟的 WAF 效果显著
01 替换关键字
关键字双写
- 出现原因:利用 waf 的不完整性,只验证一次字符串或者过滤的字符串并不完整。】
- 用法:
index. php? id=-3 UNlunionON SELselectECT 1,2,3
- 注意:有些时候甚至构造更复杂,如: SeLSeselectleCTecT
同价词替换
- 出现原因:WAF 主要是针对一些
特殊的关键词 进行检测 - 用法:
- and 和 or 不能使用:&& 和 ‖ 代替
- = 不能使用的情况:可以尝试 <,> 代替
- 空格 不能使用(常见):%20 ,%09,%0a,%0b,%0c,%0d,%a0,/**/ 代替
注意:在 mysql 中 %0a 是换行,可以代替空格,这个方法也可以绕过部分 WAF
特殊字符拼接
- 出现原因:把特殊字符拼接起来绕过 WAF 的检测
- 用法:如在函数里可以用 + 来拼接,在 Mysql 中可以利用注释/**/绕过
- mysql 字符串拼接: concat()
- SQL server 字符串拼接: +
- Oracle 字符串拼接 :||
02 使用编码
URL 编码
- 输入一个连接,非保留字的字符浏览器会对其 URL 编码,如空格变为 %20、单引号 %27、左括号 %28 等
- 注意:如果 URL 编码只进行了一次过滤,可以用两次编码绕过
- 用法:
Unicode 编码
- 常用符号的 Unicode 编码:
- 单引号:%u0027
- 空格:%u0020
- 左括号:%u0028
- 右括号:%u0029
03 使用注释
- 常见的用于注释的符号:// 、 –、/**/ 、# 、–+、– -、;、–a
- 出现原因:利用语言函数特性来绕过 waf 的规则
普通注释
- // 在构造的査询语句中 插入注释,规避对空格的依赖或关键字识别。
- 用法:
内联注释
- 相比普通注释,内联注释用的更多,它有一个特性
只有 MySQL 能识别 (/*! */表示注释里面的语句会被执行) - 用法:采用 /*! code */ 来执行我们的 SQL 语句, 内联注释可以用于整个 SQL 语句中
- 举例:过滤器过滤了如下内容 union, where, table name, table schema,=, and information_schema,这些都是我们内联绕过需要绕过的目标
注意:/*!50001 select * from test */ 的含义:表示假如数据库是5.00.01以上版本,该语句才会被执行
04 参数污染
- HPP (Http Parameter Polution)又称做
重复参数污染 ,当同一参数出现多次,不同中间件会解析为不同的结果 - 如果WAF只检测了同参数名中的第一个或最后一个,并且中间件特性正好取与WAF相反的参数,则可成功绕过
05 缓冲区溢出
- 缓冲区溢出用于绕过WAF,许多WAF是C语言写的,而C语言自身没有缓冲区保护机制
- 因此如果WAF在处理测试向量时超出了其缓冲区长度,就会引发bug从而实现绕过
- 说明:示例0xA*1000指0xA后面”A”重复1000次,一般来说对应用软件构成
缓冲区溢出都需要较大的测试长度 ,这里1000只做参考,在某些情况下可能不需要这么长也能溢出
06 分片攻击
- 当我们将传输的内容分块时,处理后的HTTP请求由于和已知的payload相差较大,所以可以起到一定的绕过WAF的效果
- 举例:正常输入id=1 and 1=2,被安全狗拦住
- 只支持POST请求
07 特殊符号
- 使用反引号,可以用来绕过空格和正则,特殊情况下还可以将其做注释符用
- 神奇的”-+.”,select+id from users; “+” 是用于字符串连接的, ” -” 和 ” .” 在此也用于连接,可以逃过空格和关键字过滤
index.php?id=-1.0 union select"1",2,3
index.php?id=-1E0 union select~1,2,3
index.php?id=-1 union select 1,2,version"from users"
index.php?id=-1 union select `id`,1,2 from users
index.php?id=-1 union select 1,2,version()`from users`
- 普通括号
select count(id) test from users;
index.php?id=(-1)union(select(1),(2), (3)from(users)
index.php?id=(1)or(0x50=0x50)
index.php?id=(-1)union(((((((select(1),hex(2), hex(3)from(users))))))))
- 花括号
select {user} from{x mysql.user};
index.php?id=-1 union select 1,{x 2},3
- 过滤掉and和or的盲注
index.php?id=strcmp(left((select%20username%20from%20users%20limit%200,1),1),0x42)%23
index.php?id=strcmp(left((select+username+from+users+limit+0,1),1),0x42)%23
select * from users where id=strcmp(left(select username from users limit 0,1),1),0x42);
08 整合绕过 (重点)
- 整合的意思是
结合使用前面的各种绕过技术,单一的技术可能无法绕过过滤机制,但多种技术的配合使用成功的可能性会增加 - 多种技术的使用增加了更多的可能性,除非毎一种技术单独都无法使用,否则它们能大大增加绕过的成功性
© 版权声明
THE END
暂无评论内容