小奋斗 - 轻松学习从此开始!
IT小奋斗群 QQ群:62017228

WEB应用程序 SQL注入攻击的危害与防范

WEB SQL注入的本质是,攻击者对数据库进行攻击,它具备:隐蔽性强、攻击时间、危害性大短和非常严重的有形和无形损失等特点。

SQL注入,SQL Injection,是一种数据库攻击手段,也是WEB应用程序漏洞存在的一种表现形式,它的实际意义就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。

SQL Injection的主要形式是,直接将代码插入与SQL命令串联并执行的用户输入变量中,间接的将恶意代码注入要在表中存储或作为元数据存储的字符串,在存储的字符串随后串连到一个动态SQL命令中时,执行该恶意代码。基本的攻击是提前终止文本字符串,然后追加一个新的命令。由于插入的命令可能在执行前追加其他字符串,因此攻击者将用注释标记“--”来中止注入的字符串。执行时,此后的指令将被忽略。

SQL Injection攻击技术就起本质而言,它利用的工具是SQL的语法,针对的是应用程序开发者编程中的漏洞,当攻击者能操作数据,向应用程序中插入一些SQL语句时,SQL Injection攻击就发生了。实际上,SQL Injection攻击是存在于常见的多连接的应用程序中的一种漏洞,攻击者通过在应用程序预先定义好的查询语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的任意查询。这类应用程序一般是Web Application,它允许用户输入查询条件,并将查询条件嵌入SQL语句中,提交到数据库中执行。通过构造畸形SQL语句攻击者能够获取额外的信息数据。


隐蔽性强

利用Web漏洞发起对WEB应用的攻击纷繁复杂,包括SQL 注入,跨站脚本攻击等等,一个共同特点是隐蔽性强,不易发觉,因为一方面普通网络防火墙是对HTTP/HTTPS全开放的,另一方面,对Web应用攻击的变化非常多,传统的基于特征检测的IDS对此类攻击几乎没有作用。

攻击时间短

可在短短几秒到几分钟内完成一次数据窃取、一次木马种植、完成对整个数据库或Web服务器的控制,以至于非常困难作出人为反应。

危害性大

目前几乎所有银行,证券,电信,移动,政府以及电子商务企业都提供在线交易,查询和交互服务。用户的敏感信息包括账户,个人私密信息(如身份证),交易信息等等,都是通过Web存储于后台数据库中, 这样,在线服务器一旦瘫痪,或虽在正常运行,但后台数据已被篡改或者窃取, 都将造成企业或个人巨大的损失。据权威部门统计,目前身份失窃(identity theft)已成为全球最严重的问题之一。

非常严重的有形和无形损失

目前,包括政府以及很多大型企业尤其是在国内外上市的企业, 一旦发生这类安全事件,必将造成人心惶惶,名誉扫地,以致于造成经济和声誉上的巨大损失,即便不上市,其影响和损失也是不可估量的。


就风险而言,SQL Injection攻击也是位居前列,和缓冲区溢出漏洞相比,其优势在于能够轻易的绕过防火墙直接访问数据库,甚至能够获得数据库所在的服务器的访问权限。在某些环境下,SQL Injection漏洞的风险要高过其他所有的漏洞。SQL Injection攻击利用的是SQL 语法,这使得这种攻击具有广泛性。


Asp程序防SQL注入的例子:

强制类型转换,下为过滤整个整形数据变量
nId = cint(request("id"))
sql = "select * from user where id=" + cstr(nId)

Asp.NET程序防SQL注入的例子:

利用参数方式查询和SqlParameter参数,来杜绝SQL 注入型式。
strUid = Request.QueryString["uid"].Trim();
strSql = "SELECT * FROM [users] WHERE [uid]=@uid";
sqlParameter = new SqlParameter("@uid", SqlDbType.VarChar);
sqlParameter.Value = strUid;
sqlCommand.Parameters.Add(sqlParameter);
sqlDataReader = sqlCommand.ExecuteReader();
strUid = Request.QueryString["uid"].Trim();
strSql = "SELECT * FROM [users] WHERE [uid]=@uid";
sqlCommand = new SqlCommand(strSql, sqlConnection);
sqlParameter = new SqlParameter("@uid", SqlDbType.VarChar);
sqlParameter.Value = strUid;
sqlCommand.Parameters.Add(sqlParameter);
sqlDataReader = sqlCommand.ExecuteReader();
strUid = Integer.Parse(Request.QueryString["uid"].Trim());
strSql = "SELECT * FROM [users] WHERE [uid]=@uid";
sqlCommand = new SqlCommand(strSql, sqlConnection);
sqlParameter = new SqlParameter("@uid", SqlDbType.Int);
sqlParameter.Value = strUid;
sqlCommand.Parameters.Add(sqlParameter);
sqlDataReader = sqlCommand.ExecuteReader();
Dim SSN as String = Request.QueryString("SSN")
Dim cmd As new SqlCommand("SELECT au_lname, au_fname FROM authors 
WHERE au_id = @au_id")
Dim param = new SqlParameter("au_id", SqlDbType.VarChar)
param.Value = SSN
cmd.Parameters.Add(param)


我来评几句
登录后评论

已发表评论数(0)