B站412背后藏了什么?一次逆向分析记录

admin 2026-01-26 14:52:08 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析了B站HTTP412风控机制,发现其并非图形验证码,而是一种基于SHA256哈希碰撞的轻量级算力校验。通过逆向分析Set-Cookie中的JWT结构Token,提取q前缀与r目标值,进行约500万次暴力求解即可绕过验证。文章详细梳理了从触发412到获取新Token通过校验的全流程,为爬虫与逆向研究提供了参考。 综合评分: 90 文章分类: 逆向分析,爬虫,WEB安全


cover_image

B 站 412 背后藏了什么?一次逆向分析记录

原创

TheWeiJun TheWeiJun

逆向与爬虫的故事

2026年1月26日 09:02 北京

大家好,我是 TheWeiJun。最近在研究 B 站访问过程中遇到的 HTTP 412 风控问题,通过抓包和请求分析,发现其背后并非传统验证码,而是一套基于算力校验的轻量级风控机制。过程中梳理了相关流程和设计思路,觉得挺有意思,简单记录一下研究过程,供感兴趣的朋友参考。

特别声明:本公众号文章只作为学术研究,不作为其他不法用途;如有侵权请联系作者删除。

立即加星标

每月看好文


一、问题背景:为什么会遇到 412?

在使用 浏览器 / requests / aiohttp / scrapy 等方式访问 B 站视频页面时,很多人都会遇到这样一个状态码:

❌ HTTP 412 Precondition Failed

这个状态并不是普通的网络错误,而是 B 站风控系统明确拒绝了你的请求

📌 表现形式通常有:

  • 直接返回 412
  • 页面空白 / 跳转失败
  • 同一 IP 短时间内频繁触发

#

🔍 412 的本质是什么?

412 = 你被当成“非正常用户”了

B 站在服务端对请求进行了行为判定,例如:

  • UA 是否合理
  • 请求是否过于频繁
  • IP 是否来自数据中心 / 代理
  • Cookie / 行为链是否完整

一旦命中规则,就会触发 验证码挑战流程


二、412 并不直接封禁,而是「挑战你」

很多人以为 412 = 彻底封 IP,其实不是。

👉 412 是一道门槛,不是死刑

当触发 412 时,响应头里会多出一个非常关键的字段:


Set-Cookie: X-BILI-SEC-TOKEN=xxxxx


这个 X-BILI-SEC-TOKEN,就是后续逆向的 核心突破口


三、从 Set-Cookie 中提取 Token

我们发送指定视频地址请求,并从Cookie中提取指定内容:

def parse_412_token(set_cookie: str):    """    从 Set-Cookie 中提取 captcha token    """    try:        token = set_cookie.split(';')[0].split(',')[1]        return token    except Exception:        return None

📌 注意点

  • 这个 token 并不是随机字符串
  • 它是一个 JWT-like 结构
  • 中间段是 Base64 编码的数据

四、Token 解码:真正的验证码参数在这里

Token 的结构大致如下:

xxxx.payload.xxxx

我们关心的是中间的 payload

def decode_captcha_payload(token: str):    """    base64 解密 token 中的 q, r    """    base64_text = token.split('.')[1]    decrypt_json = json.loads(b64decode(base64_text + "=="))    return decrypt_json.get("q"), decrypt_json.get("r")

解码后,可以拿到两个关键字段:

  • q:计算前缀
  • r:目标哈希值

📌 到这里可以明确一件事:

B 站的 412 并不是图形验证码,而是一个算力验证


五、验证码核心逻辑:暴力但有效

逆向后发现,B 站的验证逻辑本质是:


sha256(q + i) == r


其中 i 是一个非负整数,范围有限。


#

核心求解代码:


def solve_captcha(a, b):    def sha256(data: str) -> str:        return hashlib.sha256(data.encode()).hexdigest()    limit = 0x4C4B40  # 约 500 万    for i in range(limit):        if sha256(a + str(i)) == b:            return i    return None


✔ 没有花指令 ✔ 没有混淆

这更像是一个 “你是不是正常客户端” 的轻量算力验证


六、提交验证码,换取通行证

计算出结果后,提交给 B 站的校验接口:


CAPTCHA_URL = “https://security.xxxx.com/th/captcha/cc/check”data = {    “token”: token,    “result”: result}


服务器返回一个新的 token:


{  “message”:”new-sec-token”}


这个 token 需要放进 Cookie:


cookies = {“X-BILI-SEC-TOKEN”: message}



七、完整流程回顾

整个 412 逆向流程如下:

1️⃣ 请求视频页面 2️⃣ 命中 412 3️⃣ 从 Set-Cookie 提取 token 4️⃣ Base64 解码 payload 5️⃣ 暴力计算验证码 6️⃣ 提交结果 7️⃣ 携带新 Cookie 再次请求 8️⃣ ✅ 成功访问页面


本篇分享到这里就结束了,感谢大家的阅读和支持。如果你对爬虫逆向分析、验证码破解及其他技术话题感兴趣,记得关注我的公众号,不错过下一期的更新。我们将继续深入探讨各种技术细节和实用技巧,一起挖掘技术的更多可能性。期待与你在下期文章中再见,一起学习,一起进步!☀️☀️☀️

如果想要获得更多精彩内容可以关注我朋友:

END

作者简介

我是TheWeiJun,有着执着的追求,信奉终身成长,不定义自己,热爱技术但不拘泥于技术,爱好分享,喜欢读书和乐于结交朋友,欢迎扫我微信与我交朋友💕

分享日常学习中关于爬虫及逆向分析的一些思路,文中若有错误的地方,欢迎大家多多交流指正💕

点分享

点收藏

点点赞

点在看


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:逆向与爬虫的故事 TheWeiJun TheWeiJun《B 站 412 背后藏了什么?一次逆向分析记录》

评论:0   参与:  0