DOS ATTACKS USING SQL WILDCARDS(SQL通配符拒绝服务攻击)

DOS ATTACKS USING SQL WILDCARDS(SQL通配符拒绝服务攻击)
原作者:Ferruh Mavituna
1 什么样的应用容易被SQL通配符攻击
(1)拥有SQL后台
(2)数据库拥有300条以上的数据,同时每行数据超过500个字节
(3)有一个应用程序级别的搜索功能

2 搜索查询
SQL服务器支持下列通配符在LIKE查询中”%”,”[]”,”^”和”_”
如果你在搜索框里输入”foo”, SQL查询的结果应该是
SELECT * FROM Aricle WHERE Content LIKE ‘%foo%’
上面这个查询通常在拥有100000条数据的数据库中查询时间将少于1秒。

下面这个查询在只有2600条记录的情况下花费了6秒
SELECT TOP 10 * FROM Article
WHERE Content LIKE
‘%_[^!_%/%a?F%_D)_(F%)_%([)({}%){()}£$&N%_)$*£()$*R”_)][%](%[x])%a][$*”£$-9]_%’
如果攻击者在这6秒中内又执行一个如下查询
SELECT TOP 10 * FROM Article
WHERE Content LIKE
‘%_[^!_%/%a?F%_D)_(F%)_%([)({}%){()}£$&N%_)$*£()$*R”_)][%](%[x])%a][$*”£$-9]_%’
OR Content LIKE
‘%_[X_%/%a?F%_D)_(F%)_%([)({}%){()}£$&N%_)$*£()$*R”_)][%](%[x])%a][$*”£$-9]_%’
OR Content LIKE
‘%_[()_%/%a?F%_D)_(F%)_%([)({}%){()}£$&N%_)$*£()$*R”_)][%](%[x])%a][$*”£$-9]_%’
那CPU在100%的负载的情况下将要执行36秒。

3 SQL通配符拒绝服务攻击测试
测试过程相当简单,就是创建包含很多通配符的查询让系统不能返回一个正常值。

4 连接池
攻击查询的时间依赖于应用程序连接池的设定。
ASP.NET的默认设置是,最大连接数量是100,30秒超时。如果我们进行100多个都超过30秒的查询,那其他人就根本无法正常使用这个系统了。
连接池耗尽攻击将会消耗一部分的CPU资源,在数据库服务器上进行常时间的运行对他们来说是足够的了。另外一个理由是长时间查询时可能包括了有问题系统调用代码,相当的NDS查询和HTTP请求。

5 构建搜索关键字
构建搜索关键字需要注意以下几点:
(1)首先要确定数据库是否能搜索所有数据
(2)每个OR语句需要有所不同,否则数据库会自动优化这些语句。至少每个语句之间要修改一个字符
(3)对于Microsoft SQL Server,我的经验是在每个字符后加入“[”将导致更长的执行时间。
LIKE ‘%_[a[! -z]@$!_%                                                                             – 1050 ms.
LIKE ‘%_[aaaaaaaaa[! -z]@$!_%’                                                                – 1600 ms.
LIKE ‘%_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[! -z]@$!_%’         – 3700 ms.
(4)更长的查询将导致更长的执行时间。所以我们要构建应用程序允许范围内足够长的查询。
(5)开始和结尾加上“%”也会导致更长时间的查询
(6)每次查询需要有所不同,不然有些应用是有查询缓存存在的。
(7)对于不同大的目标系统和数据需要组合不同的查询。

6 真实影响
对于含有搜索功能的系统的后台数据库都有影响。
这里我们将使用2个论坛系统作为范例。一个是基于ASP.NET+SQL Sever,另外一个是ASP+SQL Sever
(1)在2000条记录的情况下就导致了数据库连接超时,查询时间超过30秒
(2)范例系统在带宽1.5M的情况下在2分钟内停止运行
这里我并不是说只有论坛系统有问题,其他任何WEB应用系统都有这样的问题。

7 其他DBMSs
这个文章里并没有说到其它数据库,但是其实其他数据库对于这种攻击同样是非常脆弱的,只是SQL Sever是LIKE通配符查询攻击的主要数据库
以下的搜索操作对于这个问题同样是脆弱的:
(1) PostgreSQL 正则表达式匹配 (~)
(2)SQL Sever全文查询(CONTAINS)
(3)MS Access LIKE查询 (LIKE)
(4)MySQL 增则表达式 (REGEXP)

8 增加攻击的效果
如果应用程序允许你选择字段查询:
(1) 通过OR来搜索它们,然后选择所有字段
(2)如果它是使用AND操作来搜索的,那就选择最大的字段,而不要选择一个varchar类型,也不要使用使用空格来避免许多AND条件。
尽可能的选择OR条件来进行查询。
让应用程序尽可能的使用连接表,组合多个表进行查询
通过OR来联合多个表达式,使用空格在多个关键字中间。例如: _[r/a)_%_fm_ _(r/b)_ _(r-d)_

9 DDOS(分布式拒绝服务攻击)攻击
如果一个应用程序接受通过GET请求的搜索查询,那攻击者就可以使用“WEB SPAMMING TOOL”来自动注册论坛,发送带有攻击代码相关信息和BLOG回复或者发送带有搜索URL的图片。通过这些方式攻击者就可以用其他网站访问者对目标应用进行攻击。
攻击者可以执行XSS攻击通过一些公共的web网站,然后发送”ifram”或者”image”标记来攻击应用。

10 应用程序级别的DOS
我们前面的攻击只是对于数据库服务器产生影响,而对于应用程序本身是没有影响的。
我们需要让应用程序返回尽可能多的记录。这可以让应用程序依赖应用程序的算法和SQL查询进行处理。假设应用程序要返回10W条数据由于有问题的SQL查询分页,这将导致CPU消耗大量的资源在应用程序和数据库层上。
在现实中,我们经常可以发送“-1”等不存在的请求分页。
如:http://www.codeplex.com/subsonic/WorkItem/View.aspx?WorkItemId=16112
分页问题不光在搜索页面存在,同样也存在于当查询条件不存在的时候分页。

11 SQL注入和DOS攻击
如果一个应用对于SQL注入没有防范的话SQL注入是相当平常的,我们在没有SQL注入的情况下也可以进行DOS攻击。不同的DBMS支持不同的复杂应用上无限循环。
一些DBMS同样支持一些特别的功能如MySQL的BENCHMARK就允许重复的执行一个功能。
根据攻击者的权限,攻击者可以很轻易的DROP掉数据库中所有表。甚至还可以关闭系统和数据库服务器。

12 防范
对于需要过滤的通配符在程序上需要返回。程序上要限制一些通配符的使用
限制搜索:最好不要有高级搜索功能,没有高级搜索功能就过滤所有的通配符。
使用验证码
限制每个用户的CPU使用时间
白名单:只有哪些字符能够使用
验证码安全
限制SQL查询执行的时间
防止应用程序级别的DOS:在查询时使用LIMIT或者TOP类似的关键字能够保护应用程序不被DOS攻击。

关于 Timo
XNIX SA & MYSQL DBA

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: