您的位置 首页 php

WAF的SQL注入绕过手段和防御技术

. 关于 SQL 注入

SQL注入是一种常见的入侵WEB应用的手法。SQL注入是利用应用系统的编程漏洞和SQL语言的语法特征,改变原始的SQL语句执行逻辑而产生的。

攻击者向Web应用发送精心构造的输入数据,这些输入中的一部分被解释成SQL指令,改变了原来的正常SQL执行逻辑,执行了攻击者发出的SQL命令,最终使攻击者获取Web应用的管理员权限或者下载了Web应用存到数据库中的敏感信息。

.SQL 注入如何实现

为了对本文进行更好的讲解,下面简单地对SQL注入的原理进行示例性说明。

如下图是某网站的登录界面。

登陆界面中输入用户名:admin 密码admin1234。在Web应用程序后台会把输入和程序混合变成SQL命令去访问数据库。最终Web应用发给后台数据的SQL命令是:

Select * from users where username = ‘admin’ and Password = ‘admin1234’(这个形式)

这个SQL查询要求数据库检查“用户表”中的每一行,提取出每条username列为admin和Password列值为admin1234的记录。如果数据库中WHERE后的条件满足。应用程序将为该用户建立一个通过验证的会话。(Web应用登陆成功)

上面是正常登陆Web应用的过程。如果由于编程的不严谨,用户名或密码输入处存在SQL注入点,攻击者可以利用SQL注入绕过Web应用的登陆访问控制。例如攻击者在用户名处输入admin’– 密码处可以输入任意值均可通过。

因为,后台实际的SQL语句将演变成:

select * from users where username =’admin’–‘ and password =’123dq

在SQL Server中“-”等于注释,由于加入了“—”上面的语句等价于

select * from users where username= ‘admin’

也就是说只要有用户名为admin。攻击者就可以直接用admin登入到应用系统中。

当然SQL注入的用法远不止这一种,本文不做详述。

.WAF 如何防御 SQL 注入

WAF简单说,就是解析HTTP请求,检验HTTP中参数是否存在攻击行为;若存在,则触发攻击行为。

主要有两种主流的的方式绕阔WAF,一种是利用WAF可能存在的HTTP协议解析缺陷,另一种就是利用包装后的SQL命令,使WAF无法识别SQL注入。

一般通过HTTP协议攻击的方式,有四种绕过WAF入侵的手法:

(1)断包绕过

某些早期版本的WAF不具备把TCP断包组合成完整TCP包的能力。一旦攻击者发送的HTTP请求包是断包,WAF将无法正常处理不完整的HTTP请求包。如果这些请求包中含有SQL注入语句就可以直接绕过WAF,进入web应用组成SQL注入语句。

(2)缓冲区溢出

现在的WAF产品基本都具备了对HTTP协议中参数的解析能力。但是攻击者如果故意在参数中写入过长的占位内容+shellcode,这时如果WAF产品自身对参数检验不够严格的话,则有可能导致缓冲区溢出的发生。例如改变id=1的输入为id=1 and select 0xAAAAAAAAAAA…(1000个以上)+shellcode的模式。攻击者可能会利用这种入侵手段,绕过WAF进而入侵到应用系统内部。

(3)协议不兼容

还有一种方式就是向WEB服务器发送畸形的,而非RFC2616标准的HTTP请求,这时WEB服务器可能出于兼容的目的,会尽可能解析畸形的HTTP请求,这种情况下如果WAF和WEB兼容的方式不一致则可能出现绕过现象。例如一个请求没有协议字段、没有HOST字段,apache默认会把HTTP协议作为0.9版本处理,HOST默认使用apache自身的servername。[s1] WAF出于兼容的目的,这时候未必能和web服务器上的server采取相同的策略。由于不同版本的HTTP有语法差异,这种情况就有可能绕过WAF进入系统内部。

(4)参数污染

参数污染简单说就是同名参数写多个,WAF往往只检查第一个参数。但服务器具体用哪个参数,策略是不相同的。

例如:xxx. php?id=0&id=7%20union%20select%201,2,3,current_user是个明显的SQL注入。WAF解析id=0 这一看就是合法的,但PHP解析得到的确是 id=7 union select …..却是个注入语句。不同的server有不同的解析方式,这个时候WAF很有可能被绕过。

通过SQL命令包装的方式绕过WAF,是利用WAF在进行SQL命令的防御的核心技术正则匹配的缺陷。这种技术,一般通过4种匹配事变的方式进行方式::

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

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

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

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

针对以上的防御手段,黑客们总结出了一些绕过WAF的攻击手段,比如:

(1)大小写绕过

最简单基础的一种绕过方式比如关键字SELECT早期由于正则匹配规则不健全SElect 是无法分辨出是SELECT 的导致WAF绕过,而后面的数据库则会正确解析成SELECT。

(2)编码绕过

