ASP漏洞分析

  • A+
所属分类:网络安全

对一类ASP安全漏洞的分析及解决方案的探讨
            近日,本人用ASP编写一套新闻管理系统。其间从网上查阅了很多相关资料,也下载了不少有关的成套系统。通读了源码后发现了很多问题。在此提出其中较为普遍一例,希望能给大家帮助。 

            相必大家都很明白,ASP编程中,身份验证是相当重要而常用的。而很多网上的免费ASP程序对这方面处理的却不竟人意。下面以XX工作室出品的一个小系统来看问题具体出在哪里。先来看如部分相关程序: 

            index.asp: 
            <HTML><HEAD><TITLE>XX工作室注册系统</TITLE> 
            <META http-equiv=Content-Type content="text/html; 
            charset=gb2312"><LINK 
            href="image/style.css" rel=stylesheet> 
            <SCRIPT language=JavaScript> 
            <!-- 
            <!-- hide this script from non-javascript-enabled browsers 
            function checkform(){ 
            //check the user input value 
            if( document.Login.UserID.value==""){ 
            alert("请输入用户名!"); 
            document.Login.UserID.focus(); 
            return false; 
            } 
            if( document.Login.Password.value==""){ 
            alert("请输入您的密码!"); 
            document.Login.Password.focus(); 
            return false; 
            } 
            return true; 
            } 
            // stop hiding --> 
            //--> 
            </SCRIPT> 
            <META content="MSHTML 5.50.4807.2300" name=GENERATOR></HEAD> 
            <BODY bgColor=#000000 leftMargin=0 topMargin=0 marginheight="0" 
            marginwidth="0">
            <TABLE height=600 cellSpacing=0 cellPadding=0 width="100%" border=0> 

            <TBODY> 
            <TR> 
            <TD width="100%" height=14> 
            <DIV align=center><!--#include file="head.asp" --></DIV> 
            </TD></TR> 
            <TR> 
            <TD vAlign=center align=middle width="100%" bgColor=#7b0000 
            height=315> 
            <FORM name=Login onsubmit="return checkform();" action=login.asp 
            method=post> 
            <TABLE height=126 cellSpacing=0 borderColorDark=#ff9933 
            cellPadding=3 
            width=30% align=center borderColorLight=#000000 border=1> 
            <TBODY> 
            <TR> 
            <TD vAlign=middle align=center width="100%" height=88><FONT 
            color=#ffffff> 用户名: 
            <INPUT size=15 
            name=UserID> 
            <BR> 
            <BR> 
            口 令: 
            <INPUT 
            type=password size=15 name=Password> 
            </FONT> </TD> 
            </TR> 
            <TR> 
            <TD vAlign=center align=left width="100%" bgColor=#7b0000 
            height=17> <A 
            href="join.asp"><IMG 
            src="image/button-join.gif" border=0></A> &n
            bsp; 
            <input type=image src="image/button-login.gif" 
            align=absMiddle border=0 name="image"> 
            </TD> 
            </TR></TBODY></TABLE></FORM> 
            <P></P></TD></TR> 
            <TR> 
            <TD vAlign=center align=middle width="100%" bgColor=#7b0000 
            height=32></TD></TR> 
            <TR> 
            <TD width="100%" colSpan=2> 
            <TABLE height=101 cellSpacing=0 cellPadding=0 width="100%" 
            bgColor=#000000
            border=0> 
            <TBODY> 
            <TR> 
            <TD vAlign=top align=left bgColor=#000000 colSpan=4 height=21> 
            <HR color=#983625> 
            </TD></TR> 
            <TR> 
            <TD vAlign=center align=middle bgColor=#983625 colSpan=4 
            height=80> 
            <!--#include file="copyright.asp" --> 
            </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML> 
            处理请求的login.asp程序如下: 
            <% 
            dim conn 
            dim connstr 
            on error resume next 
            connstr="DBQ="+server.mappath("db1.mdb")+";DefaultDir=;DRIVER={Microsoft 
            Acce
            ss Driver (*.mdb)};" 
            set conn=server.createobject("ADODB.CONNECTION") 
            conn.open connstr 
            Set rs = Server.CreateObject("ADODB.RecordSet") 
            user=request.form("UserID") 
            pwd=request.form("Password") 
            sql="select * from reg where username="&user&" and password="&pwd&"" 

            rs.open sql,conn,1,1 
            if not rs.eof then 
            response.redirect "main.asp" 
            elseif rs.eof and rs.bof then 
            response.write "密码错误或没有这个用户<a href=join.asp target=_blank>注册</a>" 
            end if 
            %> 
            大家看过是否发现有何不拖之处?我们分析一下,index.asp中,接收用户输入用户名及密码,并用checkform()函数检查用户名和密码理否为空,如果为空的话,提示出错信息。 

            在login.asp中,接收用户输入的Userid和Password数据,并分别赋值给user和pwd,然后再用sql="select * from reg w here username="&user&" and password="&pwd&"" 这句来对用户名和密码加以验证。 以常理来考虑的话,这是个很完整的程序了。而在实际的使用过程中,整套程序也的确可能正常使用。 
            但是如果Userid的值和password的值被赋于:x or1=1 
            这时,sql="select * from reg where username="&user&" and 
            password="&pwd&"" 就成了: 
            sql="select * from reg where user=x or 1=1 and pass=x or 1=1" 
            怎么样?!我不说大家也明白了吧! 
            既然有这样的问题,接下来我们就来看看如何解决它。从上面的程序中各位也可以看出,只要对用户输入的数据进行严格过滤就可以了。具体可以参下面的程序: 

            <% 
            user=request.from("UserID") 
            pass=request.from("password") 
            for i=1 to len(UserID) 
            cl=mid(UserID,i,1) 
            if cl="" or us="%" or us="<" or us=">" then 
            response.redirect "error.htm" 
            response.end 
            end if 
            next 
            %> 
            同样是先取得用户输入数据,然后分析用户输入的每一个字符,如发现异常,则转到错误页面。 
            if cl="" or us="%" or us="<" or us=">" then 
这一句中可以加入任意的过滤字符,跟据具体情况而定。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: