SQL与网络数据库的安全
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL与网络数据库的安全
作者:孙世刚
来源:《消费电子·理论版》2013年第11期
摘要:有些网络数据库没有过滤客户提供的数据中可能存在的有害字符,SQL注射是利用插入有害字符对网络数据库进行攻击的技术。
容易防范,但因特网上仍有惊人数量的存储系统易受这种攻击。
关键词:SQL;SQL注射;网络数据库
中图分类号:TP311.1 文献标识码:A 文章编号:1674-7712 (2013) 22-0000-01
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。
由于部分程序员在编写代码的时候,没有对用户输入数据的合法性进行检查和判断,使应用程序存在安全隐患。
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些想得知的数据,这就是SQL Injection,即SQL注射,SQL注射已经成为影响网络数据库安全的一大隐患。
SQL注射是从正常的WWW端口访问,表面看来和一般Web页面访问没什么区别,不会引起防火墙的怀疑。
如果网站管理员没有查看日志习惯的话,就更不容易发现SQL注射了。
SQL注射的手法相当灵活,在注入的时候会碰到很多意外的情况。
本文介绍一些SQL注射方法和防范方法。
目前,国内网站用ASP+Access或ASP+SQLServer的占70%以上,PHP+MySQL的占20%,其他的不足10%。
一个简单SQL注射的例子:
假设有这样一个网址:http:///showdetail.asp?id=18,如果在这个地址后面键入一个单引号“'”,即变成http:///showdetail.asp?id=18',回车后会发现:页面有如下提示:Microsoft JET Database Engine错误'80040e14'字符串的语法错误在查询表达式“ID=18'”中/showdetail.asp,行8。
从这个错误提示能看出下面几点:
(1)网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。
(2)程序没有判断客户端提交的数据是否符合程序要求。
(3)该SQL语句所查询的表中有一名为ID的字段。
上面所说的是SQL注射最简单的一种,即直接在URL地址后面加上一个单引号。
此方法通常不能成功,不一定每台服务器IIS都返回具体错误提示给客户端,如果程序中加了cint参数语句的话,SQL注射不会成功,服务器会报错,具体提示信息为“处理URL时服务器上出错,请和系统管理员联络。
”另外原因是部分对SQL注射有一点了解的程序员,会把单引号过滤掉,如果用单引号测试,是测不到注射点的。
下面列出三个地址:
(1)http:///showdetail.asp? id=18
(2)http:///showdetail.asp? id=18;and 1=1
(3)http:///showdetail.asp? id=18;and 1=2
大家能够看到,三句之间的区别就在于第二句多了“and 1=1”,第三句多了“and 1=2”,其中1=1是一个真命题,永远为True,逻辑上为1;1=2则是一个假命题,永远为False,逻辑上为0。
这种方法非常经典,其原理是数理逻辑中关于命题的阐述。
(1)和(2)都能够正常显示,但是(3)会报错(提示BOF或EOF、或提示找不到记录、或显示内容为空)。
如何判断网络数据库的类型。
ASP最常搭配的数据库是Access和SQL Server。
具体如何判断数据库到底是Access还是SQL Server呢?
SQL Server有一些系统变量,如果服务器IIS提示没关闭,并且SQL Server返回错误提示的话,那可以直接从出错信息获取,方法如下:
http:///showdetail.asp? id=18; anduser>0
这句简单语句包含了SQL Server特有SQL注射方法,其效率极高。
它的含义:前面的语句是正常的,重点在“and user>0”,我们知道,user是SQL Server的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。
拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转换过程中肯定会出错。
提示是:将nvarchar值“visitor1”转换数据类型为int的列时发生语法错误,visitor正是变量user的值,不废力就拿到了数据库的用户名。
如果提示的不是“visitor1”,而是sa,那么就拿到了SQL Server数据库的管理员权限,因为在SQL Server中,sa就相当于administrator。
如果IIS设置成不返回错误,那么这个方法就无法获得错误提示,下面在从SQL Server和Access的区别来探讨这个问题。
SQL Server和Access都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。
针对SQL Server和Access,列出下面两个地址:
(1) http:///showdetail.asp?id=18;and (select count(*) from sysobjects)>0
(2) http:///showdetail.asp? id=18;and (select count(*) from msysobjects)>0
如果数据库是SQLServer,那么第一个网址的页面与原页面http:
///showdetail.asp? id=18是大致相同的;而第二个网址,由于找不到表msysobjects会提示出错。
如果数据库是Access,那么第一个网址的页面会报错;第二个网址,则视数据库设置是否允许读该系统表,一般来说是不允许的,所以与http:///showdetail.asp? id=18也是完全不同。
所以,通过这两个网址,就能够方便地得知系统所用的数据库类型。
下面对SQL注射中使用的参数进行分析:(1)http:///showdetail.asp?
id=18中,“ID=18”的参数是数字类型,对应的SQL语句大致如下:Select column_name from table_name where字段=18。
可以进行如下注射:将ID =18后面加上“And查询条件”,其对应的SQL语句为:Select column_name from table_name where字段=49And查询条件。
(2)http:///showdetail.asp?type=car,“type=car”的参数是字符型,对应的SQL语句大致如下:Select column_name from table_name where字段='car'。
可以进行如下注射:将
type=car后面加上“and查询条件and' '=''”,其对应的SQL语句为:Select * from表名where字段='连续剧'and [查询条件] and ' '=' '。
(3)有的网站在处理搜索时,能够过滤关键字,其URL 地址显示为http:///search.asp,但有的网站并没有过滤参数,URL地址后面会显示“keyword=关键字”之类的,那么其对应的SQL语句大致如下:
Select column_name from table_ name where字段like' %关键字%'
注入的参数为keyword=' and [查询条件] and ' %25'=' ,即是生成语句:
Select * from表名where字段like ' %' and [查询条件] and ' %' =' %'
下面介绍另外一种SQL注射的方法。
通过联合查询插入UNION SELECT来绕过网络程序查询数据,得到其它数据,联合查询允许在一条语句中使用多个SELECT查询,就像这样:
SELECT CompanyName FROM Shippers WHERE 1 = 1 UNION ALL SELECT CompanyName FROM Customers WHERE 1 = 1
它返回结果中包含了第一个查询和第二个查询结果,"ALL SELECT"这里的ALL是必须的,可逃过SELECT DISTINCT语句的限制。
须确认第一个查询,即web应用程序编写者希望执行的那个被执行,不返回任何记录。
如何解决SQL注射问题呢?一要了解SQL注射的根本原因。
SQL注射多发生在
ASP+SQL Server上,因为很多服务器都允许SQL多语句一次执行,就是类似:asp? id=123;use master;execxp_cmdshell。
应当将其禁止。
要设置好数据库权限,另外可以将管理员用户名sa改掉。
三要对输入的语句设置过滤。
参考文献:
[1]沈海峰.SQL与网络数据库的安全[D].湖北职业技术学院,2007.。