SQL注入——WAF绕过(一)
SQL注入——WAF绕过(一)
0.前言
首先了解一下什么是WAF,Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。
因为普通防火墙难以检测和阻断某些情况,由此产生了WAF。Web应用防护系统,代表了一类新兴的信息安全技术,用以解决诸如防火墙一类传统设备束手无策的Web应用安全问题。与传统防火墙不同,WAF工作在应用层,因此对Web应用防护具有先天的技术优势。基于对Web应用业务和逻辑的深刻理解,WAF对来自Web应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断,从而对各类网站站点进行有效防护。
1.WAF分类
从解析层面的角度上,WAF可以分为嵌入型与非嵌入型,非嵌入型是指硬件型WAF、云WAF、软件型WAF之类的,它们对Web流量的解析完全是靠自身的;而嵌入型是指网站内置的WAF,它们拿到的Web数据是已经被解析加工好的。因此非嵌入型WAF的受攻击角度会涉及到其他的层面,而嵌入型WAF从Web容器模块型WAF、代码层WAF越往下走,其对抗畸形报文、扫操作的能力就越来越强,与此同步增加的还有部署维护的成本。
(以下图片举例中的图片来源于小迪安全课程,俺没钱高那么多服务器咧)
- 阿里云盾(阿里云服务器自带)
- 宝塔(一键化搭建工具,许多非法网站都喜欢用)
- 安全狗(免费的并且出得比较早的)
2.WAF防御原理
简单而言,WAF针对与SQL注入的办法。就是解析HTTP的请求,检测HTTP请求中的参数是否存在恶意的攻击行为。如果在请求的参数当中存在和WAF规则库相匹配的字段,则WAF需要判断该请求是否为攻击行为,并进行阻断或者放行的操作。
3.绕过方法——架构层面:
WAF作为访问的过滤器,本身不一定是嵌入在Web网页当中,所以我们可以从架构的层面上考虑对其的绕过
- 查找真实IP:
当用户本身是进入WAF后才访问的WEB网页,那么只要我们找到该网页的真实IP,那么绕过WAF也是轻而易举的事情了
- 加入到内部服务器:
在同网段中,网页与网页健,服务器与服务器之间是拥有这WAF防护的,如果我们能够在内部服务器之间进行访问,也是有可能实现绕过的
- SSRF请求伪造
我们可以通过边界的漏洞,利用已知服务器存在的SSRF漏洞,将数据直接发送到同网段的WEB页面中进行SQL注入
4.绕过方法——限度层面:
这个会比较好理解,有的WAF检测数据量是有限的,如果数据过大,会导致WAF无法将所有的数据都检测完,这样子就会检测不到我们写入的SQL注入语句,从而绕过WAF。如使用POST请求,对服务器请求进行很大资源的注入(注意:有些输入可能会有限制,所以不一定能实现)
1 |
|
5.绕过方法——协议层面
- 更改提交方式:
基于协议层,有些WAF考虑到性能等方面,只对部分提交方式进行了过滤,比如当WAF只过滤了GET请求时,我们可以将GET类型转化为POST类型达到绕过的目的
- 参数污染:
当我们使用浏览器与服务器进行交互的时候,参数往往会显示在GET或POST的请求包当中,参数的的形式也是名称+值的形式。一般而言,参数的名称都是单独一份,但在HTTP协议中却允许出现多个同名的参数。比如对于:
1 |
|
面对这种同样的参数出现多次的情况下,不同的服务器会有不同的处理办法。有的服务器是选取第一个参数,有的是选取第二个参数,也有的服务器是全都要,这种特性在绕过一些服务器端的逻辑判断就非常有用的
web服务器 | 参数获取函数 | 获取的结果 |
---|---|---|
PHP/Apache | $_GET(“par”) | Last |
JSP/Tmocat | Request.getParameter(“par”) | First |
Perl(CGI)/Apache | Param(“par”) | First |
Python/Apache | Getvalue(“par”) | All(List) |
ASP/IIS | Request.QueryString(“par”) | All(comma-delimited string) |
6.绕过方法——语法规则层面
以下方法并不全面,还需要积累更多的办法
- 大小写混合:
1 |
|
这是比较初级的绕过方式,一般来说,很难起到作用,但是也可以尝试。
- 解密编码:
1 |
|
- 注释符混用:
1 |
|
- 等价函数替换:
比如用@@version替换version(),用@@datadir替换datadir()
1 |
|
- 特殊符号混用:
+ | # | %23 | –+ | \\ | ‘ | @ |
---|
1 |
|
- mysql黑魔法
1 |
|
借助数据库特性:
mysql黑魔法
select{xusername}from{x11test.admin};
SQLServer技巧
(1)用来注释掉注射后查询的其余部分:
/*C语言风格注释
SQL注释
;00%空字节
(2)空白符:[0x01-0x20]
(3)特殊符号:%3a冒号
id=1union:select1,2from:admin
(4)函数变形:如db_name 空白字符
Oracle技巧
(1)注释符:–、/**/
(2)空白字符:[0x00,0x09,0x0a-0x0d,0x20]