WAF Bypass SQL注入
0x00 WAF 概述
什么是 WAF
-
全称 Web Application Firewall(WEB 应用防护系统),与传统的 Firewall(防火墙)不同,WAF 针对的是应用层
-
WAF 是通过执行一系列 针对 HTTP/HTTPS 的安全策略来专门为 Web 应用提供保护 的种网络安全产品
-
WAF 可以增大 攻击者的攻击难度和攻击成本 ,但是不是 100% 安全的
WAF 分类
WAF 的工作流程
-
进行身份认证 。先匹配白名单 进行检测是否归属白名单,如果归属那么直接把该请求发送到服务器
-
如果不归属白名单,它会先进行 数据包解析 。
-
之后进入规则系统匹配 。匹配是否有符合规则的请求,如果没有匹配到规则会放行到服务器
-
如果匹配到了规则会进行拦截 ,并弹出一个类似于系统检测 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 可以被绕过?
-
安全 与 性能 的冲突
-
买了 WAF 不会用,所有都默认设置
-
WAF 无法 100% 覆盖 语言、中间件、数据库的特性
-
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 主要是针对一些 特殊的关键词 进行检测
-
用法:
-
and 和 or 不能使用:&& 和 ‖ 代替
-
= 不能使用的情况:可以尝试 <,> 代替
-
空格 不能使用(常见):%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);