当前位置: 首页 > news >正文

从一次简单的登录绕过看起:HMS v1.0 SQL注入漏洞(CVE-2022-23366)的代码审计入门

从零开始代码审计:HMS v1.0 SQL注入漏洞深度剖析

医疗管理系统作为医院核心业务支撑平台,其安全性直接关系到患者隐私和医疗数据完整性。2022年曝光的HMS v1.0 SQL注入漏洞(CVE-2022-23366)为我们提供了一个绝佳的学习案例,本文将带您从开发者视角,逐步拆解这个典型的安全漏洞。

1. 漏洞背景与环境搭建

HMS(Hospital Management System)是一款面向中小型医疗机构的开源管理系统,采用PHP+MySQL架构开发。其1.0版本的doctorlogin.php文件存在字符型SQL注入漏洞,攻击者无需任何认证即可通过构造特殊输入执行任意SQL命令。

搭建测试环境:

# 使用Docker快速搭建测试环境 docker run -d -p 8080:80 --name hms-vuln \ -e MYSQL_ROOT_PASSWORD=root \ -v ./hms:/var/www/html \ php:7.4-apache

环境配置完成后,我们需要重点关注以下文件结构:

/hms ├── includes │ ├── db_connect.php │ └── functions.php ├── doctorlogin.php └── index.php

提示:实际审计时建议使用虚拟机隔离环境,避免影响生产系统

2. 漏洞定位与初步分析

通过黑盒测试发现,当在医生登录页面提交特殊字符时,系统返回异常数据库错误信息。这提示我们可能存在SQL注入点。

典型测试用例:

  1. 正常输入:loginid=doctor1&password=123456
  2. 测试输入:loginid=doctor1'&password=123456

对比两种输入的响应差异,后者返回了MySQL语法错误,这证实了我们的猜想。

关键代码段分析:

// doctorlogin.php 关键片段 $loginid = $_POST['loginid']; $password = $_POST['password']; $sql = "SELECT * FROM doctors WHERE loginid='$loginid' AND password='$password'"; $result = mysqli_query($conn, $sql);

这段代码直接将用户输入拼接到SQL语句中,没有任何过滤或参数化处理,是典型的一阶SQL注入漏洞。

3. 深入代码审计技术细节

3.1 漏洞形成机制

该漏洞属于字符型注入,攻击者可以通过单引号闭合原始查询,然后插入恶意SQL代码。漏洞形成的根本原因包括:

  1. 未经验证的用户输入:直接使用$_POST变量而未做任何过滤
  2. 字符串拼接方式构造SQL:使用变量插值而非参数化查询
  3. 错误信息泄露:默认配置下显示详细数据库错误

漏洞利用链分析:

用户输入 → 直接拼接SQL → 数据库执行 → 结果返回 ↑ 无任何过滤或参数化处理

3.2 安全编码对比

下表对比了危险写法与安全写法的关键区别:

危险写法安全写法防护原理
$sql = "SELECT * FROM users WHERE id='$id'"$stmt = $conn->prepare("SELECT * FROM users WHERE id=?")参数化查询
直接使用$_GET/$_POST使用filter_input()过滤输入验证
显示详细错误信息自定义错误页面信息控制

4. 漏洞修复与防御方案

4.1 即时修复方案

对于已部署的系统,可采取以下临时措施:

// 临时修复方案 - 输入过滤 $loginid = mysqli_real_escape_string($conn, $_POST['loginid']); $password = mysqli_real_escape_string($conn, $_POST['password']);

注意:这仅是临时方案,转义函数不能完全防止SQL注入

4.2 长期解决方案

推荐使用PDO预处理语句:

// 使用PDO的完整安全方案 $stmt = $pdo->prepare("SELECT * FROM doctors WHERE loginid = :loginid AND password = :password"); $stmt->execute([ ':loginid' => $_POST['loginid'], ':password' => $_POST['password'] ]);

防御措施优先级:

  1. 使用参数化查询(PDO/mysqli预处理)
  2. 实施最小权限原则(数据库账户权限限制)
  3. 部署WAF(Web应用防火墙)
  4. 定期安全审计与渗透测试

5. 代码审计实战技巧

