背景

对于腾讯的业务来说,有两个方面决定着WAF能否发挥效果,一个是合适处理海量流量的架构,另一个关键因素则是规则系统。架构决定着WAF能否承受住海量流量的挑战,这个在之前的篇章中简单介绍过(详情见主流WAF架构分析与探索WAF应用层实现的架构漫谈)。而规则系统则决定着WAF能否发挥完善的防护功能。

SQL注入是由于开发人员没有对用户的输入进行相关的过滤,而使用户的输入可以被带入到SQL语句中执行,所引发的一种高危漏洞。可能造成信息泄露,数据库数据泄露,入侵等重大影响的后果。腾讯WAF对此种类型漏洞的防护目标就是确保不造成上述重大影响。

本文介绍腾讯WAF如何针对SQL注入这种攻击进行防护。同时,最近TSRC与白帽子小伙伴们举办了一场SQL注入绕过挑战赛,发现了WAF规则系统一些不足之处,这里将详细介绍。

感谢各位参与的白帽子小伙伴的大力支持。

关键字防护

SQL注入最简单、粗暴但实用的方式就是检测一些关键字,通过把这些能造成影响的关键字加入黑名单,可以阻断大部分的利用代码。这类关键字主要包含几种:

1、 SQL语句的关键保留字,如select from,union select,drop table,into outfile等。

2、 MySQL等DBMS的内建函数,如version(),load_file(),sleep(),benchmark()等。

3、 MySQL等DBMS内建变量,如@@version等。

4、 MySQL所识别的内联注释,如/*!union*/ /*!select*/或/*!50000union*/等。

真假条件防护

上述的关键字方法能过滤掉很多的利用代码,但还不全。SQL注入技术中有一种是通过利用注入条件的真假的方式来获取相关信息的,例如 CGI:http://host/SQLi.php?id=1对应的SQL语句为select * from t_table where id=1。则通过注入

http://host/SQLi.php?id=1 or
1=1   => select* from t_table where id=1 or 1=1

http://host/SQLi.php?id=1 and 1=2  =>select
*from t_table where id=1 and 1=2

通过判断真假来获取MySQL的相关信息。对于这种方式如果通过简单的添加关键字会造成误报而影响业务的情况。这种情况下我们需要分析此类型的应用,例如:
op a = b

1、 op可以是and,or,<,>=,||,&&等

2、 分隔符可以是空格,/**/注释等

3、 a与b可以是数字,字符串,表名,函数,sql语句结果等等

通过穷举此类应用方式来阻断相关的利用

绕过防护

  • URL编码

浏览器中输入URL是会由浏览器进行一次URL编码,而攻击可能会通过多次编码来对WAF进行绕过,例如:

Id.php?id=1%2520union/**/select 解码后实际为Id.php?id=1 union/**/select

如果只经过一次解码,则变成Id.php?id=1%20union/**/select

可能绕过正则表达式的检测

通过循环多次URL解码解决此类问题

  • 特殊字符

%00如果直接URL解码,结果是C语言中的NULL字符。如果WAF使用string等数据结构来存储用户的请求,则解码之后会截断字符串,造成后面的内容不经过检测。例如:

Id.php?id=1%20union/**/select

解码后可能变成:

Id.php?id=1[NULL]%20union/**/select

后面的%20union/**/select就躲过了WAF的检查,从而绕过WAF。解决方式:

1、对% 00进行特殊处理

2、不要使用string等存储用户的请求内容

%0a是不换行空格,用于在字处理程序中标示禁止自动换行。使用正则表达式的\s无法匹配到这个字符,但在Mysql中%0a与普通的空格一样,可以当成分隔符来使用。即对于Mysql来说,如下请求经过URL解码之后是一样的

Id.php?id=1%20union/**/select

Id.php?id=1/**/union/**/select

Id.php?id=1%a0union/**/select

对于这种字符,可以进行特殊处理后再进行匹配

%0b是垂直制表符,%09是水平制表符。在正则表达式中,\s与\t均可匹配%09水平制表符,但匹配不了%0b垂直制表符,需要使用\v匹配。如果正则表达式中,Mysql的分隔符没有考虑到这种情况,也存在绕过的风险

       半个中文字符。RE2等正则引擎默认使用UTF8编码,UTF8编码是3-4字符的编码,如果出现%e4等半个中文,即1个字符的时候,UTF8解码不出,用正则表达式的任意匹配符(.)是匹配不出来的。针对这种字符,可以考虑特殊处理或者变更引擎的编码。

  • 畸形HTTP请求

当向Web服务器发送畸形的,非RFC2616标准的HTTP请求时,Web服务器出于兼容的目的,会尽可能解析畸形HTTP请求。而如果Web服务器的兼容方式与WAF不一致,则可能会出现绕过的情况。例如

GET id.php?id=1%20union/**/select

这个请求没有协议字段,没有Host字段。但apache对这个请求的处理,默认会设置协议为HTTP/0.9,Host则默认使用Apache默认的servername

在这种情况下,可以选择:

1、尽可能与Web服务器保持一致

2、拒绝非标准的HTTP请求(在后端防护的Web服务器有多种类型时,如apache,nginx,lighthttpd等,由于每种web服务器的兼容性不一致,所以要实现1的WAF尽可能与Web服务器保持一致存在一定的困难)

