笑看leadbbs
By ivory
一提到漏洞最多的论坛程序,那肯定是非动网和bbsxp这两个莫属了。Leadbbs是个让人头疼的东西,自从上次“移花接木”大法出来后,就再也没人碰它了。我很奇怪,即使是一些所谓的“高手”,竟然碰到这种论坛就选择饶过,利用旁注其他的网站来入侵。这种做法是不对的。我们不能畏难,一个hacker要有不断探索的精神。下面我就带大家一起来剖析这个硬骨头。
我去下了一个leadbbs 3.14的程序,首先就发现了几个小问题。对于没有安全概念的用户,很容易进去。第一就是data/leadbbs.mdb,没有做防下载,这个和动网、bbsxp一样。第二就是默认管理员用户没改名:admin/admin,bbsxp做的比这个好,而动网也有默认管理员:admin/admin888。
下面仔细看看里面写的怎么样吧:最显眼的是setup.asp。这个是论坛初始安装的文件,以前动网也有一个,问题非常大。这个难道有戏?假如用户没删除这个文件,就可以顺水摸鱼了?后来我发现想法是错误的。因为这个文件中间有一句:
if fs.FileExists(Server.Mappath("setup.asp")) then
fs.DeleteFile Server.Mappath("setup.asp"),True
deletefiles = 1
Response.Write "<p><b><font color=Green>成功删除Setup.asp文件,安装完成.</font></b>"
哦,原来论坛安装完后,程序会自动删除这个文件!F.T。
一(前台):
只好去user这个目录看看,这个是用户的主目录,里面大部分都include了三个文件:../inc/BBSsetup.asp,inc/UserTopic.asp,../inc/Board_Popfun.asp。前两个没什么用,直接来看../inc/Board_Popfun.asp这个吧,文件很大,真正60k,里面全都是sub子过程。我都不知道哪里来的精神,从找到漏洞到文章完工有两个晚上没睡个好觉,这比挑鱼刺难多了。这里为什么叫”笑看leadbbs”,因为漏洞是由于程序员的头脑混乱造成的。整个过程写的不错,一直到“登陆成功”,共设置了5个错误:
1.非法IP地址,无法安全提交任何数据
2.您所填的用户不存在, 登录失败
3.此用户已经在线,系统已经设置成" & Fix(DEF_RepeatLoginTimeOut/60) & "分钟后才允许再次登录
4.登录太频,请稍休息后再登录或联系管理员
5.您的密码不正确, 登录失败
第一个只要ip非它设置的限制的ip或者不等于1.1.1.1都可以通过,这个没什么好说的了。后面几个都从两个sql语句中查询出的数据进行匹配,两个sql都差不多,我用一个为例:
Select top 1 ID,UserName,UserLimit,ShowFlag,Points,OnlineTime,MessageFlag,Login_lastpass,Login_falsenum,Pass,Login_RightIP,Prevtime,LockIP,LastWriteTime,LastAnnounceID,CharmPoint,CachetValue from LeadBBS_User Where Username = '" & Replace(GBL_CHK_User,"'","''") & "'"
恩,写的这么轻巧。GBL_CHK_User是从GBL_CHK_user = Trim(Request.Form("user"))来的
还有个If GBL_CHK_User = "" Then GBL_CHK_user = Request.Cookies(DEF_MasterCookies)("User")。如果leadbbs自己做了个sql系统,我担保他们不会这样轻巧写的。因为一句“;drop LeadBBS_User;--“就能让他们好受了。对于ACCESS的,开始我打算用”union select联合查询”来试试,结果在前面看到一句:GBL_CHK_user = Replace(Left(GBL_CHK_user,20),",",""),不允许有逗号?结果失败了。
后面几个错误很
有意思,过滤都非常严格。第二个错误,因为我们的cookie是可以欺骗的,所以可以轻松饶过;接下来别的两个错误就不说了。如果要谈到入侵,关键就是要对付第五个错误。这里看两个小节吧。就是关于它是怎么检测的:
|
1 If Pass <> MD5Pass and Mid(MD5Pass,9,16) <> Pass Then …….略去 GBL_CHK_TempStr = GBL_CHK_TempStr & "您的密码不正确, 登录失败! <br>" & VbCrLf GBL_CHK_Flag = 0 CheckPass = 0 GBL_CHK_UserLimit = 0 GBL_CHK_Points = 0 GBL_CHK_OnlineTime = 0 GBL_CHK_MessageFlag = 0 GBL_CHK_user = "" GBL_CHK_CharmPoint = 0 GBL_CHK_CachetValue = 0 GBL_UserID = 0 Exit Function Else |
|
|
2 if SubmitFlag = "ddddls-+++" Then ………略去 End If Rem GBL_CHK_TempStr = "<font color=008800 class=GreenFont>您已经登录成功!</font>" & VbCrLf ‘----------END------------ |
|
我一眼就看出,这里好象少了点东西。虽然对pass做了很严格的限制,但是有些asp常识的人都可以看出这个if…else是在一起的。第一个if执行判断后,一句GBL_CHK_user = "",GBL_CHK_Flag = 0就能解决问题吗?只要找个能固定cookie的工具,我们完全可以伪造任何人的cookie进行欺骗,结果势必到else语句。后来测试的时候我发现minibrower,这个工具能实现这个过程!测试动画我附在后面!
二(后台):
接着到后台去看看,发现所有的文件都include了这个有漏洞的文件!同样的可以饶过限制进入后台,测试动画也附在后面。
顺便提一下,用cookie欺骗后,我们可以得到一些其他的东西,因为leadbbs有个可以执行sql语句的地方,就是在manage/ database/ExecuteString.asp。我用一个小句子,就可以查询到我们欺骗用户的真实密码:
update leadbbs_user set homepage=pass where username=”admin”
这样admin用户的真实md5加密密码就跑到我们的“主页”栏里了,然后用暴力方法去跑!还有很多有意思的语句可以自己去试!
三(上传webshell):
这个本来不想写,因为写了也白写,因为经过我初步的总结,最新的v3.14是很难上传的webshell的。
我开始的上传思路有很多:
1. 从备份来上传(Database/BackupDatabase.asp)
这个后来仔细看看,发现备分语句是:
Copyfiles Server.Mappath(DEF_BBS_HomeUrl & DEF_AccessDatabase),Server.Mappath(DEF_BBS_HomeUrl & DEF_AccessDatabase & ".BAK")
里面的DEF_AccessDatabase并不是用户自己提交的,而是系统定义好的,即使可以修改DEF_AccessDatabase,备份后还是.bak的,不能做木马,所以备份思路来上传失败。
2.按照以前的写入文件来做webshell
leadbbs有一些是可以自己写入文件的,有很多,比如“在线编辑Contact_info.asp文件”,“在线编辑BBSSetup.asp论坛配置文件”,“编辑用户注册协议”等,我开始还很高兴,直到发现:
If inStr(TempContent,"<%") or inStr(TempContent,"include") or inStr(TempContent,"server") Then Response.Write "<p><br><font color=red class=RedFont>内容中不能含有<%,include,Server等字符!</font></p>" & VbCrLf
Exit Function
这句表示写的内容中不能有”<%”,”include”,”server”三个关键字。希望又破灭了。
3.友情论坛添加处
我都不知道还有这个地方,在网上找到“白天的猫”的文章里指出在这里可以添加木马!我来看看吧,文件的相对位置是:Manage\SiteManage\SiteLink.asp。里面“友情论坛内容”有个htmlEncode来限制提交的内容,好,找找看htmlEncode是怎么限制的:
Function htmlEncode(str)
If str & "" <> "" Then
htmlEncode=Replace(Replace(Replace(str,">",">"),"<","<"),"""",""")
Else
htmlEncode=str
End If
End Function
这个意思是限制了”<”,”>”,”””,所以还是不成功的。
4.利用网上有些人的思路上传
近期有些人对leadbbs的上传好象有些进展:“那么我们可以在.asp 多加一个空格。这样就可以成功绕过,要注意的是上传时也要在扩展名后多打一个空格。”定义的文件就是:\Manage\SiteManage\UploadSetup.asp。这里里面定义了个Function GetDefaultValue
其他我就不写了,关键是看看文件类型是怎么检测过来的:
1 Form_DEF_UploadFileType = DEF_UploadFileType
2 Form_DEF_UploadFileType = Trim(Request.Form("Form_DEF_UploadFileType"))
3 FobType = Array(….)
4 For N = 0 to Ubound(FobType)
5 If inStr(Form_DEF_UploadFileType,":." & FobType(N) & ":") Then
6 GBL_CHK_TempStr = "为了安全,上传类型不能使用扩展名 " & FobType(N) & " !<br>" & VbCrLf
7 Exit Function
这样可以清楚的看出,先把文件类型放到一个form里面,然后在用trim()来过滤一次。再定义一个数组,当然里面就是非法后缀。再用instr()看看是否被包含。其实从2往下就不用再考虑了,因为用了trim函数来过滤了文件类型中的空格。所以还是行不通!
还有其他的文件我也看过,过滤比较严格。总的来说,对于现在官方站提供的leadbbs版本是很难得到一个webshell的!
四 后记:
和一些朋友讨论过了,他们说这些漏洞是leadbbs某一阶段发布的版本中共有的,因为其中发布过很多版本,而且未说明某些是补丁,所以现在才造成和用户脱节!对于一些比较早的leadbbs版本还是可以上传webshell的,思路呢?当然就是我分析的那些,只要反过来考虑:没有过滤的,当然就可以上传webshell了!祝大家入侵愉快!
浙公网安备 33010602011771号