网站安全防范——Sql注入专题

 

注:这篇文章曾经写在我原来的博客上面,现在转过来,以后新浪博客会删除掉的。

SQL注入定义

目前没有对SQL注入技术的标准定义,微软中国技术中心从2个方面进行了描述:

(1) 脚本注入式的攻击;
(2) 恶意用户输入用来影响被执行的SQL脚本;

SQL注入主要是通过SQL脚本注入到程序中运行,导致被攻击系统信息被破坏的一种Web系统安全攻击方式。

 

SQL注入原理

SQL注入攻击就其本质而言,它利用的工具是SQL的语法,针对的是应用程序开发者编程过程中的漏洞,SQL注入是存在于常见的多连接的应用程序中一种漏洞,攻击者通过在应用程序中预先定义好的查询语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的任意查询。这类应用程序一般是网络应用程序(Web Application),它允许用户输入查询条件,并将查询条件嵌入SQL请求语句中,发送到与该应用程序相关联的数据库服务器中去执行。通过构造一些畸形的输入,攻击者能够操作这种请求语句去获取预先未知的结果。

SQL注入简单示例

http://www.19cn.com/showdetail.asp?id=49

对于这样一个地址,相信只要是涉及到网站制作的人都会很熟悉,在这个URL中"?"前面的是网站中的一个动态页面“showdetail.asp”,后面的是一个参数,在showdetail.asp的这个页面会根据ID=49这个条件查询数据显示数据;常用的代码应该如下:

 

 

上面这段代码只要制作过代码应该会比较清楚,如有疑问请查询Asp代码技术VBScript;

SQL注入攻击者在获取到“http://www.19cn.com/showdetail.asp?id=49”这个URL之后,就能对这个URL进行测试,测试如下:

http://www.19cn.com/showdetail.asp?id=49  and 1 =1

这个语句在程序中会如下执行:

 

懂SQL语法的人应该很清楚“select *  from  table1 where id= 49  and 1 =1”的执行结果和“select * from  table1 where id=49”的执行结果是一模一样的。

如果在没有进行SQL注入防范的Web程序中,“http://www.19cn.com/showdetail.asp?id=49  and 1 =1”和

http://www.19cn.com/showdetail.asp?id=49”的访问结果是一样的,这样就测试出这个网站可以注入SQL代码,而这个“http://www.19cn.com/showdetail.asp?id=49”这个URL就称做SQL注入点。

SQL注入第一步:猜表

还是拿上面这个列子来说:

http://www.19cn.com/showdetail.asp?id=49  and  exists(select * from sysobjects where name = ‘admin’)

得到sql执行代码为:

select *  from  table1 where id= 49  and  exists(select * from sysobjects where name = ‘admin’)

如果数据库中存在“sysobjects”这个表而且有数据,则这句话会与之初的页面返回同样的结果,如果不存在这个表或者这个表不存在数据则会返回空,以此可以判断这个数据库的表结构,当然如果用人工一个表一个表来猜可能会比较慢,网络中存在SQL注入工具能够大大加快这个速度。

SQL注入第二步:猜字段

http://www.19cn.com/showdetail.asp?id=49  and  exists(select a.* from sysobjects as a,syscolumns as b where a.name = ‘admin’ and a.id =b.id )

得到的Sql执行代码为:

select *  from  table1 where id= 49 and  exists(select a.* from sysobjects as a,syscolumns as b where a.name = ‘admin’ and a.id =b.id )

这个代码如果表sysobjects存在admin字段则会返回与之初相同的结果。

SQL注入第三步:破坏

到此,你的数据库再也没有任何安全性可言,攻击者可以对你数据库添加数据,删除数据,更新数据,进行任何破坏。

http://www.19cn.com/showdetail.asp?id=49 insert into admin (username,password) values (‘admin’,’123456’)

这条语句则是插入语句。

从上面几步就可以看出SQL注入攻击是多么简单的一件事,在没有防范的Web系统中,无论您的网站设计多么有型,无论您的网站美工做得有多美,在攻击者眼中,都是漏洞百出的危险品,就像脱光衣服在大街上跳舞的美女。

 

SQL注入防范

在说SQL注入防范之前,我们首先了解SQL注入存在的方式:

(1)URL之后参数攻击

(2)需要页面提交的用户注册

对于第一种在上面所述的简单SQL注入示例中已经做过讲解了,而第二种方式常常出现在登录框或者注册页面中,如下:

网站安全防范鈥斺擲ql注入专题

在这个登录框中,如果没有进行SQL注入防范的就可能出现以下情况,在用户名之上填写“dd’ and 1 = 1 ”这样的字符串,在用户登录的页面一般会等用户名判断和用户密码检查的操作:

Select count(*) from table1 where username =‘dd’ and 1 = 1 -- and password = ‘用户密码登陆框内容’

可以看出上面的页面的语句也SQL注入了代码,根据上述讲的SQL注入原理很容易就把SQL注入代码注入到系统中。

对于上述方式,笔者也对注入点在SQL程序的角度进行了一些总结:

1.2 常见的SQL注入式病毒的方法

1.2.1 常见的SQL注入式病毒是在条件部分;查询目标部分;其他排序、分组等部分。至于的检索来源部分很少出现。

1.2.1.1    查询目标部分

1.2.1.1.1 正常SQL语句

SELECT * FROM TABLE1

