无敌的我又回来了,今天这个文章是对后台万能密码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>
我们在数据库里的内容是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,构成了万能密码注入
欢饮各位一起交流学习
----学无止境