尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

医院电子病历越权与下载攻防全解析:从水平越权、垂直提权到JWT防线与目录穿越

医院电子病历越权与下载攻防全解析:从水平越权、垂直提权到JWT防线与目录穿越 目录1. 水平越权改一个数字看遍全院病历1.1. 越权是怎么发生的链接里的那段数字1.2. 篡改 ID把 19 改成 181.3. 为什么叫水平只能看到同权限的2. 垂直越权把角色字段改成 admin2.1. 登录抓包发现请求里的角色字段2.2. 篡改角色把 user 改成 admin2.3. 水平越权与垂直越权的区别3. 越权的本质一个不可调和的悖论3.1. 悖论的两端必须发 ID又怕被改 ID3.2. 悖论的核心身份凭据不可信4. JWT 防线给身份加一道不可篡改的签名4.1. 破解悖论让身份信息改不动4.2. JWT 的三段结构签名就是护城河4.3. 为什么无法篡改没有密钥就签不了名5. 目录穿越下载文件时偷走系统文件5.1. 下载功能的文件名参数5.2. 把文件名换成系统文件6. 第一轮修复过滤特殊字符与限定目录6.1. 过滤掉特殊字符6.2. 限制只能访问网站内部目录7. 第二轮博弈文件名规律照样能枚举7.1. 发现文件命名规律7.2. 替换工号依旧能下载他人文件7.3. 终极修复随机字符串重命名8. 攻防演进全景总结9. 写在最后前言这篇文章的灵感来源于一次安全测试的复盘。当时评估一套医院电子病历系统本来只想验证自己的就诊记录能不能正常读取。结果发现只要改一下链接里的数字就能看到别的患者的病历。顺着这条线一路挖下去从水平越权、垂直提权到 JWT 防线、目录穿越最后落到文件名枚举把一套完整的越权与文件下载攻防链路完整走了一遍。这篇文章就是这次评估的完整记录。文中所有代码仅用于安全研究与防御学习严禁用于任何非法用途。个人主页艺杯羹1. 水平越权改一个数字看遍全院病历1.1. 越权是怎么发生的链接里的那段数字登录医院电子病历系统点击查看自己的就诊记录。页面正常加载屏幕上出现了自己的检查和用药信息。但细心观察会发现当前病历所在网页的链接里藏着一串数字。这串数字不是别的正是当前患者的 ID。1.2. 篡改 ID把 19 改成 18既然链接里带着 ID那把这个数字改掉会怎样把 19 改成 18回车屏幕上瞬间出现了另一位患者的病历。图片说明患者 ID 直接暴露在链接中篡改 ID 即可读取其他同权限患者的病历。再改成 17、16、15……一路点下去几乎能翻遍整家医院所有普通患者的就诊记录。这种攻击就叫做水平越权。1.3. 为什么叫水平只能看到同权限的水平越权之所以叫水平是因为它只能横向触达与自己权限相同的数据。普通患者只能看到其他普通患者的病历。而权限更高的人比如管理员、科室主任普通患者是看不到的。对比项可见范围正常访问仅本人病历水平越权所有同权限患者的病历越权边界无法触达更高权限的数据也就是说水平越权只能横向扩散无法向上突破。2. 垂直越权把角色字段改成 admin2.1. 登录抓包发现请求里的角色字段水平越权只能看普通患者权限更高的数据依旧无法触及。于是回到登录界面重新输入用户名和密码。在点击登录的瞬间抓包发现登录请求里不仅带着用户名和密码。还额外携带了一个角色字段roleuser。2.2. 篡改角色把 user 改成 admin把请求里的user改成admin重新发包。登录成功后系统管理员的管理界面直接出现在眼前。这一次连权限最高的数据也尽收眼底。图片说明登录请求中的角色字段被篡改从普通用户提权为管理员突破权限等级边界。这种从低权限直接提升到高权限的攻击就叫做垂直越权。2.3. 水平越权与垂直越权的区别对比维度水平越权垂直越权攻击方向横向同级纵向跨级篡改对象数据 ID角色 / 权限字段触达范围同权限数据更高权限数据危害程度中高水平越权是看别人垂直越权是当领导。一次是横向扩散一次是纵向突破。3. 越权的本质一个不可调和的悖论两种越权攻击看似手法不同背后却指向同一个根因。这个根因本质上是一个不可调和的悖论。3.1. 悖论的两端必须发 ID又怕被改 ID一方面用户在执行操作时必须把自己的 ID 发送给服务器。服务器需要在后台解析用户身份才能据此授予对应的操作权限。另一方面一旦用户有权限把自己的 ID 发给服务器他就能把这个 ID 篡改成别人的。发送 ID 与篡改 ID在同一个请求里完成了闭环。3.2. 悖论的核心身份凭据不可信悖论面向具体表现必须发 ID服务器需要身份才能鉴权能发就能改发出去的 ID 可能被篡改结果越权漏洞天然存在问题不在用户而在用户提交的身份信息本身不可信。只要服务器完全信任客户端提交的身份字段越权就永远防不住。4. JWT 防线给身份加一道不可篡改的签名4.1. 破解悖论让身份信息改不动要解决悖论关键在于让用户没法篡改身份信息。登录时服务器不再依赖客户端提交的角色字段。而是直接根据用户名在后台数据库自动匹配用户角色。匹配成功后服务端把用户 ID、用户角色等信息签名成一个 token 返回给用户。用户之后的每一次请求都必须携带这个 token。4.2. JWT 的三段结构签名就是护城河这个 token 就是JWTJSON Web Token目前最常见的防越权手段之一。JWT 由三段组成中间用点号分隔Header.Payload.SignatureJWT 分段内容作用Header算法类型如 HS256声明签名算法Payload用户 ID、角色、过期时间承载用户身份信息Signature用密钥对前两段签名防篡改核心图片说明用户 ID 与角色被签名进 JWT缺少服务端密钥的用户无法篡改身份信息。4.3. 为什么无法篡改没有密钥就签不了名由于 JWT 是加密的且用户无法获得对应的密钥。所以用户一旦篡改了用户 ID 或角色签名就会立刻失效。服务端校验签名失败直接拒绝请求。import hmac import hashlib import base64 SECRET server-side-secret-key # 密钥只保存在服务端 def verify_token(token: str) - bool: 校验 JWT 签名是否有效 任何对 Header/Payload 的篡改都会导致签名不匹配 header, payload, signature token.split(.) expected base64.urlsafe_b64encode( hmac.new(SECRET.encode(), f{header}.{payload}.encode(), hashlib.sha256).digest() ).decode().rstrip() return hmac.compare_digest(expected, signature) # 篡改 Payload 里的角色后签名必然校验失败 token header.eyJyb2xlIjoiYWRtaW4ifQ.fake-signature print(签名有效 if verify_token(token) else 篡改被拒绝)用户改不了 ID也改不了角色越权这条路被从根上堵死。5. 目录穿越下载文件时偷走系统文件JWT 守住了身份这一关但攻击者并没有放弃。在医院系统里还有一个功能引起了注意下载病历报告。5.1. 下载功能的文件名参数每次点击下载按钮浏览器都会跳出一个新的链接。链接的末尾往往跟着要下载的文件名。比如download?file202608_10019_report.pdf。5.2. 把文件名换成系统文件看到文件名跟着链接走攻击者灵机一动。如果把文件名替换成系统文件会怎么样无论是在 Windows 还是 Linux 系统里都有一些系统文件存在于固定路径下。比如/etc目录下的passwd文件保存着 Linux 系统的用户密码信息。把链接里的文件名直接替换成/etc/passwd回车。图片说明文件名参数未校验被替换为系统路径后直接下载了服务器上最敏感的隐私文件。系统里重要的隐私文件就这样被下载了下来。这种通过文件名穿越目录、访问任意文件的技术就叫做目录穿越。6. 第一轮修复过滤特殊字符与限定目录工程师紧急修复了这个漏洞。6.1. 过滤掉特殊字符第一招不允许文件名里传递斜杠、点之类的特殊字符。/、\、..这些路径穿越的武器统统被拦截。6.2. 限制只能访问网站内部目录第二招限制网站应用只能访问网站内部的文件和目录。即使构造出路径也无法跳出应用目录去读取系统文件。修复手段说明过滤特殊字符拦截/、\、..等限定访问目录只能读取应用内部文件校验文件类型只允许指定扩展名但攻击者立刻发现这套修复存在一个漏洞。7. 第二轮博弈文件名规律照样能枚举7.1. 发现文件命名规律攻击者注意到病历报告的文件名存在明显规律。文件名由**月份 工号患者 ID**组成。比如202608_10019_report.pdf中间的10019就是患者 ID。7.2. 替换工号依旧能下载他人文件既然文件名有规律那只需要把自己的工号替换成别人的工号。依旧可以下载获得这个文件。图片说明过滤特殊字符后攻击者又利用月份工号的命名规律枚举下载他人文件最终随机重命名才彻底封堵。目录穿越虽然被堵住了但文件却依然能被猜出来。工程师这下没招了。7.3. 终极修复随机字符串重命名工程师不得不使用系统生成的随机字符串来重新命名文件。文件名变成了没有规律的一串乱码无法再被推测。这样一来攻击者再也无法获得其他人的病历文件了。防御阶段文件命名能否枚举修复前月份 工号能规律明显修复后随机字符串不能不可预测8. 攻防演进全景总结把整条链路串起来可以看到一个清晰的攻防演进过程回合攻击手段防御手段攻防结果第 1 回合修改 ID 水平越权服务端校验身份攻击者转向提权第 2 回合篡改角色垂直提权JWT 签名防线身份越权被杜绝第 3 回合目录穿越下载文件过滤特殊字符 限定目录系统文件被隔离第 4 回合文件名规律枚举随机字符串重命名文件无法再枚举图片说明从水平越权、垂直提权到 JWT 防线再到目录穿越与文件名枚举攻防双方围绕身份可信与文件可猜持续博弈。每一次防御升级都逼迫攻击者另寻出路。而每一次攻击进化又催生出更严密的防御。这就是安全领域最核心的规律攻防永远是一场没有终点的螺旋博弈。9. 写在最后本文用医院电子病历系统这个场景完整推演了从水平越权到文件名枚举的越权与下载攻防链路。这些知识点并不局限于医疗系统它们广泛存在于电商、金融、政务、企业内网等各类业务系统中。理解越权的本质才能真正构建起有效的身份鉴权体系。对开发者而言服务端鉴权、JWT 签名、文件名白名单与随机化是企业级应用的基本功。对使用者而言越权访问他人数据属于违法行为依据《中华人民共和国刑法》第二百八十五条可能构成非法侵入计算机信息系统罪或侵犯公民个人信息罪。技术本身没有善恶但越界使用技术有代价。希望这篇文章能提供一个清晰的越权攻防思维框架
返回列表