文章目錄
- 前言
- 一、環境
- 二、漏洞復現
- [1]. 創建資料
- [2]. 請求頁面
- [3]. 資料庫查詢
- [4]. 登錄測驗
- [5]. 漏洞成因
- [6]. SQL陳述句查詢
前言
萬能密碼的原理就是使用引號或者注釋符號,使得原本的
sql陳述句被修改,從而繞過登錄限制,
使用PHPmyAdmin和Navicat作用是一樣的,都是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陳述句則是使用雙引號,此時將'替換成"即可
| 用戶名 | 萬能密碼 |
|---|---|
賬戶'/* | */' |
賬戶'-- | 任意 |
賬戶'# | 任意 |
二、漏洞復現
[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.phpshow.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
中間的灰色部分就是被注釋掉的代碼

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293528.html
標籤:其他
上一篇:vulnhub DC2 靶場練習
