安全-万能密码漏洞复现

前言

万能密码的原理就是使用引号或者注释符号,使得原本的sql语句被修改,从而绕过登录限制。
使用PHPmyAdminNavicat作用是一样的,都是mysql的可视化工具

万能密码 博客园

php中mysqli 处理查询结果集的几个方法

PHP教程 菜鸟教程

PHP MySQL 数据库读取数据 菜鸟教程

PHP:Mysqli - Manual

MySQL注释

一、环境

软件 版本
Navicat 9.x
PHPmyAdmin 4.8.5
PHPstorm 2020.1
PHPstudy 8.1.1.3
PHP 7.x
Mysql 5.7.26
数据库用户名 密码
fox foxtown

下方表格使用单引号,是因为我的mysql语句内用的单引号,需要使用单引号使其闭合
有的mysql语句则是使用双引号,此时将'替换成"即可

用户名 万能密码
账户'/* */'
账户'-- 任意
账户'# 任意

二、安全-万能密码漏洞复现

安装phpMyAdmin用于管理mysql,点击管理进入phpMyAdmin界面

安全-万能密码漏洞复现

然后使用新建的数据库用户进行登录

安全-万能密码漏洞复现

创建一个表test,含有三个字段iduser_namepassword
插入了一条数据如下图

安全-万能密码漏洞复现

也可以使用Navicat工具来连接数据库,操作差不多

安全-万能密码漏洞复现
安全-万能密码漏洞复现
安全-万能密码漏洞复现

[2]. 请求页面

index.php用于提交用户的请求给show.php

安全-万能密码漏洞复现
 <form method="post" action="show.php">     用户名: <input type="text" placeholder="用户名" name="name"><br>     密码: <input type="text" placeholder="密码" name="pwd"><br>     <input type="submit" value="提交"> </form>   
安全-万能密码漏洞复现

[3]. 数据库查询

安全-万能密码漏洞复现
 <?php //作者:小狐狸FM $con = mysqli_connect("127.0.0.1", "root", "abcd-1234", "foxtown");//打开数据库连接 if(mysqli_connect_errno()){     echo "数据库连接成功"; } $name = $_POST["name"]; $pwd = $_POST["pwd"]; //echo "姓名:" . $name . " 密码:" . $pwd;//输出 //$query = "select * from test where id=1";//查询语句 $query = "select * from test where user_name='$name' and password='$pwd'";//查询语句 $result = mysqli_query($con, $query);//执行查询 $num = mysqli_num_rows($result);//影响的行数 if($num>0){//查到数据时     $row = $result->fetch_assoc();//获取一条记录     /*输出指定列*/     echo $row["id"] . "n";     echo $row["user_name"] . "n";     echo $row["password"] . "n";     mysqli_free_result($result);//释放结果集 }else{     echo "未查询到数据n"; }  $con->close();//关闭连接 ?> 

[4]. 登录测试

  • php代码的算法是将index.php提交的post请求发送给show.php
  • show.php连接了mysql数据库后,就查询foxtown数据库的test表是否存在该用户名和密码
    存在就显示id、user_name、password三个字段的内容,不存在就显示错误提示。
安全-万能密码漏洞复现
安全-万能密码漏洞复现

使用正确的用户名密码进行登录时,返回的内容和mysql数据库的内容相同

安全-万能密码漏洞复现
安全-万能密码漏洞复现
用户名 万能密码
账户'/* */'
账户'-- 任意
账户'# 任意
安全-万能密码漏洞复现 安全-万能密码漏洞复现

[5]. 漏洞成因

出现的漏洞点位于show.php中的第11行,$name$pwd是用户提交的用户名和密码

$query = "select * from test where user_name='$name' and password='$pwd'";//查询语句 

show.php中添加一行用来显示$query变量,当传入小狐狸FM'/**/'时,实际的代码如下

安全-万能密码漏洞复现
$query = "select * from test where user_name='小狐狸FM'/*' and password='*/''";//查询语句 

此时/**/组成了一个注释符号,这样就导致/*' and password='*/的内容被注释失效了
真正执行的代码就变成了下面的代码

$query = "select * from test where user_name='小狐狸FM'''";//查询语句 
  • 用户名中的单引号是为了和where user_name='中的单引号形成闭合,
    密码中的单引号是为了和password='$pwd'的第二个单引号形成闭合。
  • 当所有的双引号和单引号都闭合后,代码就不会报错从而继续执行代码了。
  • 最终在mysql中执行的语句就只判断了user_name字段,没有判断password字段
select * from test where user_name='小狐狸FM''' 

[6]. SQL语句查询

使用PHPmyadmin的时候发现执行sql代码的时候会出现问题,所以测试是使用的Navaicat
中间的灰色部分就是被注释掉的代码

安全-万能密码漏洞复现

版权声明:玥玥 发表于 2021-08-13 23:37:45。
转载请注明:安全-万能密码漏洞复现 | 女黑客导航