SQL Injection(SQL注入)介绍及SQL Injection攻击检测工具

1.关于SQL Injection

迄今为止,我基本没有看到谁写出一篇很完整的文章,或者说很成熟的 解决方案(能做到 的人肯定很多,问题是没有流传开来,很遗憾) 我简单的说几点,希望启发大家思考,起到抛砖引玉的作用

一、SQL Injection的原理

SQL Injection的实现方法和破坏作 用有很多,但万变不离其宗,其原理可以概括为一句话 :SQL Injection就是向服务器端提交事先准备好的数据,拼凑出攻击者想要的SQL语句,以改变数据库操作执行计划。

我想,这么说也许不算精炼,但意思应该很明确了,这句话主要包含这么三层意思:

1.攻击者通过何种途径注入?

存在SQL Injection漏洞的地方都是应用程序需要根据客户端环境构造SQL语句的地方。由此可以 推论,只要存在"客户端数据替换预定义变量"的地方,就有可能被注入。

客户端提交 数据可以有很多种方式:GET,POST,Client-Agent,Cookie,Server Enviroment...

2.攻击者 为什么可以将它想要的语句"注入"?

因为服务器端应用程序采用拼凑(请特别留意这 个词)SQL语句的方式,这使得攻击者有机会在提交的数据中包含SQL关键字或者运算符,来构造他们想 要的语句。

3.SQL Injection最终结果是什么?

改变数据库操作执行计划。

这个 结果不一定是恶意的,只要你的SQL语句没有按照你预期的计划(plan)执行,那么就 可以视为被注入 了,不管提交数据的人是不是恶意的。

设有这样的sql语句:

update tableName set columnName1 = " $Client_Submit_Data " where PK_ID = 1234

$Client_Submit_Data是一个变量,它代表客户端提交的数据,这里我就不管环境是ASP还 是PHP还是其他什么东西了。

假设这个操作是要更新一篇文章的标题,很多人是不是会这么构造 SQL语句?我们看看$Cl ient_Submit_Data包含引号的情况,令$Client_Submit_Data = 谁能告诉我 "sql injecti on"是什么?

那么sql语句将被拼凑成这样:

update tableName set columnName1 = "谁能告诉我"sql injection"是什么?" where PK_ID = 1234

执行结果很明显,将执行这样的语句:update tableName set columnName1 = "谁能 告诉我"

where子句被忽略掉了,很遗憾,你的数据库中所有文章标题都会被update为 "谁能告诉我 "

在这个例子当中,用户应该是无心的——标题里面包括引 号应该很正常吧——但结果却和SQL Injection无异。

好啦,说了半天废话,言归正 传,说一下如何应对这种问题。

我相信这里的朋友都看过很多防止SQL Injection的文章了,也 大都会通过replace来防范一些注入,问题是:你们知其然的时候是否知其所以然?

我认为,彻 底解决SQL Injection的最好方法是:避免拼凑SQL语句。这就是我在上面要大家特别注意拼凑这个词的 原因。

SQL Injection之所以有机可乘,是因为绝大多数Server Application采用拼凑SQL语句的 方式来构建应用程序(阅读这个帖子的诸位,你们回首想想自己的项目,有几个不是通过拼凑SQL语句的 方式来操作数据库?想想你们见过的被注入的案例,有几个不是采用的拼凑SQL语句的应用),所谓拼凑 SQL语句,简单一点说就是:用连接字符串操作(ASP中的&和PHP中的.)将SQL关键字和客户端提交 的数据连接起来并发送给DBMS执行。这样做直接导致 DBMS根本不知道你计划(plan to)做什么,而只 知道你要(is to)做什么,不是吗,服务器端脚本总是将要执行的SQL语句构造好,然后发给数据库, DBMS根本不知道客户端数据 替换了变量之后,这个语句的执行计划是否有变化。服务器端脚本总是粗暴 的告诉DBMS:你只管这么做好了,别问我为什么。就像上面我提到的更新文章标题的例子,DBMS不知道 你只想更新第1234篇文章的标题,它以为你就是要把所有的标题都变成这个,因为你的语句就是没有 where子句嘛!

说到这里,可能大家都明白了,所谓的最好方法是Stored Procedure。Yes! That is!

要想做出安全可靠的Server application,你最好把自己当作两个人,一个DBA,一个Coder (ASP Coder,PHP Coder or others),很多人往往只知道:我在做一个BBS,我在做一个留言本,我在 做一个新闻发布系统,我们的流程都是这样的,给用户一个表单,让用户提交,然后去写数据库,用的 时候根据条件把数据记录找出来,然后显示。没事,如果你 是一个业余爱好者,只想自己写点小东西玩 玩,这足够了!如果你想把WebDev作为你的职业,或者说,你想成为一个非常专业的业余爱好者,你必 须当自己是一个DBA+Coder,至于要不要是一个Designer就看你的能力和精力咯!

好了,点到为 止,我就说这么多,彻底的解决方法是要在DBMS上写入你的数据操作计划,让服务器在开始执行之前知 道你的意图,不要粗暴的告诉它:我就是要你执行这个命令,不要问我为什么!

实现方法嘛,目前比较普遍的,也比较容易实现的就是存储过程了,应用存储过程不仅可以从根本上解决SQL Injection 这个安全问题,还会使得你的应用程序速度成倍增长(这个增长的幅度甚至可能达到一个数量级,这跟 很多因素有关,不好一概而论),还会使得你开发的系统更想大型系统,拥有更好的架构体系(例如MVC 模式)。

