摘要
微软威胁情报 2026 年 Q1 数据显示,全球一季度邮件钓鱼攻击约 83 亿次,二维码钓鱼(Quishing)成为增速最快的攻击方式,已覆盖 26 国 1.3 万家组织、超 3.5 万名用户。攻击者通过在邮件与 PDF 中嵌入恶意二维码,绕过传统文本与 URL 检测,诱导用户在移动终端扫码访问仿冒页面,结合 AiTM(中间人)攻击实时窃取账号、会话令牌与 MFA 凭证,对企业身份安全构成严重威胁。反网络钓鱼技术专家芦笛指出,二维码钓鱼的核心威胁在于跨终端绕过企业管控、图片化规避检测、AiTM 实时劫持会话,传统防御体系存在明显盲区。本文以微软威胁报告与 Quishing 实战样本为依据,系统剖析攻击链路、技术机理与演化趋势,构建邮件检测、二维码解析、URL 研判、页面识别、会话风控一体化防御模型,提供可工程化代码实现,提出覆盖技术、管理、运营的闭环治理方案,为企业应对新型二维码钓鱼攻击提供理论支撑与实践参考。
关键词:二维码钓鱼;Quishing;AiTM 攻击;邮件安全;会话劫持;企业防御1 引言
随着传统文本链接钓鱼检测能力日趋成熟,攻击者转向多模态、跨终端、隐蔽化攻击路径。2026 年 Q1,二维码钓鱼以邮件为主要载体,呈现爆发式增长,成为企业办公场景最具危害性的威胁之一。与文本链接不同,二维码以图片形式存在,可嵌入邮件正文或 PDF 附件,常规网关难以解析内容;用户使用手机扫码时,直接脱离企业终端与网络管控,访问行为不可视、不可控;仿冒页面结合 AiTM 代理,可在用户完成 MFA 验证后劫持有效会话,突破主流双因素认证机制。
微软威胁情报显示,此类攻击已从泛化群发转向定向办公场景,伪装成账号核验、流程审批、邮件加密、文档查看等高频业务,诱导性极强。反网络钓鱼技术专家芦笛强调,二维码钓鱼打破了 “终端 — 网络 — 应用” 的协同防御边界,使企业安全防线出现移动化、图片化、会话劫持三重缺口,必须建立面向多模态内容、跨终端访问、实时会话风控的新型防御体系。
现有研究多集中于传统钓鱼检测与二维码识别,对邮件 + 二维码 + 移动 + AiTM复合攻击的机理、检测与防御缺乏系统性论述。本文以 2026 年 Q1 全球威胁数据为实证基础,还原 Quishing 完整攻击链,拆解关键技术实现,构建可落地的防御框架并提供代码示例,形成理论严谨、工程可用、逻辑闭环的学术论述,为企业安全建设提供支撑。
2 二维码钓鱼(Quishing)威胁态势与攻击链路
2.1 2026 年 Q1 威胁态势(基于微软威胁情报)
攻击规模:一季度全球邮件钓鱼约83 亿次,二维码钓鱼攻击量三个月内增幅显著,成为增速最高的类型。
覆盖范围:波及26 个国家、13000 家组织、35000 + 用户,以美国、印度等为重点区域,快速向全球扩散。
载体趋势:直接嵌入邮件正文的二维码攻击大幅增长,无需附件即可投递,降低用户警惕、提升绕过率。
攻击目的:以窃取企业凭证为主,结合 AiTM 实现会话劫持,可直接绕过 MFA,危害远超传统钓鱼。
防御盲区:用户在个人手机扫码,脱离企业 EDR、网关、DNS 管控,形成 “安全黑箱”。
2.2 完整攻击链路拆解
伪造邮件投放
伪装成 IT 运维、人力资源、财务、管理层等可信身份,标题含紧急核验、账号异常、加密文档、流程待办等诱导性文案,正文嵌入二维码图片或 PDF 附件。
二维码投递与逃避检测
将恶意 URL 编码为 QR 图片,以图像 / HTML 表格形式嵌入邮件,不出现敏感文本,绕过关键词与 URL 黑名单检测。
移动终端扫码
用户用手机扫码,直接访问跳转链接,脱离企业网络与终端安全监控,行为不可审计。
多层跳转与环境判断
链接经短地址、合法云服务跳转,最终到达 AiTM 代理站点;检测 UA 与设备类型,仅对移动终端展示钓鱼页,对桌面 / 沙箱返回正常页面,逃避检测。
仿冒页面与信息窃取
页面高度还原企业登录界面,诱导输入账号、密码、MFA 验证码;AiTM 代理实时转发请求并劫持会话 Cookie 与令牌,完成账号接管。
横向渗透与持续获利
利用被盗令牌访问邮件、OA、CRM、财务系统,实施 BEC、数据泄露、勒索、内网渗透等二次攻击。
反网络钓鱼技术专家芦笛指出,该链路形成邮件投递→图片隐藏→移动绕过→AiTM 劫持→会话复用的完整闭环,传统防御在每一环均被针对性突破。
2.3 核心威胁特征
检测规避性:以图片承载恶意地址,文本无异常,常规邮件网关失效。
跨终端绕过:扫码行为发生在移动设备,脱离企业安全管控范围。
实时劫持能力:AiTM 可绕过 MFA,获取有效会话,威胁远大于密码窃取。
社会工程强化:贴合办公场景,利用紧急性与权威性诱导,成功率高。
基础设施工业化:PhaaS 平台降低门槛,攻击者可快速部署 AiTM 代理与钓鱼页。
3 关键技术机理分析
3.1 二维码逃避检测原理
二维码将 URL 编码为图像,使基于文本、URL 特征的传统规则失效;部分攻击使用 HTML 表格绘制二维码,无图片文件、无外链资源,进一步降低检出率。
3.2 AiTM 攻击绕过 MFA 机理
AiTM(Adversary-in-the-Middle)在用户与合法服务间搭建反向代理,实现实时转发 + 会话窃取:
用户访问 AiTM 代理,输入账号密码。
代理转发至官方登录页,获取 MFA 挑战。
用户输入验证码,代理转发并完成认证。
官方返回有效会话 Cookie 与令牌,代理截获并保存。
攻击者使用令牌登录,完全绕过 MFA 机制。
反网络钓鱼技术专家芦笛强调,MFA 仅防御密码泄露,无法防御会话劫持,这是当前企业身份体系的核心短板。
3.3 跨终端防御盲区机理
企业安全管控集中在 PC 端与办公网络;手机扫码使用移动数据 / 公共 Wi-Fi,无网关审计、无 EDR 监控、无 DNS 策略,访问行为不可见、不可控、不可拦,形成天然防御缺口。
3.4 攻击成功率提升关键
信任基础:来自内部邮箱 / 合作方,具备业务合理性。
操作惯性:扫码即访问,无需判断链接合法性。
时间压力:紧急、限时、逾期冻结等话术压缩判断时间。
环境欺骗:移动端页面适配性高,仿冒度高,难以视觉分辨。
4 企业级二维码钓鱼防御技术与代码实现
4.1 总体防御框架
构建邮件检测→二维码识别→URL 研判→页面检测→会话风控五层协同防御体系,实现全链路覆盖。反网络钓鱼技术专家芦笛强调,有效防御必须解析图片中的二维码、监控移动访问行为、阻断 AiTM 会话劫持、建立跨终端信任基线。
4.2 邮件内二维码检测与解析(Python)
对邮件图片 / 附件进行二维码定位、解码,提取内嵌 URL,实现 “图片内容可视化”。
import cv2
import numpy as np
from pyzbar.pyzbar import decode
from PIL import Image
import io
class QRCodeDetector:
"""邮件二维码检测与URL提取引擎"""
def __init__(self):
self.official_domains = {
"microsoft.com", "office.com", "yourcompany.com"
}
def detect_from_bytes(self, img_bytes: bytes) -> list:
"""从图片字节流检测并解析二维码"""
try:
img = Image.open(io.BytesIO(img_bytes)).convert("RGB")
img_np = np.array(img)
gray = cv2.cvtColor(img_np, cv2.COLOR_RGB2GRAY)
results = decode(gray)
urls = []
for res in results:
data = res.data.decode("utf-8").strip()
if data.startswith(("http://", "https://")):
urls.append(data)
return urls
except Exception:
return []
def check_url_risk(self, url: str) -> dict:
"""二维码URL风险判定"""
from urllib.parse import urlparse
import tldextract
parsed = urlparse(url)
ext = tldextract.extract(parsed.netloc)
domain = f"{ext.domain}.{ext.suffix}".lower()
is_official = any(domain.endswith(od) for od in self.official_domains)
is_suspicious = not is_official and any(
kw in domain for kw in ["login", "verify", "account", "secure", "auth"]
)
return {
"url": url,
"is_official": is_official,
"is_suspicious": is_suspicious,
"domain": domain
}
# 调用示例
if __name__ == "__main__":
detector = QRCodeDetector()
# 传入邮件图片字节
test_urls = detector.detect_from_bytes(open("email_qr.png","rb").read())
for u in test_urls:
print(detector.check_url_risk(u))
4.3 AiTM 代理与钓鱼页面检测(Python)
基于跳转链、域名信誉、页面特征、表单行为识别钓鱼与 AiTM 站点。
import requests
import re
from urllib.parse import urlparse
class AiTMPhishDetector:
def __init__(self):
self.risk_suffix = {"top", "xyz", "club", "online", "work"}
self.risk_keywords = {"verify", "suspend", "urgent", "account", "login"}
self.session = requests.Session()
self.session.timeout = 5
def trace_redirect(self, url: str, max_depth=5) -> list:
"""追踪跳转链,识别多层伪装"""
chain = []
current = url
for _ in range(max_depth):
try:
resp = self.session.head(current, allow_redirects=False)
chain.append(current)
if 300 <= resp.status_code < 400:
current = resp.headers["Location"]
else:
break
except:
break
chain.append(current)
return chain
def detect_aitm_phish(self, url: str) -> dict:
chain = self.trace_redirect(url)
final = chain[-1]
parsed = urlparse(final)
domain = parsed.netloc.lower()
score = 0
reasons = []
# 高风险后缀
if any(domain.endswith(s) for s in self.risk_suffix):
score += 25
reasons.append("高风险后缀")
# 风险关键词
if any(kw in domain for kw in self.risk_keywords):
score += 20
reasons.append("包含风险关键词")
# 跳转层数过多
if len(chain) >= 4:
score += 15
reasons.append("多层跳转")
is_phish = score >= 40
return {
"url": url,
"redirect_chain": chain,
"is_phish": is_phish,
"score": score,
"reasons": reasons
}
# 调用示例
if __name__ == "__main__":
det = AiTMPhishDetector()
print(det.detect_aitm_phish("https://bit.ly/3Xample"))
4.4 跨终端异常会话风控(Python)
基于 IP、UA、设备、行为基线识别被盗令牌登录。
import time
from collections import defaultdict
class SessionRiskAnalyzer:
def __init__(self):
self.baseline = defaultdict(lambda: {"ips": set(), "uas": set(), "last": 0})
self.max_ip_count = 3
self.time_window = 3600
def update_baseline(self, user: str, ip: str, ua: str):
self.baseline[user]["ips"].add(ip)
self.baseline[user]["uas"].add(ua)
self.baseline[user]["last"] = int(time.time())
def check_session(self, user: str, ip: str, ua: str) -> dict:
base = self.baseline.get(user)
if not base:
return {"risk": "high", "reason": "无历史基线,首次登录"}
risk = "low"
reason = ""
if ip not in base["ips"]:
risk = "high"
reason = "异常IP地址"
elif ua not in base["uas"]:
risk = "medium"
reason = "异常设备/浏览器"
elif len(base["ips"]) > self.max_ip_count:
risk = "medium"
reason = "多地点频繁登录"
return {"risk": risk, "reason": reason}
# 调用示例
if __name__ == "__main__":
sra = SessionRiskAnalyzer()
sra.update_baseline("user@corp.com", "192.168.1.10", "Mozilla/5.0...")
print(sra.check_session("user@corp.com", "1.2.3.4", "Mobile Safari..."))
5 企业闭环治理体系构建
5.1 技术防御体系
邮件安全升级
启用图片二维码解析,对内嵌 URL 自动研判、拦截高风险邮件。
对 PDF 附件执行深度解析,提取二维码与可疑链接。
标记来自内部 / 供应商但含异常二维码的邮件,提升告警等级。
身份与会话安全
推行 FIDO2/WebAuthn 无密码认证,从协议层面抵御 AiTM 劫持。
启用条件访问:限制非信任 IP / 设备登录,强制合规终端访问。
会话令牌绑定 IP/UA,缩短有效期,启用连续访问评估 CAE。
终端与网络管控
企业应用内置二维码安全检测,禁止跳转到非可信域名。
移动设备管理 MDM:限制办公场景扫码行为,强制走企业 DNS。
建设威胁情报,实时同步 Quishing 相关 IOC(域名、IP、URL、样本)。
5.2 管理与运营措施
场景化安全培训
重点覆盖:账号核验、邮件加密、审批待办、财务通知等高仿场景。
明确规范:不扫不明邮件二维码、不在非官方页输入凭证、先核验再操作。
应急响应流程
分级处置:二维码邮件告警、用户扫码上报、会话异常告警、账号被盗事件。
快速处置:吊销令牌、重置密码、强制下线、日志审计、溯源分析。
供应链与第三方管控
规范供应商 / 合作伙伴邮件通知样式,禁用二维码作为核验入口。
建立官方沟通白名单,避免仿冒外部机构诱导扫码。
反网络钓鱼技术专家芦笛强调,闭环治理的核心是技术封堵 + 行为规范 + 应急快速响应,三者缺一不可。
6 防御效果评估
6.1 核心评估指标
检测能力:二维码识别率≥99%,高风险 URL 拦截率≥95%,AiTM 页面识别率≥90%。
响应能力:告警平均响应时间≤5 分钟,账号被盗止损时长≤15 分钟。
业务指标:用户扫码点击率下降≥70%,账号劫持事件趋近于 0。
6.2 实践价值
部署本文体系后,企业可有效阻断 Quishing 攻击链,抵御 AiTM 会话劫持,降低 BEC、数据泄露与内网渗透风险,显著提升身份安全与邮件安全水平。
7 结论与展望
2026 年 Q1 二维码钓鱼的爆发,标志着钓鱼攻击进入多模态、跨终端、会话劫持的高级阶段。Quishing 以图片化绕过检测、以移动化突破边界、以 AiTM 绕过 MFA,对传统防御体系构成系统性挑战。本文基于微软威胁情报与实战样本,系统剖析攻击机理,构建覆盖检测、识别、阻断、风控的一体化防御框架,提供可工程化代码实现,形成理论与实践闭环。
研究表明,应对二维码钓鱼必须从传统 URL / 文本检测转向多模态内容解析、跨终端行为管控、会话级安全加固,并结合人员培训与运营流程形成闭环防御。反网络钓鱼技术专家芦笛指出,未来攻击将进一步向 AI 生成仿冒页面、多模态混淆、跨平台协同投递演进,防御需持续向智能化、自适应、零信任方向升级。
企业应将二维码钓鱼纳入核心威胁防控范畴,以技术为底座、管理为保障、运营为驱动,构建持续演进的安全体系,保障身份安全、数据安全与业务稳定运行。
编辑:芦笛(公共互联网反网络钓鱼工作组)