现在的位置: 首页 > 软件开发 > 正文

MySQL字符串长度漏洞分析

2011年08月11日 软件开发 ⁄ 共 1588字 暂无评论 ⁄ 被围观 1,120+

SQL注入攻击一直都在被广泛的讨论,在MySQL中,我们常常会忽略这样两个安全隐患,那就是超长SQL查询和单列SQL字符长度限制可能会带来的问题。

首先我们来谈论一下超长SQL查询

MySQL配置项:

max_packet_size

这个东西是用来限制MySQL客户端和服务器通信数据包的长度的,比如一个查询为“select * from user where 1”,那么这个长度仅仅几十个字节,所以不会超标。在绝大多情况下,我们很难会超过MySQL的默认限制1M。对于MySQL来说,如果查询字符串的大小超过了这个限制,MySQL将不会执行任何查询操作。可以想象一下,1M的SQL语句还是很长的,为什么会产生如此长的SQL语句呢?往往是SQL语句中的某字段赋值字符串过长造成的,同样如果取出时字段内容过长也会造成超过max_packet_size大小而无法执行查询操作。

如果攻击者有可能控制你的SQL长度,那么你的程序可能会受到攻击。哪些情况攻击者可能控制SQL的长度呢,比如不限制关键字长度的搜索。还有可能就是你的程序如果要将用户的登录作为日志启用,总之凡是涉及到超长SQL查询的地方,一定得小心检查自己的SQL,防止超长而查询失效。数据库权限必须严格限制,WEB服务所用的帐号务必不能拥有系统变量设置权限,数据库仅允许管理员自行设置MySQL的max_packet_size的长度,或者在处理可能超长的SQL查询的时候做一个长度判断。

MySQL列长度限制

这个是本文的重点。MySQL对于插入的字符串,如果长度超过了数据表限制的长度,MySQL将会截取前面部分字符串插入数据库中,而不会将错误报给web程序。对于粗心的程序员,这个问题可能会导致程序的漏洞,其实多数成熟的采用MySQL作为数据库的WEB应用都会有很多限制,攻击者采用这个漏洞攻击应该没有任何作用。下面是几个假设,如果同时满足这几个条件,获取一个站点的用户名是相当容易的事情,所以我们在日常开发、运维中务必注意避免出现以下问题:

该web应用允许用户注册(开放注册的WEB应用满足此条件);
超级管理员的用户名已知的,比如admin,这样方便攻击者寻找目标(很多应用都采用了admin/root这样的用户名作为管理员用户名)
MySQL使用的是默认的配置(估计大多数都满足)
注册新用户的时候,程序没有对用户名的长度给予限制
用户名被限制在16个字符(这个和上面的没有关系,仅仅是方便举例)

下面我们来看看攻击者是怎么攻击的:

首先攻击者用已知的超级管理员id如admin注册,那么这个时候程序就会用

SELECT * FROM user WHERE username=\'admin\' 来检查该ID是否已经存在,如果存在,这不允许注册,当然,攻击者尝试注册admin肯定会失败;

但是如果攻击者用 admin            X (admin和X之间有11个或以上的空格)来注册呢,按照上面的判断,由于admin x不存在数据库中,所以当然就能注册成功了,事实上很多早期的WEB应用确实可以这样,由于列长度的限制在16个字符内,所以末尾的X就被截掉了,那么现在数据库中就存在两个一模一样的用户admin了。(简单的避免方法:只要把ID字段设置为UNIQUE就可以了,于是乎,下面的问题就和你没有关系了)

攻击者继续,这个时候攻击者就顺利的注册了admin这个用户名,然后攻击者用admin和自己的密码登录进入账户管理,由于真正的admin的帐号先于攻击者admin注册,所以在账户信息页面,显示的信息非常有可能就是真正admin的信息,包括密码提示和email等,这个时候攻击者就可以对admin的信息进行任意修改,包括密码和密码找回。

所以,我们做WEB开发时,应该仔细去检查一下自己的程序是否有此类的漏洞呢。

给我留言

您必须 [ 登录 ] 才能发表留言!

×
#