我正在尝试制作一个容易受到 SQL UNION 注入攻击(或某种类型的 SQL 注入攻击)的 Web 应用程序(LAMP 堆栈 - MySQL 版本:8.0.36-0ubuntu0.22.04.1)。该代码通过 POST 参数获取用户的输入来获取 VIN 和里程。
以下 PHP 代码处理后端以将参数添加到数据库:
// If SESSION variables are set then proceed to Mileage.php
if (isset($_SESSION['username'])) {
// PHP Code for Handling ADDING CAR
// Declare Variables
$username = $_SESSION['username'];
$vin = $_POST['vehicle'];
$mileage = $_POST['mileage'];
// Implement Try-catch for Error Hanlding
try {
// Add Mileage
if(isset($_POST['add_data'])) {
$query = "INSERT INTO mileage_master.mileages (`username`, `VIN`, `mileage`) VALUES ('$username', '$vin', '$mileage')";
$query_result = mysqli_query($db,$query);
// Update Mileage
} elseif(isset($_POST['update_data'])) {
// Query to update associated VIN's Mileage
$update = "UPDATE mileage_master.mileages SET mileage='$mileage' WHERE username='$username' AND VIN='$vin'";
$update_result = mysqli_query($db,$update);
// Remove Mileage
} elseif(isset($_POST['remove_data'])) {
// Query to Remove VIN & Mileage
$remove = "DELETE FROM mileage_master.mileages WHERE username='$username' AND VIN='$vin'";
$remove_result = mysqli_query($db,$remove);
}
}
catch (mysqli_sql_exception $e) {
$showAlert = true;
// Display Syntax Error
$errorMessage = "My SQL Error: " . $e->getMessage();
// Display Query (Intentional Unsafe Coding Practices)
$errorMessage .= "\t||\tQuery: " . $sql;
}
}
else {
header("Location: /");
}
?>
以下 PHP 代码将 VIN 和里程打印到用户页面:
<?php
// Query to get all VINs associated with username
$result = mysqli_query($db,"SELECT * FROM mileages WHERE username='$username'");
echo "<table style='margin-top: 35px;'>";
echo "<tr><th>VIN</th>";
echo "<th>Mileage</th></tr>";
// While Loop to iterate through all returned rows
while($row = mysqli_fetch_assoc($result)) {
echo "<tr style='text-align: center;'>";
// VIN
echo "<td>" . $row['VIN'] . "</td>";
// Mileage
echo "<td>" . $row['mileage'] . "</td>";
echo "</tr>";
}
echo "</table>";
?>
我的思考过程是,由于应用程序使用动态查询,攻击者可能会包含某种类型的 UNION SELECT 语句。 UNION select 语句的输出将存储在该查询的 VIN 列中。
但是,我无法创建成功的 SQL 注入有效负载来完成此任务。
我是否需要更改应用程序的逻辑才能使漏洞利用成为可能,或者我的想法一开始就无法利用?
为了模拟 UNION SQL 注入漏洞以用于教育目的,您可以修改应用程序以包含一项功能,用户可以通过 VIN 或里程搜索其车辆,直接将用户输入插入到 SELECT 查询中。
// Example of a vulnerable SELECT query
if(isset($_POST['search_vin'])) {
$search_vin = $_POST['search_vin'];
$query = "SELECT * FROM mileage_master.mileages WHERE VIN='$search_vin'";
$result = mysqli_query($db, $query);
// Code to display results
}
此示例容易受到 UNION SQL 注入的攻击,因为攻击者可以输入诸如 0' UNION SELECT 用户名、密码等值作为 search_vin,从而可能允许他们从数据库中提取敏感信息。