1.2.1.1.2 修改后的SQL语句,粗红体为非法部分

SELECT ''; select * from TABLE2 --* FROM TABLE1

1.2.1.2  条件部分

1.2.1.2.1 正常SQL语句,字符类型

SELECT * FROM TABLE1 WHERE F1='Correct Value'

1.2.1.2.2 修改后的SQL语句,粗红体为非法部分,可以在任何地方注入。

SELECT * FROM TABLE1 WHERE F1='Co'; select * from TABLE2 --erect Value'

1.2.1.2.3 正常SQL语句,数字类型

SELECT * FROM TABLE1 WHERE F2=200

1.2.1.2.4 修改后的SQL语句,粗红体为非法部分。

Method1: SELECT * FROM TABLE1 WHERE F2=''; select * from TABLE2 --200

Method2: SELECT * FROM TABLE1 WHERE F2=200; select * from TABLE2 --

SQL注入防范原则:

 

1.3.1 格式化处理

1.3.1.1    用户只能传入格式化字符串

1.3.1.2    系统解析用户的格式化字符串,生成标准SQL代码或SQL代码片段。

1.3.1.3    将系统产生的SQL代码片段传入DS层执行。

1.3.2 直接处理内容

1.3.2.1    格式化处理只能是有限的,如果用户提供部分是内容部分,则不能采用格式化处理

1.3.2.2    此类常常是出现在页面参数部分(GET或POST方式),将用户提供部分作为可能的内容传递到SQL语句中。

1.3.2.3    需要将字符型字符串中的单引号“'”,替换为两个连续的单引号“''”

1.3.2.4    对于数字型的参数,需要事先进行类型检测。由于.NET平台是有类型变量,因此对于数值型变量不需要额外处理,在参数传递过程中就能发现错误。

1.3.2.5    对于日期型的参数,同样需要事先进行类型检测。

1.3.2.6                                                   直接处理在HSF规范的层次理论中,需要在DA层实现。在DA层只需要实现字符型的处理。将需要处理的字符串中的单引号“'”替换为两个连续的单引号“''”。

1.3.2.7   “'”、“;”、“-”的转码字符同样需要进行替换。一旦出现上述符号的转码字符串,采用直接删除的做法进行处理。对应关系:

“'”:char(39)、“;”:char(59)、“-”:char(45)。

Web程序常见具体处理方法

(1)动态页面换成静态页面

静态页面则不可能出现SQL注入点了,这个应该是很有效的方法。

(2)对传递的参数进行关键字过滤

http://www.19cn.com/showdetail.asp?id=49
对id这个参数是否为数字进行判断
http://www.19cn.com/showdetail.asp?name=name1
对name字符串类型的进行关键字过滤

一般来说页面传递的参数以上面的两种比较常见,只要把握了好度还是比较简单防范。如果传递的参数包含特殊字符的,则需要特别对待了。

(3)使用参数化语句查询
http://www.19cn.com/showdetail.asp?id=49
查询语句:sqlString = “select * from table1 where id= @type”
SqlCommand myCommand = new SqlCommand(sqlString, myConnection);
            myCommand.CommandType = CommandType.Text;
            myCommand.Parameters.Add("type", SqlDbType.Int);
            myCommand.Parameters[0].Value = int.Parse(id);

这种方式在ASP.Ne比较常见,简单易用,非常有效。

(4)添加注册码检查

在注册登录页面中的SQL注入问题,添加注册码检查是一个比较安全的防范,因为在SQL注入工具进行破解的时候,注册码这个是无法通过的,所以一般的需要页面提交的都增加一个注册码比较安全。

检测sql注入的常用工具

(1)IBM Rational AppScan  --来自IBM Rational工具,不仅仅sql注入,全面权威。
(2)啊D、NBSI、HDSI、WED、冰舞、CSC和Domain 网络上面常用的注入 对数据库表猜解方面比较全面。
(3)HP WebInspect  
(4)Nikto  -这是一个开源的Web服务器扫描程序,它可以对Web服务器的多种项目(包括3500个潜在的危险文件/CGI,以及超过900个服务器版本,还有250多个服务器上的版本特定问题)进行全面的测试。
(5)Paros proxy这是一个对Web应用程序的漏洞进行评估的代理程序,即一个基于Java的web代理程序,可以评估Web应用程序的漏洞。它支持动态地编辑/查看HTTP/HTTPS,从而改变cookies和表单字段等项目。它包括一个Web通信记录程序,Web圈套程序(spider),hash 计算器,还有一个可以测试常见的Web应用程序攻击(如SQL注入式攻击和跨站脚本攻击)的扫描器。

http://www.cnblogs.com/webtrados/archive/2009/10/01/1577301.html --十大web安全扫描工具


Sql注入相关的一些链接

http://www.secnumen.com/technology/anquanwenzhai.htm 华城瑞安关于sql注入的专题
http://q.yesky.com/group/review-8597655.html  天极sql盲注的相关论述
http://www.cnetnews.com.cn/2009/0422/1364370.shtml  图文详解网站SQL注入攻击解决全过程
http://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A 维客SQL資料隱碼攻擊
http://news.csdn.net/n/20080626/116978.html SQL注入攻击的种类和防范手段

希望大家通过对SQL注入技术比较了解,在Web系统中加入这些防范元素,让自己的系统更加安全。

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值