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
select * from users where id="liaoyue"  and (select 1)=(Select 0xA*1000) uNiOn SeLeCt 1,2,version();

5.绕过方法——协议层面

  • 更改提交方式:

  基于协议层,有些WAF考虑到性能等方面,只对部分提交方式进行了过滤,比如当WAF只过滤了GET请求时,我们可以将GET类型转化为POST类型达到绕过的目的

  • 参数污染:

  当我们使用浏览器与服务器进行交互的时候,参数往往会显示在GET或POST的请求包当中,参数的的形式也是名称+值的形式。一般而言,参数的名称都是单独一份,但在HTTP协议中却允许出现多个同名的参数。比如对于:

1
http://www.baidu.com?name=liao & name=yue  

  面对这种同样的参数出现多次的情况下,不同的服务器会有不同的处理办法。有的服务器是选取第一个参数,有的是选取第二个参数,也有的服务器是全都要,这种特性在绕过一些服务器端的逻辑判断就非常有用的

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
select * from users where id='liaoyue' uNioN SeleCt 1,2,3;

  这是比较初级的绕过方式,一般来说,很难起到作用,但是也可以尝试。

  • 解密编码:
1
select * from users where id="liaoyue" union%0Aselect%0A1,2,3;
  • 注释符混用:
1
select * from users where id="liaoyue" /*!union*/select 1,2,3;
  • 等价函数替换:

  比如用@@version替换version(),用@@datadir替换datadir()

1
select * from users where id="liaoyue" union select (mid(user(),5,3)),2,3;
  • 特殊符号混用:
+ # %23 –+ \\ @
1
select * from users where id="liaoyue" union+select+1,2,3;
  • mysql黑魔法
1
select{xusername}from{x11test.admin};
  • 借助数据库特性:

    • 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]


SQL注入——WAF绕过(一)
https://one-null-pointer.github.io/2022/08/28/SQL注入——WAF绕过/
Author
liaoyue
Posted on
August 28, 2022
传送口