我用AI把前端JS扫了个遍,挖出37个AccessKey——原来这些密钥一直躺在你眼皮底下

去年在某大厂SRC,我靠信息泄露漏洞拿了年度Top 10。其中最大的单笔赏金来自一个藏在JS里的OSS密钥------这个密钥权限大到可以读写所有生产环境的Bucket,里面装着几百万用户的身份证和合同照片。发现它的方法,不是手工翻代码,不是正则匹配,而是我让AI帮我读完了二十万个JS文件。

别人用grep搜accessKey,我直接用AI一行一行看,把那些故意拆开、改名字、藏在注释里的密钥全揪了出来。本文完整拆解这套AI辅助JS敏感信息挖掘的方案,从工具到Prompt到脚本到实战案例,全给你。

一、为什么grep找不全?因为开发者比你更会藏

传统挖JS敏感信息,基本就靠正则表达式。搜accessKeyIdsecretKeyAKID,匹配到就捞出来。但这套方法漏掉的东西太多了。

我见过最狠的一次隐藏,开发者把密钥拆成了三段放在不同文件里,文件名没有任何规律,代码里也没有任何关键字,只有用AI全局串联上下文才找得到。其他常见绕过姿势包括:

  • 变量名故意避开关键词:const a = 'AKID',然后用a + 'xxxx'拼接。

  • 藏在注释里的"示例代码":// TODO: 上线前删除 AKIDxxxxx

  • Base64编码后拆开放:atob('QUtJRA==') + atob('eHh4eA==')

  • 用数组下标拼:arr[3] + arr[7]

  • 放在JSON配置文件里,字段名叫appKey,看起来人畜无害。

正则表达式在这些场景面前基本是盲的。因为它不理解代码的语义,不认识变量引用,不知道拼接结果,更不会跨文件追踪。

二、AI怎么做:把每个JS文件当成一个"人"来审

我用的方案是:先把全站JS文件爬下来,然后逐个喂给AI,让它以"安全审计员"的身份告诉我里面有没有密钥。

核心Prompt设计:

复制代码
你是一名资深安全审计工程师,正在审查前端JavaScript代码。
请分析以下JS代码,提取所有可能包含的敏感信息:
- 云服务AccessKey(如阿里云、腾讯云、AWS的AKID形式)
- SecretKey或Token
- API密钥、私钥、证书
- 数据库连接字符串
- JWT签名密钥
- 内网IP或内部API地址
- 其他你认为可能被攻击者利用的信息

要求:
1. 即使密钥被拆分、编码、拼接,也尝试还原。
2. 给出原始代码片段、还原后的密钥值、风险评估。
3. 如果没有发现,直接返回"无发现"。
4. 用JSON格式返回,方便程序解析。

代码:
{file_content}

这个Prompt的精髓在于:让AI理解变量的生命周期和跨行上下文。它看到var a = 'AKID'和后面的a + 'Sk123',能自动拼接成AKIDSk123。而正则只看一行,根本不知道这个a是什么。

脚本框架很简单,用Python遍历JS目录,调用大模型API(我用的是DeepSeek和Claude,你也可以换成本地模型),把返回的JSON解析入库:

复制代码
import os, json, requests

AI_API = "https://api.deepseek.com/v1/chat/completions"
HEADERS = {"Authorization": "Bearer sk-xxx"}

def analyze_js(file_path):
    with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
        code = f.read()
    if len(code) < 100: return None  # 跳过太小的文件

    prompt = PROMPT_TEMPLATE.format(file_content=code[:8000])  # 截断长文件
    resp = requests.post(AI_API, headers=HEADERS, json={
        "model": "deepseek-chat",
        "messages": [{"role": "user", "content": prompt}],
        "temperature": 0.1
    }, timeout=60)
    return resp.json()["choices"][0]["message"]["content"]

results = {}
for root, dirs, files in os.walk("js_files"):
    for file in files:
        if file.endswith('.js'):
            path = os.path.join(root, file)
            result = analyze_js(path)
            if result and "无发现" not in result:
                results[path] = result

实际跑一轮,一个中大型网站几千个JS文件,大概半小时跑完,成本几块钱。比人眼快百倍,比正则准十倍。

三、实战案例:三个被AI揪出来的"隐形"密钥

案例一:某电商平台OSS全权限密钥

AI在一个叫common.chunk.js的文件里发现了一行奇怪的代码:var _0x4f2a=['\x41\x4b\x49\x44']。它识别出这是十六进制编码的AKID,然后追踪变量引用,在文件末尾找到了拼接逻辑,还原出完整的AccessKey。手工翻根本看不出这串十六进制是什么。

这个AK拥有整个公司OSS的管理权限,所有商品图片、用户上传的身份证照片、交易合同全在里面。高危漏洞,赏金6000元。

案例二:某政府网站数据库密码

AI在一个配置文件里发现注释掉的代码:// dbConfig: { host: '10.23.45.67', user: 'admin', password: 'Gov@2023!secure' }。开发者以为注释掉就安全了,但JS文件还是原样发到了客户端。直接连内网MySQL,查出数十万市民个人信息。

案例三:某金融APP的加密密钥

AI从两个不同JS文件里各取了一行代码拼在一起,还原出AES加密密钥和IV。这个密钥用来加密用户登录密码,拿到后可以离线破解所有用户密码。高危,赏金8000元。

四、注意事项:别让AI把你的密钥也泄露了

用第三方API分析JS文件,相当于把你的代码传给了大模型厂商。涉及敏感项目时,有几个选择:

  1. 用本地部署的开源模型(如CodeLlama、DeepSeek-Coder),数据不出本机。

  2. 对代码做预处理,把公司名、特殊域名替换成占位符再发给API。

  3. 只截取包含可疑关键词(如keytoken)的片段发给AI,而不是整个文件。

另外,AI偶尔会"幻觉",编造不存在的密钥。所有AI返回的结果都必须手工验证,我一般是拿AK去云平台SDK里实际调一次GetCallerIdentity确认有效性。

五、防御:前端不应该有任何密钥

不管AI挖不挖得出来,前端代码里根本不应该出现密钥。所有云服务调用必须走后端中转,前端拿到的只应该是STS临时凭证,或者带有效期的预签名URL。

如果你在自家产品的JS里发现了AccessKey,不管它权限多小,立刻删除并轮换。因为攻击者早晚会用同样的方法找到它。

六、写在最后

传统的JS安全审计靠grep + 肉眼,在2026年已经不够用了。开发者藏密钥的手法越来越花,只有AI的语义理解能力能跟得上。

把AI当成你的代码审计助手,把每个JS文件都当成人来审查。当你看到AI返回的一长串AccessKey列表时,你就会明白:原来这些密钥一直躺在前端代码里,只是没人去认真读。

下次挖SRC时,别只盯着HTML和API。把全站JS爬下来,让AI帮你读一遍。你可能就找到了别人漏掉的那个高危。此技术仅用于合法授权的安全测试,未授权爬取他人网站源码属于违法行为。所有案例均已脱敏,仅保留技术原理供学习参考。