万能密码注入解析

  无敌的我又回来了,今天这个文章是对后台万能密码or登陆的一个解析

  start my perform:

    Ok,先贴本地的代码

      

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>万能密码登陆</title>
 5     <meta charset="utf-8">
 6 </head>
 7 <body>
 8     <form action="" method="POST">
 9         <input type="hidden" name="hid" value="1">
10         账号:<input type="text" name="username"><br>
11         密码:<input type="password" name="password"><br>
12         <input type="submit" value="登陆">
13     </form>
14     <?php
15         if(isset($_POST['hid'])){
16             $username = !empty($_POST['username'])?$_POST['username']:"";
17             $password = !empty($_POST['password'])?$_POST['password']:"";
18             if($username == "" || $password == ""){
19                 ?>
20                 <script type="text/javascript">
21                     alert("账号或密码不能为空!!!");
22                 </script>
23                 <?php
24                 exit();
25             }
26             mysql_connect("127.0.0.1","root","root");        //链接数据库
27             mysql_select_db("sqli");                        //选择数据
28             mysql_query("set names utf8");                    //设置字符集
29             /*
30                 创建数据表
31                 create table admin(
32                     id int primary key auto_increment,
33                     username varchar(10),
34                     password char(32)        -- 因为等下插入的密码是经过md5加密的,所以这里长度是32
35                 )charset utf8;
36                 admin 加密 21232f297a57a5a743894a0e4a801fc3
37                 插入测试数据
38                 insert into admin values(null,'admin','21232f297a57a5a743894a0e4a801fc3');
39             */
40             $password = md5($password);
41             $sql = "select * from admin where username = '$username' and password = '$password'";
42             mysql_query($sql);            //执行SQL语句
43             if(mysql_affected_rows()>0){            //如果上一次执行的SQL语句影响的行号大于0,就继续执行
44                 ?>
45                 <script type="text/javascript">
46                     alert("登陆成功");
47                 </script>
48                 <?php
49             }else{
50                 ?>
51                 <script type="text/javascript">
52                     alert("登陆失败");
53                 </script>
54                 <?php
55             }        
56     ?>
57 </body>
58 </html>
View Code

    我们在数据库里的内容是admin admin(密码,是被加密的)

   账号密码正确弹框,不正确也弹框.

   测试一下:

    成功:

      

    失败:

      

    OK,我们在账号处输入' or 1=1 #  密码随便

      

    可以看到这个密码是可以登陆上去的,我们来看一下代入到SQL执行的语句

      首先,他代入进去的SQL语句是:select * from admin where username = '$username' and password = '$password'

      我们通过提交构成的语句:select * from admin where username = ' 'or 1=1 #'

      分析:

        我们提交了' or 1=1 #   前面的单引号闭合了sql中的单引号,然后or 1=1 #注释掉了后面的单引号

        简化语句:select * from admin where username = '' or 1=1,不管username是否等于空,or 1=1都是真,所以这条语句的返回也是true,构成了万能密码注入

    欢饮各位一起交流学习

              ----学无止境

      

原文地址:https://www.cnblogs.com/Miracle-reproduction/p/7236265.html