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攻击。