本次测试为授权友情测试,本文提交之前已通知厂商修复
POST /service/data/machine/base/v1/list/page/wx HTTP/1.1
Host: target.com
Accept: application/json, text/plain, */*
Authorization: 6410_b0RwaEV2N3lyWUZqdWVnem85RUlHWGJUREVKYw==_10f8de5763a04ad4a8fd3aa94051c570
User-Access-Token: eyJhbGciOiJIUzI1NiJ9.eyJleHBpcmVzSW4iOjE1OTA1ODU5MTcyOTIsImFwcElkIjoiV0VJWElOX1ZFTkRJTkciLCJhdXRoVHlwZSI6IldlYiIsInVzZXJOYW1lIjoiMTMzMzMzMzMzMzMiLCJyb290T3JnSWQiOiIxMDAwMDUwMjMiLCJ1c2VySWQiOjY0MTAsIm9yZ0lkIjoiMTAwMDA1MDIzIn0.6xnbyaYf630GPldrMrL7duXoe2Br8r3IcbAonItlNYA
{"page":1,"machineCode":"518","pageSize":10,"orgId":"100005023","orderByFlag":1}
首先字面理解POST参数是请求orgid为100005023的售货机基础数据。 如果我直接修改orgID请求别人的数据,会直接报错说无权限。 这个时候我们来看Authorization信息 名眼一看就是三个字段,通过下划线分割。第一段是一个四位数数字(6410),中间的参数尾数有==,所以先试试base64解码,结果为: oDphEv7yrYFjuegzo9EIGXbTDEJc,是一个长度为28位的字符串,到底是什么加密,暂时没试出来. 10f8de5763a04ad4a8fd3aa94051c570。是一个长度为32位的字符串,是什么也没解出来. 然后我们分析JWT信息。 JWT的明显特征就是由.分割。并且JWT全称为json web token,所以内容是json格式,并由base64编码. json里{符号编码后就是ey开头,所以这是明显的JWT。 现在我们解码JWT看看里面保存了什么.(这里使用的是在线工具:https://jwt.io/)
解出来之后为:{
"expiresIn": 1590585917292,
"appId": "WEIXIN_VENDING",
"authType": "Web",
"userName": "13333333333",
"rootOrgId": "100005023",
"userId": 6410,
"orgId": "100005023"
}
结合JWT解码之后的信息,我们知道了Authorization头中第一个四位字符串是userID。 预计当userId和orgid匹配时就能越权,这个时候我们来试试。 根据自己的userID和orgid我先尝试一下自己ID附近的,测试返回会小很多。 越权成功,读到了userId为6409用户的售货机信息. 经过分析,后端程序的逻辑首先应该是匹配Authorization中的userid和JWT中的userID是否匹配,如果不匹配就会返回 {"isSuccess":false,"code":10005,"message":"身份验证失败,请重新登陆。错误码:10005","content":null}
如果匹配成功就会继续匹配请求的orgId信息是否与JWT中的orgId信息是否匹配。 如果匹配成功就直接返回正确的信息,所以我们只要构造相应的jwt信息和token信息,就能遍历所有用户信息,或者直接控制别人的售货机。 修复建议:
缝缝补补总有遗漏的地方,重新设计鉴权流程,或使用shiro统一鉴权 总结 之前发生过漏洞的地方,应该重点关注,并且如果不做全局性的修改,只是缝缝补补,总还会被绕过。
- End -
本文始发于微信公众号(谢公子学安全):对某自动售货机的测试记录之越权
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论