详解SQL注入

一、了解什么是SQL
SQL是Structured Query Language 的缩写,中文译为结构化查询语言。简单的说就是一种用于在数据库中查询数据,存放数据,管理数据的语言。具体可以去网上搜索,百度百科解释的很详细,在这里只需要理解这一点就够了。
二、认识什么是SQL注入漏洞
众所周知,许多网站的后台帐号密码等都是存放在数据库中的,那么我们的目的就是要获取到这个帐号和密码。这就是这个漏洞存在的意义之一。这里有一个误区,许多人**某一个网站拿起就检测SQL注入链接,渐渐地就误认为这是所有渗透的第一步。当然除了前期刺探,社工获取站的一些信息以外,下一步大家大概都能想到的是注入。其实还有许多其他的方法,在这里就不多讲解。

我们先来看一段代码:
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070744wrnzawr0pjr099hr.jpg[/img]
这句代码的意思就是把Date表中所有含关键词“A”的内容全部找出来。(无需深入理解代码,只需知其意,对自身要求高者不强求)

那么这里再来理解一段代码:
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070744w0sbfawt707vw7w4.jpg[/img]


有SQL语言基础的朋友们应该知道这句代码的意思,就是删除数据库。这里则是删除名为Databasename的数据库
在Microsoft 的SQL Server 中有这样一个机制,就是支持多命令语句执行。把上面两句代码连起来,中间用分号隔开。
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/0707455av6ayae5oyeoiae.jpg[/img]
那么数据库就会先去查询包含关键词“A”的内容然后再删除名为Databasename的数据库。
在SQL中,“--”符号是数据库特有注释标识,数据库不执行任何命令。
那么我们把代码更改为如下:

