[置顶] SQL注入安全分析

 

 

(一)       应用环境列表

网络互联设备操作系统

序号

操作系统名称

设备名称

脆弱性

1

IOS_路由器_内部_1

route1

 

2

IOS_路由器_VPN_1

路由器_VPN_1

 

3

IOS_路由器_VPN_2

路由器_VPN_2

 

业务应用软件

序号

软件名称

主要功能

脆弱性

1

安全电子邮件服务系统web应用平台

安全电子邮件服务系统运行平台程序

管理界面暴露

主机(存储)操作系统

序号

设备名称

操作系统/数据库管理系统

脆弱性

1

Web邮件服务器

Windows Server

 

数据库管理系统

序号

设备名称

操作系统/数据库管理系统

脆弱性

1

数据库服务器

Sql Server 2000

 

 

(二)       SQL注入攻击的简单示例

statement :=  "SELECT *FROM Users WHERE Value= " + variable + "

这条语句是很普通的一条SQL语句,他主要实现的功能就是让用户输入一个编号然后查询处这个编号对应的信息。但是若这条语句被改装,就可能成为破坏数据的黑手。如攻击者在输入变量的时候,输入以下内容admin’;drop table Users--。那么这条SQL语句在执行的时候就变为了SELECT* FROM Users WHERE Value= ‘admin’;drop table Users--。

篡改后的语句具有什么样的功能呢?首先‘admin’后面的分号表示一个查询的结束和另一条语句的开始。Users字符串后的双连字符,指示执行器当前行余下的部分只是一个注释,应该忽略。如果修改后的代码语法正确,则服务器将执行该代码。系统在处理这条语句时,将首先执行查询语句,查到用户编号为”admin” 的用户信息。然后,数据将删除表Users(前提是Users表没有内外主键关联情况下,则删除操作就会成功)。只要注入的SQL代码语法正确,便无法采用编程方式来检测篡改。因此,必须验证所有用户输入,并仔细检查在您所用的服务器中执行构造 SQL命令的代码。

 

 

(三)       Sql注入安全攻击原理

1)       SQL注入是目前比较常见的针对数据库的一种攻击方式。在这种攻击方式中,攻击者会将一些恶意代码插入到字符串中。然后会通过各种手段将该字符串传递到SQLServer数据库的实例中进行分析和执行。只要这个恶意代码符合SQL语句的规则,则在代码编译与执行的时候,就不会被系统所发现。

2)       SQL注入式攻击的主要形式有两种。一是直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量。由于其直接与SQL语句捆绑,故也被称为直接注入式攻击法。二是一种间接的攻击方法,它将恶意代码注入要在表中存储或者作为原数据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。

3)       注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。如以直接注入式攻击为例。就是在用户输入变量的时候,先用一个分号结束当前的语句。然后再插入一个恶意SQL语句即可。由于插入的命令可能在执行前追加其他字符串,因此攻击者常常用注释标记“—”来终止注入的字符串。执行时,系统会认为此后语句位注释,故后续的文本将被忽略,不背编译与执行。

 

 

 

(四)       漏洞风险加固列表

1.        风险类型01

 

风险名称

固定的独立参数渗透

风险级别

攻击形式

传入名称、关键字等参数或不是通过Filter生成查询条件串的

解决方案

1)        SQLServer数据库专门设计了相对安全的SQL参数。在数据库设计过程中,采用这些参数来杜绝恶意的SQL注入式攻击。如在SQL Server数据库中提供了Parameters集合。这个集合提供了类型检查和长度验证的功能。如果采用了Parameters这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。即使用户输入的内容中含有可执行代码,则数据库也会过滤掉。因为此时数据库只把它当作普通的字符来处理。

2)        使用Parameters集合的另外一个优点是可以强制执行类型和长度检查,范围以外的值将触发异常。如果用户输入的值不符合指定的类型与长度约束,就会发生异常,并报告给管理员。

 

2.        风险类型02

 

风险名称

SQL截断攻击

风险级别

攻击形式

利用SQL语句超长时会截或内部SQL文本串缓冲变量定义长度大小时会被截断而进行的攻击

解决方案

1)        对查询条件的输入值一定要有长度限制,包括UI验证上一定要有长度验证,防止过长的条件

2)        存储过程中的SQL文本缓冲变量长度定义时要足够大以保证不会产生SQL语句截断

 

3.        风险类型03

 

风险名称

WEB的远程管理漏洞

风险级别

攻击形式

注入攻击盗取web远程管理用户与权限,远程管理认证网页中会有型如:select * from admin where username='XXX' and passWord='YYY' 的语句,若在正式运行此句之前,没有进行必要的字符过滤,则很容易实施SQL注入。如在用户名文本框内输入:abc’ or 1=1-- 在密码框内输入:123 则SQL语句变成:select * from admin where username='abc’ or 1=1 and password='123’ 不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。进行木马或者恶意程序上传。

解决方案

1)        加强对用户输入的验证,用户输入参数过滤,对敏感字符和数据在不影响正常交互前提下,进行替换与截获过滤。

2)        敏感数据片段,使用参数化SQL查询语言和数据库安全参数,如Parameters

3)        普通用户与系统管理员用户的权限要有严格的区分

4)        使用类安全(type-safe)的参数加码机制,保证用户输入参数正常escaped/encoded

 

4.        风险类型04

 

风险名称

盗用数据字典

风险级别

攻击形式

利用猜解方式盗取服务器数据库数据字典

1)        猜解数据库名称

HTTP://xxx.xxx.xxx/abc.jsp?p=YY and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0 因为 dbid 的值从1到5,是系统用了。所以用户自己建的一定是从6开始的。并且我们提交了 name>1 (name字段是一个字符型的字段和数字比较会出错),abc.jsp工作异常,可得到第一个数据库名,同理把DBID分别改成7,8,9,10,11,12…就可得到所有数据库名。

2)        猜解用户表

SQL-SERVER有一个存放系统核心信息的表sysobjects,有关一个库的所有表,视图等信息全部存放在此表中,而且此表可以通过WEB进行访问。当xtype='U' and status>0代表是用户建立的表,发现并分析每一个用户建立的表及名称,便可以得到用户名表的名称,基本的实现方法是
  HTTP://xxx.xxx.xxx/abc.jsp?p=YY and (select top 1 name from TestD ... type='U' and status>0 )>0 得到第一个用户建立表的名称,并与整数进行比较,显然abc.jsp工作异常,但在异常中却可以发现表的名称。假设发现的表名是xyz,则
   HTTP://xxx.xxx.xxx/abc.jsp?p=YY and (select top 1 name from TestDB.dbo.sysobjects& ... tatus>0 and name not in('xyz'))>0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。

解决方案

1)        加强对用户输入的验证,用户输入参数过滤,对敏感字符和数据在不影响正常交互前提下,进行替换与截获过滤。

2)        敏感数据片段,使用参数化SQL查询语言和数据库安全参数,如Parameters

3)        普通用户与系统管理员用户的权限要有严格的区分

4)        使用类安全(type-safe)的参数加码机制,保证用户输入参数正常escaped/encoded

 

5.        风险类型05

 

风险名称

构造SQL注入代码

风险级别

攻击形式

提交数据表单时,通过参数或者表单数据植入OR1=1–或者OR1=1--,植入SQL代码,获取系统内用户数据

 

解决方案

1)        数据和命令进行严格区分过滤或替换

2)        敏感数据片段,使用参数化SQL查询语言和数据库安全参数,如Parameters

3)        使用参数加码机制,输入参数传输利用escaped/encoded

4)        访问服务链接统一采用post机制,防数据在URL泄露

 

6.        风险类型06

 

风险名称

SQL字符集编码注入

风险级别

攻击形式

利用数据字符编码漏洞,例如where xtype=’U’ 字符U对应的ASCII码是85,继而用where xtype=char(85)代替;如果字符是中文的,比如where name=’admin’,可以用where name=nchar(29992)+nchar(25143)代替。绕过程序敏感数据过滤器进行注入欺骗

解决方案

1)        使用参数加码机制,输入参数传输利用escaped/encoded

2)        利用html转义函数,对页面数据特殊字符转义,如htmlEscape、htmlUnescape等。

3)        业务处理接收数据时,严格判断用户数据对应数据类型,阻止数据类型欺骗攻击

 

 

7.        风险类型07

 

风险名称

Script客户端脚本攻击

风险级别

攻击形式

编写浏览器可执行的脚本文件,如VBScript、JavaScript篡改页面数据或篡改页面样式,进行篡改或拦截用户提交数据信息,造成sql执行非法数据,典型的应用场景。如,火车票订票插件

解决方案

1)        设置浏览器的安全级别

2)        屏蔽页面右键选项,禁止查看页面源代码

3)        服务器接入接口,严格做数据类型判断、信息检索

4)        使用参数加码机制,输入参数传输利用escaped/encoded

 

8.        风险类型08

 

风险名称

数据库执行非法Cookie篡改数据

风险级别

攻击形式

利用浏览器cookie数据信息,非法修改cookie数据,致使客户端做数据上传时,服务器记录、篡改用户数据

解决方案

1)     避免直接在cookie 中泄露用户隐私,例如email、密码等等。

2)        通过使cookie 和系统ip 绑定来降低cookie 泄露后的危险。这样攻击者得到的cookie 没有实际价值,不可能拿来重放。

 

 

 

 

posted @ 2013-07-24 20:09  坚固66  阅读(254)  评论(0编辑  收藏  举报