文/图 舒城李寅  &【梦幻★剑客】
相信土豆网和优酷网大家都很了解吧?我在业余时间就喜欢到这网站看《百家讲坛》,看到有很多会员上传各类视频,就想有没有像这样的免费ASP播客程序呢?到源码之家还真找到了一套本文即将测试的程序,在读代码过程中发现了几处漏洞,于是便有了本文。
 
注入漏洞
在读代码过程中,发现程序漏洞比较多,主要还是SQL注入漏洞。注入漏洞对ASP程序影响真的很严重,稍微疏忽了变量的过滤就造成了漏洞。所以在代码众多的情况下,做到防注入最好的办法就是在数据库连接文件中写入防注入程序。本套程序也有防注入程序,可是并没有在数据库连接文件conn.asp文件中调用,这就给了我们可趁之机。在视频播放文件video_play.asp中有如下一段代码,并且这个文件没有包含防注入程序(www_Sql.Asp)。
 
<%
photoid=request("photoid")
if photoid="" then
FoundErr=True
ErrMsg=ErrMsg & "<br><li>请指定视屏ID</li><br>"
call WriteErrMsg()
else
end if
set rs=server.createobject("adodb.recordset")
rs.open "select * from flv where photoid="&photoid&" order by photoid desc",conn,1,3
rs("hits")=rs("hits")+1
rs("DayHits")=rs("DayHits")+1
rs("WeekHits")=rs("WeekHits")+1
rs("MonthHits")=rs("MonthHits")+1
rs.update
%>

上述代码中的photoid变量没有经过任何函数过滤就带入数据库进行SQL查询,造成注入漏洞。此漏洞的屏蔽很简单,用VBS内置函数isnumeric检查即可。在地址栏中输入“and 1=2”返回不正常,证明漏洞确实存在。
这个漏洞利用起来相信读者朋友们都知道了,用啊D直接就可破解账户和密码。除了这个漏洞外,在看代码过程中我又发现了一个存在注入的文件“blog_show.asp”,这个文件是最新日志显示文件,代码如下。
 
<%
articleid=request("articleid")
set rs=server.createobject("adodb.recordset")
rs.open "select * from article where articleid="&articleid&" order by articleid desc",conn,1,3
rs("hits")=rs("hits")+1
rs.update
%>

代码中的articleid依然没有做任何判断就进行SQL查询,导致注入漏洞又现身了,主要原因还是“bolg_show.asp”文件没有调用防注入文件。后来在读代码过程中发现这套系统只有极少的文件包含了“www_Sql.Asp”防注入文件。不过我想,在网络上像这样的播客程序应该不会轻易的存在注入漏洞,如今稍微有点安全意识的管理员在架设站点时,很有可能将“www_Sql.Asp”文件包含在数据库连接文件中。这个问题我们先不讨论,利用拿到的账户和密码进后台,发现后台功能相当强大,估计可以和动易一比高下,如图1所示。

芜湖播客家园程序漏洞分析

图 1
这套程序的后台存在数据库备份功能,我上传了图片木马,再恢复数据库即可得到WebShell。在上面我已经说过,本套播客系统也有防注入文件,如果管理员在数据库连接文件conn.asp中调用该文件的话,注入这条路就很难走下去了。不过在看程序代码时,发现即使数据库连接文件包含了防注入文件(www_Sql.Asp)也不能保证其安全,接下来我们继续挖掘漏洞。
 
假想漏洞
为什么说是假想漏洞呢?因为这个漏洞也许会产生,也可能不会产生,不过个人认为漏洞产生的几率比上面的SQL注入漏洞几率还要高。这时读者朋友们可能要问为什么了,请听我细细分解。
上面说了这套程序存在“www_Sql.Asp”防注入文件,不过其代码有点小问题,就是没有过滤Cookie提交,代码如下。
 
<%
If Request.QueryString<>"" Then
For Each Fy_Get In Request.QueryString
For Fy_Xh=0 To Ubound(Fy_Inf)
If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>0 Then
Fy_dbstr="DBQ="+server.mappath("SqlIn.asp")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
Set Fy_db=Server.CreateObject("ADODB.CONNECTION")
Fy_db.open Fy_dbstr
Fy_db.Execute("insertinto SqlIn(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) values("&Request.ServerVariables("REMOTE_ADDR")&","&Request.ServerVariables("URL")&",GET,"&Fy_Get&","&replace(Request.QueryString(Fy_Get),"","")&")")
Fy_db.close
Set Fy_db = Nothing
%>

上面代码中将非法提交的字符写入到sqlin.asp这个数据库中,记录下非法操作的行为,可是这个数据库是ASP后缀名,里面同样也没有防下载表,这就造成了一个漏洞,我们可以在IE的地址栏中输入一些特殊字符,想办法将一句话木马写入数据库中,就可以得到WebShell了。想法总是好的,但是实际情况有时会有点出入,我在事后发现sqlin.asp这个数据库已经不能利用了,因为数据库在IE下浏览时出现了如图2所示的情况。

芜湖播客家园程序漏洞分析

图2
我在测试过程中将一句话木马“<%execute request(“a”)%>”加密成“%3C%25execute+request%28%22a%22%29%25%3E”就可以成功写入数据库,可惜现在已经不能成功利用了,很遗憾。虽说很遗憾,不过接下来的一处漏洞更具有杀伤性。
 
Admin_mobanadd.asp文件无验证
这个漏洞应该是一个疏忽吧,主要还是没有经过Session验证,应该是人为造成的。admin_moban.asp文件的数据库连接文件并不是conn.asp文件,而是conn_user.asp文件。在conn_user.asp文件中,数据库并不是网站的主数据库,如果是网站的主数据库还真的没办法,因为主数据库中包含防下载表,所以即使有机会插马也不能运行。在conn_user.asp文件中有如下代码:
 
<%
dim UserTableType,Conn_User,db_bbs
UserTableType = "MyPower" db_bbs="date/#el99cn516showcn9988#d.asp"
数据库文件的位置
Set Conn_User = Server.CreateObject("ADODB.Connection")
Conn_User.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db_bbs)
sub CloseConn_User()
Conn_User.close
set Conn_User=nothing
end sub
%>