English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 业界动态 >> 用最简单的方法讲解什么是SQL注入

 

用最简单的方法讲解什么是SQL注入

威盾防火墙 2015-01-05

 

什么是SQL注入?

通过暴库,下载数据库,阿剑剑对数据库也有了些感性的认识。可是,并不是所有时候我们都可以得到别人的数据库并打开来看的。听说有门技术叫SQL注射,不用下载数据库,也可以得到数据库中的信息。于是阿剑剑嚷嚷着要学它。 
欠钱:“SQL注射是一门比较有难度的技术,因为要了解它和熟练它需要有ASP和数据库的基础。你认为自己有资格学习它吗?” 
阿剑剑想了一下:“这些基础我是一点都没有啊,可是不是听说市面上有很多SQL注射的傻瓜工具吗?你教会我使用这些工具不就可以了?” 
欠钱:“既然如此,那好吧,我首先把SQL最基本的语法告诉你,这样你才好理解那些SQL注射工具上的术语和使用步骤。” 
阿剑剑:“欠钱你真是太好了,感动ing!不过,不会很难吧?” 
“当然不难了!”欠钱拍着胸脯。 
一个数据库一般都包含有若干张表,如同我们前面暴出的数据库中admin表包含有管理员信息,而user表则包含有所有的论坛用户信息一样。以下面这张表为例: 
Dv_User 
UserID UserName UserPassword UserEmail UserPost 
1 admin 469e80d32c0559f8 [email protected] 0 
2 Test 965eb72c92a549dd [email protected] 0 


这是DVBBS 7.0的数据库中所有用户资料的表,Dv_User 是表名。每一行代表一个用户,每一列是该用户的某种属性。我们最感兴趣的自然是用户名与密码这样的属性了。 
SQL是一种用于操作数据库的规范化语言,不同的数据库(MSSQL、MYSQL、ORACLE……)大体上都是一样的。比如我们要查询数据库中的信息: 
select UserName,UserPassword from Dv_User where UserID=1; 
这就是一个最典型的SQL查询语句,它的意思是,在Dv_User这张表中,将UserID为1的用户名与密码查询出来。 
得到的结果是:admin 469e80d32c0559f8 
SELECT语句语法: 
SELECT [列名],[列名2]…… FROM [表名] WHERE [限制条件] 
例: 
SELECT * FROM Dv_User where UserID=1  
表示查询UserID为1的所有信息。 
更新: 
UPDATE [表名] SET [列名]=新值 WHERE [限制条件] 
例: 
UPDATE Dv_User set [UserPassword]=’ 965eb72c92a549dd’ WHERE UserName=’admin’ 
此语句将把Dv_User表中的UserName为admin的那一行中UserPassword的值改为965eb72c92a549dd。 
删除: 
DELETE FROM [表名] WHERE [限制条件] 
例: 
DELETE FROM Dv_User WHERE UserName=’test’ 
将用户名为test的那一行从Dv_User表中删除 

二、SQL注射漏洞简述 
阿剑剑仔细把上面四个SQL语句读了几遍,发现非常的容易,于是虚心请教欠钱:“SQL语法看起来很容易上手嘛,那SQL漏洞是怎么来的呢?” 
欠钱打开一个页面,指着里面的代码: 
if id<>"" then 
sql="SELECT * FROM [日记] WHERE id="&id 
rs.Open sql,Conn,1 
阿剑剑看了一眼:“哎呀,头晕了!” 
欠钱敲了他一下:“关于漏洞的成因我只讲这一次,如果怕难就不知道漏洞的由来了,而且实际上一点也不难的,看好了,我们这段代码是提取自BBSXP论坛的,经过我改动以后,把它做成了一个有漏洞的页面给你讲述SQL漏洞的原理。” 
那张日记的表内容如下: 
日记 
id username title content adddate 
1 职业欠钱 今天安装了BBSXP 这是5.16版,发现BBSXP体积虽小,可是功能一点也不少.完全够用,不知道安全性怎么样 2005-10-25 
2 职业欠钱 再写一个日志吧 多写几个日志看看,玩玩,呵呵,反正这个论坛也只有我一个人在.. 555555555好寂寞 2005-10-25 
我们访问http://localhost/bbsxp/blog.asp?id=1 

的时候结果如图1。 
阿剑剑:“我明白了,访问blog.asp的时候,我们提交的参数id为1,那么放到SQL语句里就变成了: 
SELECT * FROM [日记] WHERE id=1 
所以就得到我们看到的那个页面,对吗?” 
欠钱:“很好!正是如此!SQL漏洞的起源就从这里开始了!注意到了吗?id的值是由我们提交的,但是它却没有做任何的检查,也就是我们提交的id可以是任意字符串。假设我们提交一个单引号的话,SQL语句就会因为id=1’ 而出错” 
“等等,为什么加单引号会出错呢?” 
“因为单引号在SQL语句里有特殊的含义,它只能以’abc’这样的方式出现,表示abc为一个字符串,如果只出现一个单引号,整个句子肯定会出错了。” 
“哦,那单引号和SQL注射有什么关系呢?” 
“关系很密切,一般来说,常见的SQL语句有这么几种: 
SELECT * FROM [表] WHERE id=12 这是数字型,12由我们提交 
SELECT * FROM [表] WHERE name=’admin’ 这是字符型,admin由我们提交 
SELECT * FROM [表] WHERE key like ‘%word%’ 这是搜索型,word由我们提交 
我们以第一种情况为例,假设我们提交 id=12 and 1=1,那么完整的SQL语句为: 
SELECT * FROM [表] WHERE id=12 and 1=1 
它并不出错,但是如果我们提交改为1=2,也就是 
SELECT * FROM [表] WHERE id=12 and 1=2


相关内容: 最新内容:
asp下过滤非法的SQL字符的函数代码[2015-01-04]
SQL查询语句通配符与ACCESS模糊查询like的解决方法[2015-01-04]
sql注入的一些新发现,突破关键字过滤[2014-12-30]
跨站式SQL注入数据库攻击[2014-12-30]
SQL注入另类技巧[2014-12-30]
SQL Injection的深入探讨[2014-12-30]
建站经验:网站要成功必须具备的6点[2015-01-05]
网站优化:分析竞争对手的网站[2015-01-05]
轻易绕过 PW论坛程序高危漏洞攻防详解[2015-01-04]
黑客经验之如何穿透ADSL路由入侵内网?[2015-01-04]
完全解析 零时差攻击的危险性及特征[2015-01-04]
你的端口随意开,偶就进去共享你的资料[2015-01-04]