其他 

由于WAF实现的复杂性,与所防护的Web服务器的不一致性等原因,绕过的方式有很多种。以上所介绍的也仅是我们所遇到的绕过中比较典型的部分,特别与大家分享。期待与各位大牛交流相关技术,共同提高。

原文地址:http://www.2cto.com/Article/201407/320154.html

WAF攻击与防御的更多相关文章

  1. 浅谈 DDoS 攻击与防御

    浅谈 DDoS 攻击与防御 原创: iMike 运维之美  什么是 DDoS DDoS 是英文 Distributed Denial of Service 的缩写,中文译作分布式拒绝服务.那什么又是拒 ...

  2. [转载] MySQL 注入攻击与防御

    MySQL 注入攻击与防御 2017-04-21 16:19:3454921次阅读0     作者:rootclay 预估稿费:500RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页 ...

  3. Mac地址泛洪攻击的防御措施和具体配置

    Mac地址泛洪攻击指的是:利用交换机的mac地址学习机制,攻击者不断地刷新mac地址,填满交换机的mac地址表,以致崩溃,使交换机不得不使用广播发包,从而获取其他人的报文信息. mac地址泛洪攻击的防 ...

  4. C#-黑客-数据库访问-字符串的攻击和防御

    C#中用基本的方法对数据库进行增删改查,会被黑客利用,写入其他的代码以实现对数据库的数据进行其他的操作.例如: 对下列数据库的某个信息进行修改操作 修改代码: using System; using ...

  5. ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御

    ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3  ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...

  6. 浅谈Ddos攻击攻击与防御

    EMail: jianxin#80sec.comSite: http://www.80sec.comDate: 2011-2-10From: http://www.80sec.com/ [ 目录 ]一 ...

  7. 通过DDOS攻击流程图来浅谈如何预防Ddos攻击与防御

    DDOS攻击流程图 站长之家配图(来源:ppkj.net) 一 背景 在前几天,我们运营的某网站遭受了一次ddos攻击,我们的网站是一个公益性质的网站,为各个厂商和白帽子之间搭建一个平台以传递安全问题 ...

  8. 《sql注入攻击与防御 第2版》的总结 之 如何确定有sql注入漏洞

    看完<sql注入攻击与防御 第2版>后,发现原来自己也能黑网站了,就一个字:太爽了. 简单总结一下入侵步骤: 1.确定是否有sql注入漏洞 2.确定数据库类型 3.组合sql语句,实施渗透 ...

  9. CSRF——攻击与防御

    CSRF——攻击与防御 author: lake2 0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意 ...

随机推荐

  1. mybatis多表查询,自动生成id

    主要是在配置文件中,配置好所要包含的字段. 类关系:account----role,1对1 account包含role类 java类: public class Account{ private In ...

  2. web请求响应

    转载自:SanMaoSpace 1.Web开发的定义首先看看微软对Web开发的定义:Web开发是一个指代网页或网站编写过程的广义术语.网页使用 HTML.CSS 和 JavaScript编写.这些页面 ...

  3. php上传文件限制

    客户端限制(客户端限制在实际上是无法阻止上传): 通过表单隐藏域限制上传文件的最大值 <input type=’hidden’ name=’MAX_FILE_SIZE’ value=’字节数’ ...

  4. 【转载】Web开发技术发展历史-版本1

    原文在这里. Web开发技术发展历史 Web的诞生 提到Web,不得不提一个词就是“互联网”.Web是World Wide Web的简称,中文译为万维网.“万维网”和我们经常说的“互联网”是两个联系极 ...

  5. AC日记——Sagheer and Nubian Market codeforces 812c

    C - Sagheer and Nubian Market 思路: 二分: 代码: #include <bits/stdc++.h> using namespace std; #defin ...

  6. 洛谷P2236 HNOI2002 彩票 [暴搜]

    题目传送门 彩票 分析: 虽然题目标签上标的是Splay,但我一个蒟蒻至今也沒掌握平衡树,所以就索性一个暴搜,加一点剪枝就水过去了- 代码: #include<cstdio> #inclu ...

  7. Linux用户密码文件/etc/shadow相关

    (1).密码文件 [root@xuexi ~]# head -3 /etc/shadow root:$6$kcgcu794R0VP3fDL$aYN8XUbtWvZ4QQtT2xVW.N2CgE3YLP ...

  8. matlab学习之求解函数的根和极小值

    只是用来求解函数的部分一个根,具体算法没查询,只是调用自带的函数 代码如下 % 求函数零点和极小值 xiszero=func(0) x=-1:0.1:1.5; y=func(x); plot(x,y) ...

  9. PHP单例类

    单例模式按字面来看就是某一个类只有一个实例,这样做的好处还是很大的,比如说数据库的连接,我们只需要实例化一次,不需要每次都去new了,这样极大的降低了资源的耗费. 单例类至少拥有以下三种公共元素: 必 ...

  10. 关于SOA

    什么是SOA SOA:面向服务的体系结构(Service-Oriented Architecture,SOA,也叫面向服务架构), SOA是指为了解决在Internet环境下业务集成的需要,通过连接能 ...