飞翔的背心@2003.6.24

BBSXP(www.Yuzi.net)据说是“经过将近3年的测试,可说是不存在任何BUG”,很厉害啊!我下载了一个1.65a版,免费的,可能和dvBBS相同,有传说中的商业版,但是我没有办法得到。
我是从最后一个文档开始看的,所以叫倒着看。其实我已看了一半了,呵呵,但是写出来要稍微慢一点,因为我在自己的机器上测试要花时间,而且要怀着悲痛的心情送毕业的同学,进度实在快不起来。
嗯,废话就少说了,来看看到底是什么漏洞吧。

searchok.asp中存在多处能够SQL Injection的问题,代码是这样的:

... ...
forumid=Request("forumid")
... ...
if Request("forumid")<>"" then
forumidor="forumid="&forumid&" and"
end if
... ...
count=conn.execute("Select count(id)from forum where deltopic<>1 and "&forumidor&" "&item&" "&TimeLimit&"")(0)

这其实是个极其愚蠢的错误,我敢用我的背心打赌,要是有商业版他(们)绝对不敢这么写!可是免费版就是免费版,像dvBBS相同,就算作者知道了漏洞,免费版的用户要想得到补丁也是极其困难的事情。谁叫有商业用户呢,优先的当然不会是普通的网民,有那个的才是娘嘛。

嗯,攻击一下。
要攻击的话还要看几个地方,说起来BBSXP虽然代码写得难看,但是还是有一些基本的防护措施(尽管没用),现要绕开这些个形同虚设障碍才好办事情。先来分析一下有那些障碍,代码是这样的:

<!-- #include file="setup.asp" -->
if Request.Cookies("username")="" then
error("<li>您还还未<a href=login.asp>登陆</a>社区")
end if
if instr(Request.ServerVariables("http_referer"),""&Request.ServerVariables("server_name")&"") = 0 then
error("<li>来源错误")
end if

setup.asp中的防范很简单,只要您或浏览器提交的cookie中username不包含空格和单引号而且确实存在这个用户就能够了。上面的第一个if判断似乎没有什么用,呵呵,第二个if判断是需要引用来源和服务器相一致,也很容易办到。其实我们能够先看看浏览器是怎么提交请求的,大部分情况下,都能够稍微改一下就用,而且最重要的,浏览器提交的正常数据百分之百能够满足那些(作者认为的)苛刻条件,这将是个很好的参考。当然,假如您发现浏览器提交的数据都不能通过代码中的检测条件,那只能说明编写这个的人脑壳坏掉了。
抓浏览器提交的数据,只要一个NC就能够,而且我觉得脚本攻击的话,极端情况下也就只需要一个NC,真是居家旅行,XXXX,必备XX啊。
先在自己的机器上配置好IIS和BBSXP,注册一个ID登陆进去,然后转到search.asp,搜索栏里面随便填一个1吧,然后我们开始抓提交的数据了。现在把Internet信息服务中的您使用的站点停止,在cmd中用NC监听80口(nc -l -p 80),回到浏览器上面,轻轻按一下回车键,OK,NC那边数据已出来了,我的是这样的。

POST /BBSXP/searchok.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
Referer: http://localhost/BBSXP/search.asp
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: localhost
Content-Length: 108
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: eremite=0; now=2002-6-24 12:38:18; onlinetime=2002-6-24 12:38:05; username=never; userpass=FuckUSA!!; addmin=0; ASPSESSIONIDGQQGGLBU=CLGHHMJCCGPBMOHGPPDNFCOO

content=1&searchxm=username&search=key&searchxm2=topic&TimeLimit=5&forumid=&submit1=开始搜索

假如想知道每一行代表什么意思,请找参考书,这里不会一一介绍的。我们只看重要的:

Referer: http://localhost/BBSXP/search.asp

这个值一定要包含对方服务器的名字,比如我是在本机上测试的,就要有localhost,假如您在www.Yuzi.net上测试,一定要有www.Yuzi.net。这是因为要使得instr(Request.ServerVariables("http_referer"),""&Request.ServerVariables("server_name")&"") = 0这个条件不成立(见上面的代码)。

Cookie: eremite=0; now=2002-6-24 12:38:18; onlinetime=2002-6-24 12:38:05; username=never; userpass=FuckUSA!!; addmin=0; ASPSESSIONIDGQQGGLBU=CLGHHMJCCGPBMOHGPPDNFCOO

Cookie伪造就指的这个东西了,要是您乱填Cookie的值,就是Cookie伪造,呵呵!但是这里该是什么就是什么,我们没有必要去作假的Cookie,username和userpass都填上您的真实资料吧。

Content-Length: 108

这是POST过去的数据的长度,可能要您自己计算,但是能够把这个值稍微写大一点,并不影响您提交的数据的内容,只是可能要多打几次回车。

content=1&searchxm=username&search=key&searchxm2=topic&TimeLimit=5&forumid=&submit1=开始搜索

这就是本次的最重要的内容,POST过去的数据。按照上面对漏洞的理解,这里要修改的是forumid的值,假如是MSSQL的话,方法是直接用冒号结束前一句然后注入您喜欢的SQL查询或是存储过程,这里就不多说了。因为大部分用的是ACCESS,只能制造畸形的查询条件来猜测表的内容,这里做一个示范。记住,POST过去的东西,很多要先编码,比如空格要用 表示,不然会得不到预定结果的。我用的数据是这样的:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!