[置顶] 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代表是用户建立的表,发现并分析每一个用户建立的表及名称,便可以得到用户名表的名称,基本的实现方法是 |
解决方案 |
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注入安全分析的更多相关文章
- [置顶] SQL注入问题
我们做系统,有没有想过,自己的容量很大的一个数据库就被很轻易的进入,并删除,是不是很恐怖的一件事.这就是sql注入. 一.SQL注入的概念 SQL注入攻击指的是通过构建特殊的输入作为参 ...
- Beescms_v4.0 sql注入漏洞分析
Beescms_v4.0 sql注入漏洞分析 一.漏洞描述 Beescms v4.0由于后台登录验证码设计缺陷以及代码防护缺陷导致存在bypass全局防护的SQL注入. 二.漏洞环境搭建 1.官方下载 ...
- PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...
- sql注入实例分析
什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...
- [置顶] SQL Server 2005 双机热备的实现
[置顶] SQL Server 2005 双机热备的实现 分类: SQLSERVER2011-08-24 21:25 901人阅读 评论(0) 收藏 举报 sql servermicrosoftsql ...
- PDO防sql注入原理分析
使用pdo的预处理方式可以避免sql注入. 在php手册中'PDO--预处理语句与存储过程'下的说明: 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的 ...
- DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入
0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...
- Vtiger CRM 几处SQL注入漏洞分析,测试工程师可借鉴
本文由云+社区发表 0x00 前言 干白盒审计有小半年了,大部分是业务上的代码,逻辑的复杂度和功能模块结构都比较简单,干久了收获也就一般,有机会接触一个成熟的产品(vtiger CRM)进行白盒审计, ...
- SQL注入关联分析
在Web攻防中,SQL注入绝对是一个技能的频繁项,为了技术的成熟化.自动化.智能化,我们有必要建立SQL注入与之相关典型技术之间的关联规则.在分析过程中,整个规则均围绕核心词进行直线展开,我们简单称之 ...
随机推荐
- 第1章2节《MonkeyRunner源码剖析》概述:边界(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...
- loadrunner监控度量项及中文解释
1. Number of Concurrent Users (NCU) 并发用户数 – 在指定时刻,系统观察到的并发用户连接数. 2. Request Per Second (RPS) 每秒处理请求数 ...
- Android NDK进入发展
使用互联网有很多javah命令生成一个头文件来完成JNI写,但事实上ADT集成NDK后.点点鼠标就可以了,网上的介绍是非常小懒的方法,在这里,我们主要谈论的懒惰JNI发展. 为ADT组态NDK.请个人 ...
- 编程算法 - 二部图确定 代码(C)
二部图确定 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个具有n个顶点的图. 要给图上每一个顶点染色, 而且要使相邻的顶点颜色不同. ...
- java查找反复类/jar包/普通文件
开发web应用时,有时更新了类却没有生效,事实上是由于jboss/tomcat中其它公布包下有同名类(包含全路径都同样). 于是萌发了做个程序来检查指定文件夹是否存在反复类(通过asm从类文件里取类的 ...
- C#在outlook里创建一封邮件到草稿箱
原文:C#在outlook里创建一封邮件到草稿箱 1.引用Microsoft.Office.Interop.Outlook.dll 2. 实现代码 public static int SendToD ...
- Spring Resource之ResourceLoader
ResourceLoader接口意味着任何实现的对象都能够返回Resource实例. public interface ResourceLoader { Resource getResource(St ...
- JCronTab 定时调用
习惯使用 unix/linux 的开发者应该对 crontab 都不陌生.Crontab 是一个很方便的用于 unix/linux 系统的任务调度命令.JCronTab 则是一款全然依照 cronta ...
- 线程池python
原创博文,转载请注明出处 今天在学习python进程与线程时,无意间发现了线程池threadpool模块,见官方文档. 模块使用非常简单,前提是得需要熟悉线程池的工作原理. 我们知道系统处理任务时,需 ...
- String类重写
#include <iostream> #include<string.h> using namespace std; class String { int length; i ...