安全-万能密码漏洞复现
Posted 小狐狸FM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安全-万能密码漏洞复现相关的知识,希望对你有一定的参考价值。
前言
万能密码的原理就是使用引号或者注释符号,使得原本的
sql
语句被修改,从而绕过登录限制。
使用phpmyAdmin
和Navicat
作用是一样的,都是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
语句则是使用双引号,此时将'
替换成"
即可
用户名 | 万能密码 |
---|---|
账户'/* | */' |
账户'-- | 任意 |
账户'# | 任意 |
二、漏洞复现
[1]. 创建数据
先修改一下
phpstudy
的root
用户密码,然后创建一个数据库及用户名密码
安装
phpMyAdmin
用于管理mysql
,点击管理进入phpMyAdmin
界面
然后使用新建的数据库用户进行登录
创建一个表
test
,含有三个字段id
、user_name
和password
插入了一条数据如下图
也可以使用
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春秋)
Office CVE-2017-8570远程代码执行漏洞复现