在一次覆盖多个政企单位的授权渗透测试项目中,资产范围广泛,测试过程揭示了多个具有代表性的安全漏洞。本文旨在复盘其中几个关键的漏洞利用链,包括逻辑漏洞、框架漏洞和认证缺陷,为安全从业者提供实战参考。所有提及漏洞均已获得授权并完成修复。
资产信息收集与整理
在项目开始前,系统性地整理资产和文档是高效工作的基础。通常,甲方会提供包含目标系统名称、生产URL等信息的资产列表。
| 典型的资产表格格式如下: |
名称 |
生产URL/获取方式 |
| 门户网站 |
example.com |
| 智慧客服系统 |
api.example.com/channelType |
| 云证书系统 |
cert.example.com |
| 支付业务管理系统 |
pay.example.com/ppTy |
此外,渗透测试项目必须具备合法的授权文件,如《渗透测试服务授权委托书》,明确授权方、测试范围、周期等信息,确保测试活动的合法性。
漏洞一:短信验证码轰炸与绕过
短信轰炸是常见的逻辑漏洞,在渗透测试和SRC漏洞挖掘中均有较高出现率。其危害通常定义为在短时间内(如每分钟)向同一手机号发送超过特定数量(如15或30条)的验证码短信。
纵向轰炸(针对单个手机号)
测试目标是一个人力资源管理局的微信小程序登录接口,采用手机号+短信验证码方式登录。
- 正常流程测试:首先输入测试手机号,使用Burp Suite抓取发送验证码的请求包。首次发送请求,服务器返回
code: 200, msg: “操作成功”,手机正常收到验证码。
- 发现限制:立即重放该数据包,服务器返回
code: 500, msg: “验证码已发送,请于稍后重试”,表明存在发送频率限制。
- 绕过限制:尝试在手机号参数值中插入特殊字符进行绕过。测试发现,在手机号前后添加
@、空格、,、+86 等字符,服务器仍会处理发送请求并返回成功。例如,将请求体中的 “stPhone”: “13800138000” 修改为 “stPhone”: “ 13800138000”(添加空格)或 “stPhone”: “+8613800138000”。
- 扩大危害:利用Burp Suite的Intruder模块进行爆破。配置Payload类型为简单列表(Simple List),填入多个绕过字符(如
`,@,@@,+86`等),对手机号参数进行快速、多次重放,即可在短时间内向目标手机号轰炸数十条验证码。
横向轰炸(向多个手机号发送)
同一接口还存在另一种逻辑缺陷,允许通过参数污染等方式,一次性向多个手机号发送相同的验证码。
常见的绕过Payload格式有:
phone=13888888888,phone=13999999999
phone=13888888888&phone=13999999999
phone=13888888888,13999999999
phone=13888888888&13999999999
在测试中,使用类似 “stPhone”: “13800138000&13900000000” 的格式修改请求,成功使两个不同的手机号同时收到了相同的验证码。这导致了严重的越权风险:攻击者只需知道受害者的手机号,即可利用自己的手机接收验证码,登录受害者的账户。若在系统内收集到管理员手机号,则可直接尝试越权登录。
技巧总结与思维导图
短信轰炸的绕过手段多样,主要分为横向轰炸(多手机号)和纵向轰炸(单手机号高频)两类,具体技巧可归纳如下:
- 纵向轰炸绕过:添加垃圾字符(如
@、空格)、添加国家码(+86)、双写参数、修改X-Forwarded-For请求头、进行URL编码、修改可能控制发送次数的参数、使用工具并发发送数据包等。
- 横向轰炸绕过:通过参数污染(使用
,或&连接多个手机号参数)实现。
- 通用绕过:还包括直接重放数据包、删除或修改Cookie、邮箱地址的大小写/加空格绕过等。
漏洞二:微信SessionKey三要素泄露导致未授权登录
该漏洞在不少微信小程序中存在,利用难度低但危害高,常可导致任意用户登录。
漏洞利用流程
- 发现泄露点:测试目标为某大学的微信小程序,存在“手机号一键登录”功能。点击登录时,使用Burp Suite抓包,可在请求中发现加密的
sessionKey、iv、encryptedData三要素。
- 使用解密工具:利用专门的解密工具,如GitHub上的
Wx_SessionKey_crypt 可执行程序或Burp Suite插件 BurpAppletPentester。将捕获到的请求发送至插件,或使用独立工具,输入三要素即可解密出对应的明文手机号。
工具界面示例:
输入SessionKey: [粘贴sessionKey]
输入Iv: [粘贴iv]
输入EncryptData: [粘贴encryptedData]
点击“解密”按钮,获得手机号。
- 信息收集与越权:通过小程序其他接口,收集到一批用户信息,其中包括管理员老师的手机号。
- 构造攻击:在解密工具中,将“待加密手机号”替换为管理员手机号,点击“加密”,工具会生成对应的新
encryptedData。
- 替换与登录:回到登录请求数据包,将原始的
encryptedData 值替换为上一步生成的新值,重放请求。服务器校验通过,攻击者即可以管理员身份成功登录,实现未授权访问。
关联漏洞:弱口令与敏感信息泄露
成功进入小程序后,尝试访问其Web后端管理系统。直接访问相关域名,发现是著名的若依(RuoYi)后台管理系统登录界面。使用刚才获取的管理员手机号,尝试常见弱口令(如123456)进行登录,成功进入后台。后台中存在大量学生和教职工的敏感个人信息,构成严重的数据泄露风险。
漏洞三:JWT弱密钥与算法混淆攻击
在对另一微信小程序进行测试时,通过历史请求记录发现多个接口使用了JSON Web Token (JWT)进行认证。
JWT密钥爆破
- 分析JWT结构:将捕获的JWT令牌在
jwt.io 网站进行解码,分析其Payload部分,通常包含userId、username(手机号)、role(角色,如appUser)、exp(过期时间)等字段。
- 爆破弱密钥:使用自定义脚本或
jwt_tool等工具对JWT签名密钥进行爆破。在本案例中,成功爆破出密钥为 123456。
- 构造恶意令牌:已知密钥后,即可伪造任意用户的JWT。在
jwt.io 上,使用爆破得到的密钥,修改Payload中的username为其他用户的手机号,并将exp字段修改为一个未来的时间戳,生成新的有效令牌。
- 越权访问:将小程序中携带原JWT的请求,替换为伪造的、指向目标用户的新JWT,重放请求即可越权访问该用户的资源和功能。
JWT None算法攻击(补充知识点)
在某些错误配置下,服务器可能接受alg字段为None的JWT,即不验证签名。这虽非本例漏洞,但是一种重要的测试项。使用jwt_tool工具可以自动化测试:
python jwt_tool.py <原JWT值> -X a
该命令会生成四种不同格式的None算法变体JWT。使用这些变体逐一替换原请求中的令牌并重放,观察响应:
401 Unauthorized: 签名校验失败。
200 OK: 攻击成功(高危)。
{"error":"alg not allowed"}: 服务端禁用了None算法。
漏洞四:Jeecg-Boot框架接口泄露与权限提升
Jeecg-Boot是一个流行的低代码开发平台。在此次测试中,某大学的缴费小程序后端正是基于此框架。
信息泄露与SQL注入
- 接口发现:浏览小程序时,Burp Suite历史记录中出现大量包含
tableName 参数的请求。将此域名在浏览器中访问,确认为一个Web系统。使用目录扫描插件(如Findsomething)对Web端进行扫描,发现了大量Jeecg相关的API接口。
- 数据泄露:访问其中一个疑似查询表名的接口,成功返回了400多个数据库表名。进一步访问查询表数据的接口,指定
tableName参数为具体的表名,导致大量包含身份证号、手机号、姓名等个人敏感信息的数据泄露。
- SQL注入:在对某个接口的
tableName参数进行测试时,发现存在SQL注入漏洞。使用报错注入Payload成功获取数据库信息:
updatexml(1,concat(0x7e,user(),0x7e),1)
权限提升(从普通用户到管理员)
- 注册普通账号:首先利用框架的注册接口,创建一个普通用户账号。
- 信息收集:通过接口查询管理员角色(如
admin)的ID(roleId),以及自己刚创建账号的用户ID(userId)。
-
利用提权接口:Jeecg框架存在默认或未鉴权的角色分配接口。构造如下POST请求进行提权:
POST /jeecg-boot/sys/user/addSysUserRole HTTP/1.1
Host: target.com
Content-Type: application/json
X-Access-Token: [当前用户的Token]
{
"roleId": "管理员角色ID",
"userIdList": ["自己的用户ID"]
}
- 结果:请求成功返回后,自己的普通账号便被赋予了管理员角色,从而完全接管后台管理系统。
Jeecg框架渗透小贴士
- 常见信息泄露接口:
/doc.html, /swagger-ui.html, /v2/api-docs, /env, /actuator系列接口(/mappings, /beans, /configprops等)。
- 关键路径关键字:
jeecg-boot/, sys/, api/sys/。
- 默认弱口令:
admin/123456, jeecg/123456。
总结
本次渗透测试涵盖了从简单的逻辑漏洞到复杂的框架级漏洞的完整链条。关键在于:
- 细致的资产梳理与规范的授权是前提。
- 对常见漏洞模式(如短信轰炸绕过、JWT缺陷、框架默认漏洞)保持敏感并熟练掌握利用工具。
- 漏洞关联利用:往往一个入口点(如小程序SessionKey泄露)可以关联出更多高危漏洞(如后台弱口令、数据泄露)。
- 关注流行框架:如Jeecg、若依等,其历史漏洞和默认配置是重点测试对象。
在实际安全评估中,应在授权范围内,遵循相同的深度和广度原则,系统性地进行探测与验证,才能全面评估目标系统的安全状况。
参考资料
[1] 渗透测试|某单位从敏感三要素泄露到接管管理员的漏洞挖掘之旅, 微信公众号:mp.weixin.qq.com/s/lEEToVN-F63htipYEyZdqg
版权声明:本文由 云栈社区 整理发布,版权归原作者所有。