|
|
|
|
Blog信息
|
blog名称:四裤全输的小窝~~ 日志总数:178 评论数量:699 留言数量:198 访问次数:1161155 建立时间:2005年10月29日 | |
|
|
|
|
 |
|
|
|
|
[database][转]深入分析SQL SERVRE注入攻击
文章收藏, 网上资源, 软件技术, 电脑与网络 四裤全输 发表于 2007/2/14 11:33:56
|
说起Sql Server注入攻击想必大部分网管和Web开发人员都不会感到陌生,这种针对网站和数据的攻击方式可谓是臭名昭著,那么Sql Server注入攻击是如何形成的?又有什么办法有效的防范Sql Server注入攻击呢?这就是一个值得探讨的话题了,其实严格的来说这也不算是一个什么新鲜的话题,不过我在这里要说的,并不是传统的使用编程方式来防止注入攻击,而是探讨相关的数据库安全问题,首先,来说一下Sql Server注入攻击的原理,我们假设有一个安全性比较差的网站,上面有一个可供用户进行搜索的文本框(TextBox1),一般来说,程序员在编写代码的时候都会使用如下方法:
Select ProductNumber,Name,ListPrice From Product Where Name Like "'% TextBox1.Text %'"
现在一个图谋不轨的用户开始对这个网站发动了攻击,它在文本框中输入了如下字段:a' Union Select @@Version,@@ServerName,0;--%,那么上面这段语句会变成什么呢?相信有一定数据库基础的人都知道,代码会变成这样:
Select ProductNumber,Name,ListPrice From Product Where Name Like 'a' Union Select @@Version,@@ServerName,0;--%'
如果成功,那么会返回当年使用的数据库服务器名称以及相关的数据库版本,但是这并不是最为重要的东西,最为重要的是他知道了能够在你的网站上运行他需要的代码,从而展开攻击。
知道了原理,那么应该如何防范呢?这里有几种方法:
1、过滤关键字:把含有DDL(数据库操纵语句)的内容全部过滤掉,正常的访问是绝对不需要Insert、Select、Delete、Update和Exec这些代码的,也绝对不需要使用“'”这种符号。
2、使用CInt等转换函数进行转换:这种方法也比较容易实现,也是很多VB编程人员常用的办法,对于网页间的变量传递十分有效,在用户企图输入一个非法数据的时候程序本身会抛出一个异常。
3、使用存储过程:自从进入.Net时代以来,这种方法就经常被人们使用,原因是在.Net编程中这种方法比较容易实现,而且安全性也很高,它能够保证用户输入的数据始终被作为字符串处理,而不会当作是DDL。
4、数据库权限:这种方法是我们要着重讨论的方法,首先我们来回想一下用户攻击网站的全部过程,除了能够插入DDL之外,他还要能够有相关的执行权限,否则的话就算是能够使用DDL但是仍然会被数据拒绝操作,从而引发一个常规错误,现在的Web程序大部分都对Sql Server注入攻击有了很好的防范能力,但是关于数据库权限呢?事实上,我很少见到有关数据库权限设置防范注入攻击的说法,也很少见到有人使用,大部分的编程人员都习惯性的使用sa帐号,然后给相关用户赋予dbo权限,其实这种做法是错误的,sa是Sql Server内置的管理员帐号,这个帐号拥有最高权限,正式因为如此才应当尽量的少使用它,而不是广泛的使用sa帐号,大部分程序,根本就不需要使用sa帐号,很多Web应用程序对数据库的访问只是基于读写操作,那么使用sa帐号干什么?对于大部分网站,只需要赋予db_reader和db_writer两种权限就已经足够了,这两个权限能够满足基本的Select、Insert、Update和Delete操作,同时会拒绝Exec等执行操作,当然,像Sql Server注入攻击这类操作会被理所应当的拒绝,还有一种情况就是需要执行数据库中的存储过程,这个使用可能需要赋予相关用于的db_owner权限,这时你要考虑清楚,db_owner是数据库级的最高权限,能够在当前数据库中执行任何操作,如果你编写的前台代码没有任何问题还好,一旦有问题虽然不会导致整个服务器的不可用,但至少能够造成此数据库的不可访问,所以我还是建议不要轻易使用这种权限,如果要使用存储过程,应该在存储过程上直接赋予某个用户权限,而不是囫囵吞枣的用一个db_owner权限解决问题;另外一种值得注意的情况是,一个用户可能需要同时拥有两个数据库的访问权,这个时候就要看具体的情况而定了,按照总是赋予用户最小权限的理论,应当分出主要访问的数据库和次要访问的数据库,在部署好主要访问的数据库之后,看看需要次要访问的数据库的数据分布情况,如果需要访问的数据主要集中在几张表上,那么应当直接对表赋予相应的DDL权限,比如,一个用户只需要查询一张表的数据,那么就应当给这张表Select权限,而不是把db_reader权限赋予这个用户,如果用户需要访问的数据过多,那么应当尽可能的赋予最小权限,比如赋予db_reader和db_writer权限。
总的来说,对于Sql Server攻击的防范不能仅仅的停留在代码层上,最根本的工作是做好数据库的安全工作,在工作越来越细化的现代化社会中,一个公司分别拥有数据库管理人员和代码编写人员已经不是什么稀奇的事情了,程序编写人员有责任修改程序中出现的Bug而数据库管理人员则应当保障数据库安全。
|
阅读全文(2304) | 回复(0) | 编辑 | 精华 |
|
|
|
|
|
|
|