在大小写绕过的基础上开始出现编码绕过。主要有三种:URL编码、十六进制编码、Unicode编码。在浏览器中输入URL会进行一次URL编码,黑客会通过多次编码来进行WAF绕过。例如:Id.php?id=1%2520union/**/select ,数据库得到的Id.php?id=1 union/**/select。如果只解码一次得到的是Id.php?id=1%20union/**/select,就有可能绕过WAF入侵数据库。这个问题可以采用多次循环解码来处理。其中Unicode编码种类很多,如果只是基于黑名单过滤,无法处理全部情况,从而也可以实现WAF的绕过。其中UTF-32编码曾经实现过对GOOGLE的绕过。

(3)注释绕过

不但可以采用编码改写关键字,还可以采用注释改写关键字,避免正则匹配。例如

z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4’union%a0select pass from users# 。就是用符号编码代替一部分字母和判定的空格来逃避正则匹配。(selectxxx不会被拦截,因为可能是函数名等。select 空格xxx则一定会被拦截,去掉空格成为绕过的关键)。同样还有针对MYSQL版本的/*!5000union*/系列。

(4)等价替换

等价替换是个比较大的分类,主要可以分为等价函数、等价符号、特数符号、比较符号等4类

等价函数,就是同功能函数替换。WAF禁止了一些函数,但对另外一些函数没有禁止例如Substring()可以用mid(),substr()这些函数来替换,还可以采用生僻函数迂回完成原函数的功能,这些都可能成功实现WAF关键字绕过。and or 这种关键字在PHP中可以用|| 和&&代替,语句id=1 or 1=1就可以写成id=1 || 1=来进行绕过。同样,= 、>、<等都可以代替等号进行绕过。

除去绕过关键字和关键符号外,最关键的是绕过空格。想各种方式避免空格出现。

例如原句 id=1 or 1=1

可以写成:

id=1+or+1=1

id=1%0bor%0b1=1

id=1–s%0aor–s%0a1=1

id=1/*!or*/1=1

id=1()or(1=1)等多种形式进行尝试绕过

数据库防火墙协助 WAF 应对 SQL 注入

实际上WAF无法对各种SQL注入的绕过手段进行穷举;因此 WAF提供了各种扩展,以帮助用户根据实际情况进行规则扩展,以应对各种新的攻击,不如黑名单策略;但大量的规则将使WAF的性能大幅下降,进而影响整个系统的性能;同时可能还会造成某些误杀。

因此更有效的方法是在WEB应用和数据库之间加入数据库防火墙。数据库防火墙对从WEB应用发向数据库的SQL语句进行语法解析,对符合SQL注入特征的攻击行为进行告警和阻断。

下面是加入了防火墙后的拓扑架构:

数据库防火墙的防护策略、手段都是基于SQL协议解析而来;数据库防火墙在防止SQL注入上彻底的解决了WAF以牺牲性能为代价的方式。数据库防火墙和WAF配合使用的部署方式,将会使用户的核心数据更加安全。

数据库防火墙对SQL注入的防止,核心优势的之一在于它的部署位置,部署位置在应用服务器之后。无论攻击者采用了什么方式进行SQL注入攻击行为的包装,最终发送到数据库端的都是纯净的SQL语句。

数据库防火墙的核心优势之二,它是通过SQL语法解析技术而不是正则匹配技术进行SQL注入防御。通过SQL语法解析技术的性能更高,准确度更高。

数据库防火墙的核心优势之三,它具备综合防御的手段,以帮助即使被注入后的安全损失降到最低点。

数据库防火墙可以并通过以下四点实现整体的安全防护:

1.判断语句是否含有明显的SQL注入特征,有则阻止

2.语句的高危命令被发现,进行告警或阻断

3.语句访问的对象是否属于该用户访问权限,若无则阻断

4.限制语句的返回行数,超过返回行则阻断

加入数据库防火墙后,数据库防火墙会在数据库之间获取WEB应用发送给数据库的SQL语句。通过拿到的SQL语句,按照不同数据库进行SQL协议解析。

通过协议解析把应用发送的SQL语句还原成标准模式(去掉各种加入的符号,转译码等),攻击者曾经使用的可绕阔WAF的手法,在这里都将被干掉,将变为更加纯净的SQL语句。

基于这些纯净的SQL语句,与预定义的SQL注入特征进行匹配,如:

常量表达式和注释的组合

常量表达式和Union的组合

带外函数的调用

拼接字符与or的组合

常用注入SQL函数等

除了SQL注入的特征的匹配外,一些高危的命令将被告警或阻断,如truncate、drop、delete nowhere、insert nowhere等高危操作进行阻断;防止攻击行为造成大的灾害事故。

同时,可以对应用发来的SQL语句,进行操作和对象的细粒度权限控制,可以防止应用访问一些敏感表;比如防止对SQL注入侦察阶段常用的系统表的访问。

即便有SQL注入被发送到数据库端,数据库防火墙也会通过行数控制来进一步限制数据库每次的返回结果行数,对于大批量的数据返回将进行阻断,比如我们可以将某些敏感表的返回行数设定为不允许超过100,从而把损失减到最小。

通过数据库防火墙无疑比WAF对SQL注入的防止更加彻底。

[s1]语句有问题

文章来源:智云一二三科技

文章标题:WAF的SQL注入绕过手段和防御技术

文章地址:https://www.zhihuclub.com/79365.shtml

关于作者: 智云科技

热门文章

网站地图