# 漏洞总结:Pizzafy Ecommerce System 1.0 SQL注入漏洞 ## 漏洞概述 * **漏洞类型**:基于错误的SQL注入 (Error-Based SQL Injection) * **严重程度**:HIGH (高危) * **受影响版本**:Pizzafy Ecommerce System 1.0 * **漏洞描述**:在 `select` 功能中,`id` 参数和 `id` 列未进行适当清理,允许攻击者将恶意SQL命令注入后端数据库查询。 * **漏洞端点**:`pizzafy/index.php?page=category&id=3` ## 影响范围 * **机密性 (Confidentiality)**:完整数据库架构和用户凭据泄露。 * **完整性 (Integrity)**:未经授权删除或修改记录。 * **可用性 (Availability)**:大规模删除导致服务拒绝。 * **权限提升 (Privilege Escalation)**:通过会话数据提取进行会话劫持和管理员访问。 ## 概念验证 (PoC) **利用代码 (GET Request):** ```http http://localhost/pizzafy/index.php?page=category&id=1%20AND%20extractvalue(1,CONCAT(0x7e,(SELECT%20table_name%20FROM%20information_schema.tables%20WHERE%20table_schema=database())%20LIMIT%200,1),0x7e) ``` **原始漏洞代码 (Vulnerable Code):** ```php $id = $_GET['id'] ?? ""; if(empty($id)){ throw new ErrorException("Error: This page requires a category ID."); } $category_qry = $conn->query("SELECT * FROM category_list where id = $id"); if (!$category_qry) { print $conn->error; } if($category_qry->num_rows > 0){ $data = $category_qry->fetch_assoc(); }else{ throw new ErrorException("Error: This page requires a category ID."); } ``` ## 修复方案 1. **使用预处理语句 (Prepared Statements)**:使用参数化查询以防止SQL注入。 2. **输入验证 (Input Validation)**:验证并清理 `id` 参数,仅允许预期的值。 3. **数据库权限 (Database Permissions)**:限制数据库用户权限,以限制SQL注入的潜在损害。 4. **监控与日志 (Monitoring & Logging)**:跟踪和警报异常模式,如慢查询或重复访问尝试。 5. **安全测试 (Security Testing)**:执行常规渗透测试和代码审查,以识别和缓解漏洞。 6. **错误处理 (Error Handling)**:避免在响应中暴露数据库相关错误,这可能会帮助攻击者。 **修复后的代码示例:** ```php $id = isset($_GET['id']) ? (int)$_GET['id'] : 0; if(empty($id) || $id == 0){ throw new ErrorException("Error: This page requires a valid category ID."); } $stmt = $conn->prepare("SELECT * FROM category_list WHERE id = ?"); $stmt->bind_param("i", $id); $stmt->execute(); $category_qry = $stmt->get_result(); if (!$category_qry) { error_log("Database error: " . $conn->error); throw new ErrorException("An error occurred. Please try again later."); } if($category_qry->num_rows > 0){ $data = $category_qry->fetch_assoc(); } else { throw new ErrorException("Error: Category not found."); } ```