文章总结: 文档通过多个实战案例系统阐述了越权漏洞的挖掘方法与绕过技巧,重点分析了签名校验、JS逆向和逻辑缺陷等核心攻击面。案例一展示了通过逆向小程序前端加密逻辑(如mac签名和key泄露)绕过签名校验,实现用户信息遍历;案例二揭示了即使存在token,若digest签名校验不严仍可越权访问敏感接口;案例三则利用RSA公钥硬编码缺陷,通过逆向加密算法伪造参数实现水平越权。文档强调签名校验不等于鉴权,并提供了从接口定位、加密分析到脚本编写的完整渗透思路,为渗透测试人员提供了可操作的技术路径。
综合评分: 85
文章分类: 渗透测试,WEB安全,实战经验,逆向分析,漏洞分析
记实战中的越权漏洞挖掘案例分享
用户j7LlalOmNY
用户j7LlalOmNY
陌笙不太懂安全
2026年2月21日 17:44
河北
免责声明
由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号陌笙不太懂安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉,谢谢!
作者:用户j7LlalOmNY原文链接:https://xz.aliyun.com/news/19133
前言
越权漏洞
下面的案例是基于不同情景下的越权,希望师傅们可以有所收获
案例一(签名校验绕过导致的越权)
小程序渗透中有几个小技巧,比如接口的查找、常见越权漏洞的是否存在等等
下面我们由一些真实的案例出发讲述一下渗透的一些思路
对于小程序,我们最开始可以尝试去反编译它,拿到其前端js源码,方便我们后续查找接口,以及查看加密鉴权逻辑
在一次攻防中渗透小程序的经历,最开始我们可以直接抓包查看其一些常见的接口入手,大致判断一下是否可能存在越权漏洞
比如上面的memberid,你可以大胆的想是否它是可以遍历的,这里的答案是可能但不一定,因为我们必须结合其鉴权机制来进行判断,请求包里面我们没有看到明显的token,cookie字段的设置,但是当我们正常抓包后重新发包又不行,这个可能就是存在一个安全校验的问题
初看请求体,我们可以很快的锁定,下面的字段很可能就是校验的逻辑,下面存在时间戳、nonce、mac还有固定值,下一步我们就得开始逆向一下生成逻辑
上面的拒绝接收是由于两次相近的提交的nonce值相同导致的,而我们修改nonce发包又是出现了下面的时间戳校验,这个好办,通过python脚本来处理时间戳的问题
处理完上面的时间戳问题,下面就是关键的签名问题了,mac
由于此加密是处于请求体里面,我们无法动态去看,更多是静态分析了
分析思路,里面有一些小技巧,如果在反编译的源码中存在app-service.js,我们主要只需要关注其即可,里面会放置接口以及一些请求加密逻辑
下面我们先全局查找mac,最终可以定位到其加密函数,最后我们只需分析加密所用的参数以及加密逻辑即可,我们发现了我们还需要一个无法伪造的key,但是我们可以大胆的想这个基于前端生成的签名校验,绝对存在一个Key在前端
确实存在,知道具体值我们就成功了,最后成功拿下,下面就是找对应接口实现危害扩大了,由于功能单一我们最后只能接管所有用户信息
签名校验不等于鉴权,我们只需拿到起加密可能就可以实现越权操作,最后搓出脚本即可实现遍历
案例二(签名绕过导致的敏感接口泄露越权)
这个案例与前面不同的是它的校验部分只存在与接口中,下面的复现过程也会有所体会
越权漏洞不一定带了token或者session就不会存在,我们首先对于jwt的鉴权可以先看看解码信息中是否已经带上我们的身份认证信息如手机号,身份证,userId等,如果存在大概率是无法越权了。至于token就很难判断了
开始还是一样先尽可能的多找一些接口,看看是否存在我们还下手或者好判断的,下面我们很快的锁定存在一个名为getUserByPhone的接口,但是当我们是以游客进去就会存在没有信息的获取,而我们比较难判断是否我们可以越权,因为首先回显结果都是无信息,其次就是它存在token,这里我就跳过一些步骤,拿到一个对应部门员工的号码,验证确实存在用户的越权查询功能
这里存在一个问题,我们无法先获取员工用户号码再获取对应信息,并且这里也并非存在身份证等敏感信息,接下来还是要扩大攻击面,但是我们都点一遍还是无法找到可以获取用户信息的接口,但是当我们换其它接口时就发现存在一个问题,它存在参数校验,排查完后才发现是请求头中的digest签名校验
回到反编译的源码中我们查找关键词也成功找到了,这里其实加密比较简单,就是按他的格式将接口和特定参数进行md5加密以及改为大写
逆向出来解密下一步就是实现接口的查找
最后实现越权,以及其它敏感接口的进一步利用
案例三(js逆向实现的越权)
在测试某个edu证书站时的真实案例,在实现测试注册登入后,我们发现在存放用户的订单位置存在对传入的data参数的加密,由于加密不知道里面存放的数据,通过逆向解密实现还原伪造
首先第一步我们需要通过先定位接口的位置,通过抓包查看到接口为user/getOrderList,下面通过右键top来进行全局查询
下面定位到发包的位置,初步判断一下加密的是在该断点前还是后
我们断了后发现这里的e已经为加密的数据了,所以我们就需要看右下角的调用堆进行往前找
来到getDataOrder方法我们可以看到其发包e的值就是从这里传入,但是当前的data值为我们userId以及**和phone的拼接的加密,但是我们还需要继续往后跟进到(0,_,KT)里面看加密流程,我们步进就有了新发现
我们来到这段代码,key我隐藏了
94701: function(e, t, r) { "use strict"; r.d(t, { KT: function() { return i }, mr: function() { return n } }); var a = r(66681); const n = (e=null, t="{y}-{m}-{d} {h}:{i}:{s}") => { if (null === e) return null; 10 === (e + "").length && (e = 1e3 * +e); const r = "object" === typeof e ? e : new Date(e) , a = { y: r.getFullYear(), m: r.getMonth() + 1, d: r.getDate(), h: r.getHours(), i: r.getMinutes(), s: r.getSeconds(), a: r.getDay() }; return t.replace(/{(y|m|d|h|i|s|a)+}/g, ( (e, t) => { let r = a[t]; return "a" === t ? ["日", "一", "二", "三", "四", "五", "六"][r] : e.length > 0 && r < 10 ? "0" + r : r || 0 } )) } , i = e => { const t = "-----BEGIN PUBLIC KEY-----xxxxxx-----END PUBLIC KEY-----" , r = new a.Z; return r.setPublicKey(t), r.encrypt(e) } }
这里首先分析下面的代码的作用是将i函数映射到KT上,n函数映射到mr
KT: function() { return i},mr: function() { return n}
这段代码i = e => { const t = "-----BEGIN PUBLIC KEY-----sasasasas-----END PUBLIC KEY-----" , r = new a.Z; return r.setPublicKey(t), r.encrypt(e) }类似
function i(e) { setPublicKey(...); return encrypt(e); }
到这里我们就获取了key的值,这个是public key,大致可以知道为rsa加密逻辑,由此我们便可以通过rsa来还原加密从而伪造 下面为加密脚本,实现越权
import base64from Crypto.PublicKey import RSAfrom Crypto.Cipher import PKCS1_v1_5
def rsa_encrypt(public_key_str, message): """ 使用RSA公钥加密消息
:param public_key_str: Base64编码的公钥主体字符串(无头尾) :param message: 要加密的消息 :return: 加密后的Base64编码字符串 """ try: # 拼接成标准PEM格式公钥 pem_key = f"-----BEGIN PUBLIC KEY-----\n{public_key_str}\n-----END PUBLIC KEY-----"
# 导入公钥 public_key = RSA.import_key(pem_key)
# 创建加密器(使用 OAEP 填充) cipher = PKCS1_v1_5.new(public_key)
# 加密消息 encrypted_message = cipher.encrypt(message.encode('utf-8'))
# 返回Base64编码的加密结果 return base64.b64encode(encrypted_message).decode('utf-8')
except Exception as e: return f"加密过程中出现错误: {str(e)}"
# 示例使用if __name__ == "__main__": # 你的公钥(主体部分) public_key = """xxxxx"""
# 要加密的消息 message = "xxx**xxx'"#'xx**xx' # 加密 encrypted = rsa_encrypt(public_key, message)
print("原始消息:", message) print("加密后的结果(Base64):", encrypted)
总结
后台回复加群加入交流群
有思路工具需要的师傅可以加入小圈子
主要内容是(2025-2026/edusrc实战报告/思维导图/edu资产/漏洞挖掘工具/各类源码/src学习资料等)
部分思维导图展示
其他内容懂得都懂,可以扫码查看详情,目前300多条内容,持续更新中。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:陌笙不太懂安全 用户j7LlalOmNY
用户j7LlalOmNY《记实战中的越权漏洞挖掘案例分享》