在MySQL 4.1.x及其后续版本和ODBC中,提供了一种叫做prepared statements的东西 ,它本质上也是一种存储过程,一种系统预置(相对于用户自定义)的存储过程。

时间: 2024-09-19 09:13:49

SQL Injection(SQL注入)介绍及SQL Injection攻击检测工具的相关文章

SQL注入漏洞防范措施与攻击原理

ASP编程门槛很低,新手很容易上路.在一段不长的时间里,新手往往就已经能够编出看来比较完美的动态网站,在功能上,老手能做到的,新手也能够做到.那么新手与老手就没区别了吗?这里面区别可就大了,只不过外行人很难一眼就看出来罢了.在界面的友好性.运行性能以及网站的安全性方面是新手与老手之间区别的三个集中点.而在安全性方面,新手最容易忽略的问题就是SQL注入漏洞的问题.用NBSI 2.0对网上的一些ASP网站稍加扫描,就能发现许多ASP网站存在SQL注入漏洞,教育网里高校内部机构的一些网站这种漏洞就更普

php中sql注入漏洞示例 sql注入漏洞修复_php实例

在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等.这往往给骇客留下了可乘之机.轻则数据遭到泄露,重则服务器被拿下.  一.SQL注入的步骤 a)  寻找注入点(如:登录界面.留言板等) b)  用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c)  将sql语句发送给数据库管理系统(DBMS) d)  DBMS接收请求,并将该请求解释成机器代码指令,执行必要的存取操作 e)  DBMS

SQL Server 2000 注入防护大全(二)_漏洞研究

SQL Server 2000 注入防护大全(二) 传统查询构造:select * FROM news where id=... AND topic=... AND .....admin'and 1=(select count(*) from [user] where username='victim' and right(left(userpass,01),1)='1') and userpass <>'select 123;--;use master;--:a' or name like

ASP通用防注入代码.杜绝SQL注入隐患.提升网站安全

ASP通用防注入代码.杜绝SQL注入隐患.提升网站安全 <% '''''''''''''''''''''''''''''''''''''''''''''''' 'ASP通用防注入代码 '您可以把该代码COPY到头文件中.也可以单独作 '为一个文件存在,每次调用使用 '作者:y3gu - 2005-7-29 '''''''''''''''''''''''''''''''''''''''''''''''' Dim GetFlag Rem(提交方式) Dim ErrorSql Rem(非法字符) Di

SQL Server 2000 注入防护大全(一)

server SQL Server 2000 注入防护大全(一) Sql注入早源于'or'1'='1 最重要的表名: select * from sysobjectssysobjects ncsysobjectssysindexes tsysindexessyscolumnssystypessysuserssysdatabasessysxloginssysprocesses 最重要的一些用户名(默认sql数据库中存在着的) publicdboguest(一般禁止,或者没权限)db_sercuri

ODPS 功能介绍之SQL

ODPS 提供了SQL功能, 为BI工程师提供了大数据分析能力.ODPS的SQL语法与HQL非常相似,入手也非常容易.接下来就给大家介绍一下SQL的使用及一些优化技巧. SQL 语句分为三种:DDL.DML及SELECT 操作. DDL 用于表的定义及维护.相信大家都用过类似CREATE TABLE 来创建表. 在ODPS中,除了使用CREATE TABLE来创建表之外,还有另外两种方式: CREATE TABLE EDW_ORDER_BACKUP LIKE EDW_ORDER; 创建一张新表E

Sql Server 应用程序的高级Sql注入第1/2页_漏洞研究

这篇文章面向两种读者:一是基于数据库web程序开发人员和审核各种web程序的安全专家.[介 绍] 结构化查询语言(SQL)是一种用来和数据库交互的文本语言SQL语言多种多样,大多的方言版本都共同宽松地遵循SQL-92标准(最新的ANSI标准[译者注:目前最新的是SQL-99]).SQL运行的典型的操作是"查询",它是可以让数据库返回"查询结果记录集"的语句集合.SQL语句可以修改数据库的结构(用数据定义语言"DDL")和操作数据库里的数据(用数据

一些简单sql注入与防止sql注入详解

如果把用户输入到一个网页,将其插入到MySQL数据库,有机会离开了发生安全问题被称为SQL注入敞开.这一课将教如何帮助防止这种情况的发生,并帮助保护脚本和MySQL语句. 注入通常发生在处理一个用户输入,如他们的名字,而不是一个名字,他们给一个会在不知不觉中你的数据库上运行的MySQL语句. 永远不要信任用户提供的数据,只能验证后处理这些数据,作为一项规则,这是通过模式匹配.在下面的例子中,用户名被限制为字母数字字符加下划线的长度在8到20个字符之间 - 根据需要修改这些规则.  代码如下 复制

SQL Server 2000 注入防护大全(一)_漏洞研究

SQL Server 2000 注入防护大全(一) Sql注入早源于'or'1'='1 最重要的表名: select * from sysobjectssysobjects ncsysobjectssysindexes tsysindexessyscolumnssystypessysuserssysdatabasessysxloginssysprocesses 最重要的一些用户名(默认sql数据库中存在着的) publicdboguest(一般禁止,或者没权限)db_sercurityadmin