安全-万能密码漏洞复现

Posted 小狐狸FM

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安全-万能密码漏洞复现相关的知识,希望对你有一定的参考价值。

前言

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

万能密码 博客园

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

PHP教程 菜鸟教程

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

PHP:Mysqli - Manual

MySQL注释

一、环境

软件版本
Navicat9.x
PHPmyAdmin4.8.5
PHPstorm2020.1
PHPstudy8.1.1.3
PHP7.x
Mysql5.7.26
数据库用户名密码
foxfoxtown

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

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

二、漏洞复现

[1]. 创建数据

先修改一下phpstudyroot用户密码,然后创建一个数据库及用户名密码

安装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
中间的灰色部分就是被注释掉的代码

以上是关于安全-万能密码漏洞复现的主要内容,如果未能解决你的问题,请参考以下文章

应用安全 - 密码学 - 协议安全 - SSL/TLS - 漏洞 - 汇总

安全-emlog 小于等于5.1.2版本 博客系统后台权限提升漏洞复现(i春秋)

shiro反序列化漏洞复现

Office CVE-2017-8570远程代码执行漏洞复现

安全-Fastjson 小于等于1.2.24版本代码执行漏洞复现(vulhub)

MS15-034漏洞复现HTTP.SYS远程代码执行漏洞