51Testing软件测试论坛

标题: 用户登陆测试时考虑sql注入的具体用例是什么,能否指教一下 [打印本页]

作者: xuxinqiujiao    时间: 2008-7-18 13:05
标题: 用户登陆测试时考虑sql注入的具体用例是什么,能否指教一下
测用户登陆时,要考虑sql注入情况,什么1 or 1=1 的,不太明白,高手能否指教一二。具体用例是什么
作者: xuxinqiujiao    时间: 2008-7-18 16:03
呜呜,为什么没人回呢,指教一下啊
作者: 水印无痕    时间: 2008-7-18 17:24
其实我只是打个比方
意思是不要光局限与字符组合
能测的方面是非常多的
至于sql注入
一般来说现在的网站也不会做的那么弱智
但是有的时候还是有可能有这个问题的

贴段文章给你看
SQL注入式攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql命令以及进行其他方式的攻击   
  动态生成Sql命令时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。   
  比如:   
    如果你的查询语句是select   *   from   admin   where   username='"&user&"'   and   password='"&pwd&"'"   
   
    那么,如果我的用户名是:1'   or   '1'='1   
    那么,你的查询语句将会变成:   
    select   *   from   admin   where   username='1   or   '1'='1'   and   password='"&pwd&"'"   
    这样你的查询语句就通过了,从而就可以进入你的管理界面。   
   
  所以防范的时候需要对用户的输入进行检查。特别式一些特殊字符,比如单引号,双引号,分号,逗号,冒号,连接号等进行转换或者过滤。   
   
  需要过滤的特殊字符及字符串有:   
       net   user   
       xp_cmdshell   
       /add   
       exec   master.dbo.xp_cmdshell   
       net   localgroup   administrators   
       select   
       count   
       Asc   
       char   
       mid   
       '   
       :   
       "   
       insert   
       delete   from   
       drop   table   
       update   
       truncate   
       from   
       %   
   
  下面是我写的两种关于解决注入式攻击的防范代码,供大家学习参考!   
  js版的防范SQL注入式攻击代码~:   
   
  [CODE   START]       
  <script   language="javascript">   
  <!--   
    var   url   =   location.search;   
    var   re=/^\?(.*)(select%20|insert%20|delete%20from%20|count\(|drop%20table|update%20truncate%20|asc\(|mid\(|char\(|xp_cmdshell|exec%20master|net%20localgroup%20administrators|\"|:|net%20user|\'|%20or%20)(.*)$/gi;   
    var   e   =   re.test(url);   
    if(e)   {   
      alert("地址中含有非法字符~");   
      location.href="error.asp";   
    }   
  //-->   
  <script>     
  [CODE   END]     
   
   
  asp版的防范SQL注入式攻击代码~:   
  [CODE   START]   
  <%   
  On   Error   Resume   Next   
  Dim   strTemp   
   
  If   LCase(Request.ServerVariables("HTTPS"))   =   "off"   Then   
    strTemp   =   "http://"   
  Else   
    strTemp   =   "https://"   
  End   If   
   
  strTemp   =   strTemp   &   Request.ServerVariables("SERVER_NAME")   
  If   Request.ServerVariables("SERVER_PORT")   <>   80   Then   strTemp   =   strTemp   &   ":"   &   Request.ServerVariables("SERVER_PORT")   
   
  strTemp   =   strTemp   &   Request.ServerVariables("URL")   
   
  If   Trim(Request.QueryString)   <>   ""   Then   strTemp   =   strTemp   &   "?"   &   Trim(Request.QueryString)   
   
  strTemp   =   LCase(strTemp)   
   
  If   Instr(strTemp,"select%20")   or   Instr(strTemp,"insert%20")   or   Instr(strTemp,"delete%20from")   or   Instr(strTemp,"count(")   or   Instr(strTemp,"drop%20table")   or   Instr(strTemp,"update%20")   or   Instr(strTemp,"truncate%20")   or   Instr(strTemp,"asc(")   or   Instr(strTemp,"mid(")   or   Instr(strTemp,"char(")   or   Instr(strTemp,"xp_cmdshell")   or   Instr(strTemp,"exec%20master")   or   Instr(strTemp,"net%20localgroup%20administrators")     or   Instr(strTemp,":")   or   Instr(strTemp,"net%20user")   or   Instr(strTemp,"'")   or   Instr(strTemp,"%20or%20")   then   
    Response.Write   "<script   language='javascript'>"   
    Response.Write   "alert('非法地址!!');"   
    Response.Write   "location.href='error.asp';"   
    Response.Write   "<script>"   
  End   If   
  %>   
  [CODE   END]   
   
   
   
  C#   检查字符串,防SQL注入攻击   
  这个例子里暂定为=号和'号   
  bool   CheckParams(params   object[]   args)   
  {   
          string[]   Lawlesses={"=","'"};   
          if(Lawlesses==null||Lawlesses.Length<=0)return   true;   
          //构造正则表达式,例awlesses是=号和'号,则正则表达式为   .*[=}'].*     (正则表达式相关内容请见MSDN)   
          //另外,由于我是想做通用而且容易修改的函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;   
          string   str_Regex=".*[";   
          for(int   i=0;i<   Lawlesses.Length-1;i++)   
                  str_Regex+=Lawlesses+"|";   
          str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";   
          //   
          foreach(object   arg   in   args)   
          {   
                  if(arg   is   string)//如果是字符串,直接检查   
                  {   
                          if(Regex.Matches(arg.ToString(),str_Regex).Count>0)   
                          return   false;   
                  }   
                  else   if(arg   is   ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查   
                  {   
                          foreach(object   obj   in   (ICollection)arg)   
                          {   
                                  if(obj   is   string)   
                                  {   
                                          if(Regex.Matches(obj.ToString(),str_Regex).Count>0)   
                                          return   false;   
                                  }   
                          }   
                  }   
          }   
          return   true;   
   

作者: xuxinqiujiao    时间: 2008-7-20 19:39
谢谢水印无痕,记住你的名字了,谢谢哦
作者: david.wang    时间: 2008-7-20 23:08
学习中,
作者: Lydia313    时间: 2011-9-22 18:50
请问 中如何测试 cookie 中的 sql注入问题
作者: lllxmz    时间: 2011-10-15 01:04
回复 6# Lydia313


    不懂啊
作者: edison1256    时间: 2011-10-28 11:06
先标记下,然后研究研究




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2