(一)       应用环境列表

网络互联设备操作系统

序号

操作系统名称

设备名称

脆弱性

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 没有实际价值,不可能拿来重放。

[置顶] SQL注入安全分析的更多相关文章

  1. [置顶] SQL注入问题

    我们做系统,有没有想过,自己的容量很大的一个数据库就被很轻易的进入,并删除,是不是很恐怖的一件事.这就是sql注入. 一.SQL注入的概念         SQL注入攻击指的是通过构建特殊的输入作为参 ...

  2. Beescms_v4.0 sql注入漏洞分析

    Beescms_v4.0 sql注入漏洞分析 一.漏洞描述 Beescms v4.0由于后台登录验证码设计缺陷以及代码防护缺陷导致存在bypass全局防护的SQL注入. 二.漏洞环境搭建 1.官方下载 ...

  3. PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...

  4. sql注入实例分析

    什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...

  5. [置顶] SQL Server 2005 双机热备的实现

    [置顶] SQL Server 2005 双机热备的实现 分类: SQLSERVER2011-08-24 21:25 901人阅读 评论(0) 收藏 举报 sql servermicrosoftsql ...

  6. PDO防sql注入原理分析

    使用pdo的预处理方式可以避免sql注入. 在php手册中'PDO--预处理语句与存储过程'下的说明: 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的 ...

  7. DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入

    0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...

  8. Vtiger CRM 几处SQL注入漏洞分析,测试工程师可借鉴

    本文由云+社区发表 0x00 前言 干白盒审计有小半年了,大部分是业务上的代码,逻辑的复杂度和功能模块结构都比较简单,干久了收获也就一般,有机会接触一个成熟的产品(vtiger CRM)进行白盒审计, ...

  9. SQL注入关联分析

    在Web攻防中,SQL注入绝对是一个技能的频繁项,为了技术的成熟化.自动化.智能化,我们有必要建立SQL注入与之相关典型技术之间的关联规则.在分析过程中,整个规则均围绕核心词进行直线展开,我们简单称之 ...

随机推荐

  1. sqlite学习笔记5:插入数据,查询数据和删除数据

    曾闻:全部的编程都是已数据为中心,觉得很有道理. 所谓数据库数据库,没有数据叫什么数据库,接下来就看看怎样在表中插入数据. 一 插入数据 1 创建一张表 首先为了插入数据,须要先创建一张表: CREA ...

  2. (转)iOS项目的目录结构和开发流程

    网上相关的资源不多,开源的且质量还不错的iOS项目也是少之又少,最近正好跟同事合作了一个iOS项目,来说说自己的一些想法. 目录结构 AppDelegate Models Macro General ...

  3. Ubuntu自己主动搭建VPN Server - PPTP的Shell脚本

    #!/bin/bash if [ "$UID" != "0" ]; then echo "please use sudo to run $0" ...

  4. Silverlight中的Path

    原文:Silverlight中的Path 在Silverlight中Path可能由直线.曲线.或者其他简单的图形对象组成.这篇文章旨在介绍如何使用XAML和C#来创建Path. 废话先行 Path可能 ...

  5. 【转】关于“ORA-01653: 表 SYS.AUD$ 无法通过 128 (在表空间 SYSTEM 中) 扩展”的错误

    SQL*Plus: Release 11.1.0.6.0 - Production on 星期一 5月 17 18:31:08 2010 Copyright (c) 1982, 2007, Oracl ...

  6. hdu oj1102 Constructing Roads(最小生成树)

    Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. SQLite数据库查看工具(免费)

    1. SQLite Administrator http://sqliteadmin.orbmu2k.de/ iteSpy 2.  SQLiteSpy   http://www.yunqa.de/de ...

  8. 字符串json转换为xml xml转换json

    原文:字符串json转换为xml xml转换json // To convert an XML node contained in string xml into a JSON string XmlD ...

  9. C注意,使用的语言字符串

    转载请注明出处! 在C语言没有具体的字符串数据类型,字符串的字符串常量和字符数组的形式. 实际上该字符串是零个或更多字符的字符串.并在整个位模式0NUL字节结束.因此,字符串所包括的字符内部不能出现N ...

  10. 个推推送 产品SDK常见问题检查

    作者:Hong Jack链接:https://zhuanlan.zhihu.com/p/20733333来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 通知和消息有什么 ...