在实际审计过程中,我通常会采用以下方法定位SQL注入漏洞:

  1. 入口点追踪

    • 查找所有接收用户输入的PHP文件($_GET/$_POST/$_REQUEST
    • 跟踪输入变量在代码中的传递路径
  2. 危险函数识别

    # 使用grep查找潜在危险代码 grep -rn "mysqli_query" ./ grep -rn "SELECT.*FROM.*WHERE.*\"" ./
  3. 动态调试技巧

    • 在数据库层记录实际执行的SQL语句
    • 使用Xdebug进行步进调试

典型漏洞模式识别表:

模式特征风险等级示例
直接拼接用户输入高危"SELECT * FROM users WHERE id='$id'"
使用mysql_系列函数中高危mysql_query("SELECT...")
未过滤的ORDER BY子句中危$order = $_GET['order']; ... ORDER BY $order

6. 安全开发最佳实践

基于多年审计经验,我总结出以下安全编码规范:

  1. 输入验证原则

    • 白名单优于黑名单
    • 尽早验证,严格验证
    • 类型、长度、格式多重检查
  2. 数据库操作规范

    // 安全示例:PDO预处理+异常处理 try { $pdo = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false ]); $stmt = $pdo->prepare("INSERT INTO logs (message) VALUES (?)"); $stmt->execute([$userInput]); } catch (PDOException $e) { error_log("Database error: " . $e->getMessage()); showGenericError(); }
  3. 安全工具链集成

    • 静态分析工具:PHPStan、Psalm
    • 动态扫描工具:OWASP ZAP
    • Git Hooks预检查

在最近一次医疗系统审计中,我们发现即使使用了预处理语句,如果配置不当(如PDO::ATTR_EMULATE_PREPARES=true)仍可能导致注入风险。这提醒我们安全措施需要全面考虑各种边界情况。

http://www.jsqmd.com/news/844184/

相关文章:

  • 05_分支结构与多重选择_if和switch的使用
  • 【亲测免费】 网Conf客户端软件-Windows版:网络管理的得力助手
  • 告别传统绘图:Draw.io Mermaid插件让代码驱动图表生成变得简单
  • 告别轮询!STM32CubeMX配置DMA串口收发485数据,并详解HAL库回调函数使用避坑
  • 智能后视镜存储芯片选型:从eMMC到UFS的车规级实战指南
  • 智慧养老机器人体系:三层架构、场景落地与关键技术解析
  • CPPM证书的有效期与续证要求说明 - 众智商学院官方
  • Figma中文界面3分钟搞定:告别英文障碍的设计神器
  • CrewAI实战:多智能体协作开发完整指南
  • 沃尔玛购物卡回收服务,一键搞定! - 团团收购物卡回收
  • 百度季报图解:营收321亿 AI业务占比首次过半 DAA重塑AI价值标准
  • 大理石方尺批发赛道:紫青坤麟的合规交付与核心优势 - 奔跑123
  • 0503 光刻机 第五卷:EUV光源系统(S级 长期死磕突破)第3小节:产业化核心卡点(材料/工艺/软件/可靠性,全链路死磕)
  • HTTP 常用状态码速查表
  • 告别手动ping!用netspy这款神器,5分钟摸清内网所有存活网段
  • 手机号逆向查询QQ号:3分钟掌握Python自动化查询技巧
  • 告别本科论文 “写作内耗”:paperxie 智能写作,按部就班搞定毕业论文
  • obamify跨平台兼容性解决方案:从桌面到Web的完美迁移指南
  • 2026年,上海植物油燃料公司哪家可靠?这份推荐值得一看! - 速递信息
  • 2026 年 5 月东莞名表回收指南,收的顶全品牌可受理 - 奢侈品回收测评
  • 深耕深圳奢表回收:劳力士、欧米茄、百达翡丽回收行情与机构测评 - 奢侈品回收测评
  • 在AutoDL上租GPU服务器,用Keras/TensorFlow搞定Unet眼底血管分割(附完整代码)
  • Nacos AP 和 CP 模式
  • Key User Extensibility,SAP S/4HANA Cloud 里最容易被低估的一条扩展路径
  • 如何在5分钟内配置Zotero PDF翻译插件:新手快速入门终极指南
  • MySQL 面试题爆款详解:InnoDB 页机制、B+树索引、Buffer Pool、Redo Log、页分裂与性能优化一次讲透
  • 电力CPS离散事件仿真技术:DESTinE工具解析与应用
  • 微电网系统优质品牌盘点:国内头部厂商技术实力、定制能力与交付效率解析 - 品牌推荐大师
  • 长沙闲置黄金变现不踩坑!合扬免费鉴定,报价即实价,安心无忧 - 奢侈品回收测评
  • Source Han Serif CN:7种字重免费开源中文字体,让你的中文排版瞬间专业!