[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070745ssjty7p5429tddp9.jpg[/img]

这样当数据库执行的时候,就会不执行前半部分的查找包含关键词“A”内容的语句,而去执行后面删除数据库的语句,这就是我们通常所说的“SQL注入漏洞”。借用这个漏洞,就可以进行许多操作,只需要将删除数据库语句更改成所要进行的操作就可以。



再举一个例子:
许多网站都有一个用户登陆机制,通过用户所赋予的帐号和密码来查询数据库,如果合法则跳转正常页面,反之则提示非法。但是如果存在了SQL注入漏洞,这个机制也就无用了。
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070745zypzhyqphhhpllmj.jpg[/img]
这是一段查询语句,用于判断帐号和密码是否与数据库中一致。在这里不提供完整代码,只是举个例子。
这看似是一个比较严格的认证代码,但实际呢。我们将用户名和密码处都输入“'or 1='1”
将其替换到查询语句中,那么代码会变成这样:
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070746dtk31661mm55rqkm.jpg[/img]

相信大家发现了,这样一替换,也就彻底改变了查询语句。这样一来,无论用户名和密码是否正确都可以获取合法权限。
在这里只是提供一个理解SQL注入漏洞的思路。所谓的字符过滤不严正是这个道理。总而言之,言而总之,就是要利用各种方法改变查询语句,来达到目的。
如想深入了解,可以去学习一下SQL语言。

三、实战SQL注入
一般SQL注入的基本步骤是这样的:
①找到注入页面
②找到数据表
③找到字段名
④查字段数目
⑤爆出用户名密码
看过一些教程的人都知道,一开始都是用18来判断这个页面可不可以进行SQL注入,那么这样做的原理是什么呢,下面来稍微解释一下。
当我们需要传值给WEB时常常会用带参数的方式,例如这个网址:
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/125238n0tz6tn0xbhg2gtn.jpg[/img]
所以一般,我们要找注入页面都是寻找带参数的网址。
那么什么是带参数的网址呢,看下面两个地址,就能理解了。
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/125326o2nxjoxh5qqxasmh.jpg[/img] 这是一个不带参数的地址
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/125431aebuf35gozfglbey.jpg[/img] 这是一个带参数的地址
那么如果网站没有对传值进行判断是否为数字型,那么就可能构造成类似于这样的语句:
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070746owxecpio8g6wlni1.jpg[/img]
这样就会查询出所有的记录。
步入正题,在这里假设我们要**的网站为www.xxx.com
我们要先找到一个带参数的地址,假设找到的地址有:
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/125524gst8tgy46tuuy81s.jpg[/img]


那么我们一个个尝试,
在浏览器中输入[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/125608tzgevcqtq6vmvmmt.jpg[/img] 如果浏览器页面正常那么再输入
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/1256519ko65z2fzhhxko22.jpg[/img]如果浏览器页面错误或者提示参数错误等错误提示则表示这个链接可以注入。如果提示非法操作,那么可能是该网站装了安全狗或者通用防注入程序等。这种情况只能改变策略,例如使用Cookies注入。
假设我们找到了一个可注入的地址为[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/125729rap5ihiw6g0ppaaa.jpg[/img]
那么下一步我们要做的是找数据表。找数据表的代码格式是这样的。
[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/07074646yyshgg5zhsxndd.jpg[/img]这里要靠自己去凑了,运气好的话几下就能凑到。
一些关键词,例如admin admin123 admin888 等。(可以借助工具加快效率)
我们在浏览器中输入[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/131735nyb8x77ey8c2h7gi.jpg[/img]
如果页面返回正常,则表示数据表存在,如果页面返回显示和正常的有所不同,则表示数据表不存在。依照此方法找出数据表,假设我们已经找到数据表为admin。
那么接下来就来找字段。要理解什么是字段可以去学习一下有关ACCESS数据库的知识。
找字段的语句格式是[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/072000u6dsh10u90u1rh79.jpg[/img]
常见的字段username password等。
我们在浏览器中输入[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070746vvkvgq2rolblldo3.jpg[/img]
一样的,页面返回正常则存在,返回错误则不存在。
以此类推,假设我们找到了字段名为username 和password。

在这里我们罗列一下自己所搜集到的信息:

(个人有一个习惯,每找到一点信息就复制在记事本中保存起来)

我们所找到的可用的注入地址:[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/125836ttbpxp553m77fu3g.jpg[/img]
我们所找到的数据表:admin

我们所找到的字段名:username password

(以上内容均为假设)



接下来我们要知道字段总数,查字段数目的语句是[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070747kyjqixayz0kejsyu.jpg[/img]
同样在浏览器中输入[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070747dcdkvdk6s4ssk6xe.jpg[/img]页面显示正常则表示有10个字段,显示不正常,则继续凑。



这里假设我们获取到的字段数是4个。

那么接下来要做的就是爆出用户名和密码了。



这里需要用到一个联合查询union。首先我们罗列出各个字段所对应的字段名是什么

在地址栏中输入:

[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070747es73ce3b00o70opw.jpg[/img]
此时网页中会显示字段名及其对应的字段序号。

假设内容是如此:



序号1   帐号3

权限2   密码4



那么我们可以看到我们所需的内容为帐号和密码,则将3 和4替换成字段名语句为:



[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070748k1x3h1zb1d0wbj1j.jpg[/img]
则网页内容会变成:



序号1   帐号admin

权限2   密码cdaeb0c25a0b9d3a (均为假设)



获取到的密码一般是MD5加密的,可以到www.xmd5.com , www.cmd5.com 等网站上去破解。这样就利用SQL注入漏洞获取到了后台的帐号和密码。



在这里再介绍一个利用SQL注入漏洞的方法来绕过后台身份验证。

与第二部分中举的第二个例子的原理是相通的。

假设后台身份验证语句是:

[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070748z0b626ke6xo66ixh.jpg[/img]

我们使用'or 'a'='a来做用户名密码的话,那么查询就变成了

[img]http://www.cnhonkerarmy.com/data/attachment/album/201306/06/070748tfbqq0uutoh3lt3u.jpg[/img]

不过这个漏洞的前提是查询语句帐号和密码验证是合并为一句的,如果分为两句判断,则无效。

posted @ 2013-06-08 22:26  师太你就从了老衲吧  阅读(371)  评论(0)    收藏  举报