WAF Bypass SQL注入

0x00 WAF 概述

什么是 WAF

  • 全称 Web Application Firewall(WEB 应用防护系统),与传统的 Firewall(防火墙)不同,WAF 针对的是应用层

  • WAF 是通过执行一系列 针对 HTTP/HTTPS 的安全策略来专门为 Web 应用提供保护 的种网络安全产品

  • WAF 可以增大 攻击者的攻击难度和攻击成本 ,但是不是 100% 安全的

WAF 分类

WAF 的工作流程

  1. 进行身份认证 。先匹配白名单 进行检测是否归属白名单,如果归属那么直接把该请求发送到服务器

  2. 如果不归属白名单,它会先进行 数据包解析

  3. 之后进入规则系统匹配 。匹配是否有符合规则的请求,如果没有匹配到规则会放行到服务器

  4. 如果匹配到了规则会进行拦截 ,并弹出一个类似于系统检测 URL 输入恶意参数

  • 三句话概括

    • 首先进行身份验证,白名单的直接给服务器,黑名单直接拒绝访问,非白非黑名单的要去进行数据包的解析。

    • 无法解析数据包的也交给下一步进行处理,正常解析的去进行规则判断。

    • 没有匹配到规则的给服务器,匹配到规则的将进行拦截。

判断网站是否存在 WAF

  • 手工判断

    • 说明:直接在相应的网站的 URL 后面加上最基础的测试语句 ,比如 union select 1,2,3%23,并且放在一个不存在的参数名中

    • 用法:?aa=1 union select 1,2,3%23(举例,触发方法很多)

    • 结果:被拦截的表现为:页面无法访问、响应码不同、返回与正常请求网页时不同的结果等。

0x01 Bypass技巧

  • 为什么要绕过 WAF?

  • 当我们提交一个正常的 payload 时,会被 waf 防火墙识别出来,并及时阻止它访问 web 容器。

  • 但是当我们提交一个特殊的 payload 的时,有些防火墙可能并不会对这些特殊的 payload 进行过滤 ,从而可以正常访问

  • Web 容器为什么 WAF 可以被绕过?

  1. 安全性能 的冲突

  2. 买了 WAF 不会用,所有都默认设置

  3. WAF 无法 100% 覆盖 语言、中间件、数据库的特性

  4. WAF 本身存在漏洞

常见的 WAF 绕过技巧

大小写绕过

  • 用于只针对小写或大写的关键字匹配 技术

  • 出现原因:在 waf 里,使用的正则不完善 或者是没有用大小写转换函数

  • 用法:比如,拦截了 union,那就使用 uNIoN

index. php?id = -3 uNIoN sELect 1,2,3

  • 注意:对于一些不太成熟的 WAF 效果显著

替换关键字

关键字双写

  • 出现原因:利用 waf 的不完整性,只验证一次 字符串或者过滤的字符串并不完整。】

  • 用法:index. php? id=-3 UNlunionON SELselectECT 1,2,3

  • 注意:有些时候甚至构造更复杂,如: SeLSeselectleCTecT

同价词替换

  • 出现原因:WAF 主要是针对一些 特殊的关键词 进行检测

  • 用法:

  1. andor 不能使用:&& 和 ‖ 代替

  2. = 不能使用的情况:可以尝试 <,> 代替

  3. 空格 不能使用(常见):%20 ,%09,%0a,%0b,%0c,%0d,%a0,/**/ 代替

  • 注意:在 mysql 中 %0a换行 ,可以代替空格 ,这个方法也可以绕过部分 WAF

特殊字符拼接

  • 出现原因:把特殊字符拼接起来 绕过 WAF 的检测

  • 用法:如在函数里可以用 + 来拼接,在 Mysql 中可以利用注释/**/绕过

  • mysql 字符串拼接: concat()

  • SQL server 字符串拼接: +

  • Oracle 字符串拼接 :||

编码绕过

  • 对一些字符进行编码 ,常见的 SQL 编码有 unicode、HEⅩ、URL、ascii、base64 等 URL 编码

  • 出现原因:利用浏览器上的进制转换或者语言编码规则来绕过 waf

URL 编码

  • 输入一个连接,非保留字 的字符浏览器会对其 URL 编码 ,如空格变为 %20、单引号 %27、左括号 %28 等

  • 注意:如果 URL 编码只进行了一次过滤,可以用两次编码绕过

  • 用法:

Unicode 编码

  • 常用符号的 Unicode 编码:

  • 单引号:%u0027

  • 空格:%u0020

  • 左括号:%u0028

  • 右括号:%u0029

注释绕过 (常用)

  • 常见的用于注释的符号:// 、 --、/**/ 、# 、--+、-- -、;、--a

  • 出现原因:利用语言函数特性 来绕过 waf 的规则

普通注释

  • // 在构造的査询语句中 插入注释 ,规避对空格的依赖关键字识别

  • 用法:

内联注释

  • 相比普通注释,内联注释用的更多,它有一个特性 /!/ 只有 MySQL 能识别 (/*! */表示注释里面的语句会被执行 )

  • 用法:采用/*! code */ 来执行我们的 SQL 语句, 内联注释可以用于整个 SQL 语句中

  • 举例:过滤器过滤了如下内容 union, where, table name, table schema,=, and information_schema,这些都是我们内联绕过需要绕过的目标

注意:/*!50001 select * from test */ 的含义:表示假如数据库是5.00.01 以上版本,该语句才会被执行

参数污染

  • HPP (Http Parameter Polution)又称做重复参数污染 ,当同一参数出现多次,不同中间件会解析为不同的结果

  • 如果WAF只检测了同参数名中的第一个或最后一个 ,并且中间件特性 正好取与WAF相反的参数 ,则可成功绕过

缓冲区溢出

  • 缓冲区溢出用于绕过WAF,许多WAF是C语言写的 ,而C语言自身没有缓冲区保护机制

  • 因此如果WAF在处理测试向量时超出了其缓冲区长度 ,就会引发bug 从而实现绕过

  • 例如:

  • 说明:示例0xA*1000指0xA后面"A"重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度 ,这里1000只做参考,在某些情况下可能不需要这么长也能溢出

整合绕过(重点)

  • 整合的意思是结合使用 前面的各种绕过技术 ,单一的技术可能无法绕过过滤机制,但多种技术的配合使用成功的可能性会增加

  • 多种技术的使用增加了更多的可能性,除非毎一种技术单独都无法使用,否则它们能大大增加绕过的成功性

  • 例如:

分块传输绕过

  • 当我们将传输的内容分块时,处理后的HTTP请求由于和已知的payload相差较大,所以可以起到一定的绕过WAF的效果

  • 举例:正常输入id=1 and 1=2,被安全狗拦住

  • 只支持POST请求

特殊符号

  • 使用反引号,可以用来绕过空格和正则,特殊情况下还可以将其做注释符用

  • 神奇的"-+.",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);
posted @ 2021-11-20 22:59  FreeK0x00  阅读(213)  评论(0编辑  收藏  举报