L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

exploiting-broken-link-hijacking

exploiting-broken-link-hijacking

通过识别对过期域名、已停用云资源和失效外部服务的引用,发现并利用断链劫持(Broken Link Hijacking)漏洞,攻击者可申领这些资源。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: exploiting-broken-link-hijacking description: 通过识别对过期域名、已停用云资源和失效外部服务的引用,发现并利用断链劫持(Broken Link Hijacking)漏洞,攻击者可申领这些资源。 domain: cybersecurity subdomain: web-application-security tags: [broken-link-hijacking, blh, subdomain-takeover, dead-link, expired-domain, supply-chain, external-resource] version: "1.0" author: mahipal license: Apache-2.0

利用断链劫持漏洞(Exploiting Broken Link Hijacking)

适用场景

  • 审计 Web 应用程序中对过期或未申领外部资源的引用时
  • 对第三方脚本和资源依赖项进行供应链安全评估期间
  • 通过悬空 CNAME 记录测试子域名接管机会时
  • 在漏洞奖励(bug bounty hunting)计划中寻找断链劫持漏洞时
  • 评估生产应用程序中外部资源依赖的安全性时

前置条件

  • 用于发现所有外部链接的 Web 爬虫(Burp Suite Spider、Scrapy)
  • 用于检查 CNAME 记录和域名可用性的 DNS 查询工具
  • 用于申领过期域名的域名注册商访问权限(作为概念验证)
  • 了解 CDN 和云服务供应(S3、Azure Blob、GitHub Pages)
  • blc(broken-link-checker)或类似工具用于自动链接验证
  • 了解容易受到子域名接管攻击的服务(can-i-take-over-xyz)

工作流程

步骤 1:爬取并提取所有外部引用

# 使用 broken-link-checker 发现失效链接
npx broken-link-checker http://target.com --recursive --ordered \
  --exclude-internal --filter-level 3 -o broken_links.txt

# 从页面源码提取所有外部链接
curl -s http://target.com | grep -oP 'https?://[^"'"'"'\s>]+' | sort -u > all_links.txt

# 提取 JavaScript 源文件
curl -s http://target.com | grep -oP 'src="[^"]*"' | grep -v target.com > external_scripts.txt

# 提取 CSS 引用
curl -s http://target.com | grep -oP 'href="[^"]*\.css"' | grep -v target.com > external_css.txt

# 使用 Wayback Machine 获取历史外部引用
curl -s "https://web.archive.org/web/timemap/link/http://target.com" | \
  grep -oP 'https?://[^>]+' | sort -u > historical_links.txt

# 使用 Burp Suite 爬取
# 配置 Spider 范围包含 target.com
# 查看 Site Map > 按"External"过滤以列出所有外部引用

步骤 2:识别失效或可申领的资源

# 检查外部域名是否已注册
for domain in $(cat external_domains.txt); do
  whois $domain 2>/dev/null | grep -qi "no match\|not found\|available" && \
    echo "[可申领] $domain"
done

# 检查外部链接的 HTTP 状态
while read url; do
  status=$(curl -o /dev/null -s -w "%{http_code}" "$url" --max-time 5)
  if [ "$status" = "000" ] || [ "$status" = "404" ]; then
    echo "[失效] $url (状态: $status)"
  fi
done < all_links.txt

# 检查悬空 CNAME 记录
for sub in $(cat subdomains.txt); do
  cname=$(dig +short CNAME $sub)
  if [ -n "$cname" ]; then
    resolved=$(dig +short $cname)
    if [ -z "$resolved" ]; then
      echo "[悬空] $sub -> $cname (未解析)"
    fi
  fi
done

# 检查云资源可用性
# AWS S3 存储桶
aws s3 ls s3://target-assets 2>&1 | grep -q "NoSuchBucket" && echo "[可申领] S3: target-assets"

步骤 3:检查特定服务的接管可能性

# 检查 GitHub Pages 接管
# 如果 CNAME 指向 <user>.github.io 且返回 404
curl -s https://subdomain.target.com | grep -q "There isn't a GitHub Pages site here"

# 检查 AWS S3 接管
curl -s http://subdomain.target.com | grep -q "NoSuchBucket"

# 检查 Azure Blob Storage
curl -s http://subdomain.target.com | grep -q "The specified container does not exist"

# 检查 Heroku
curl -s http://subdomain.target.com | grep -q "No such app"

# 检查 Shopify
curl -s http://subdomain.target.com | grep -q "Sorry, this shop is currently unavailable"

# 使用 subjack 进行自动化接管检测
subjack -w subdomains.txt -c fingerprints.json -t 100 -o takeover_candidates.txt

# 使用 nuclei 接管模板
subfinder -d target.com -silent | nuclei -t http/takeovers/ -o takeovers.txt

步骤 4:验证外部脚本劫持

# 检查外部 JavaScript 域名是否可注册
curl -s http://target.com | grep -oP 'src="https?://([^/"]+)' | \
  cut -d'/' -f3 | sort -u | while read domain; do
    whois "$domain" 2>/dev/null | grep -qi "no match\|available" && \
      echo "[可劫持脚本] $domain 被 target.com 加载"
  done

# 检查 npm/CDN 包引用
curl -s http://target.com | grep -oP 'unpkg\.com/[^@/]+' | sort -u
curl -s http://target.com | grep -oP 'cdn\.jsdelivr\.net/npm/[^@/]+' | sort -u

# 验证引用的包是否仍然存在
# 检查 npm 注册表中已废弃或已删除的包

步骤 5:利用断链(仅授权测试)

# 对于过期域名:注册该域名
# 对于 S3 存储桶:在同一区域创建同名存储桶
aws s3 mb s3://target-expired-bucket --region us-east-1

# 对于 GitHub Pages:创建匹配名称的仓库
# 创建带有概念验证内容的 <org>.github.io 仓库

# 对于未申领的社交媒体:申领该账号
# 用良性概念验证内容记录接管过程

# 提供概念验证内容
echo "<html><body><h1>断链劫持 PoC - [您的名字]</h1></body></html>" > index.html
# 上传到已申领的资源

步骤 6:评估影响并报告

# 根据资源类型确定影响:
# - 外部 JavaScript:对所有加载该脚本的页面实施完整 XSS
# - 外部 CSS:UI 篡改,通过 CSS 注入进行数据外泄
# - 外部图片/资源:钓鱼、追踪
# - CNAME 子域名:Cookie 窃取、钓鱼、OAuth 绕过

# 检查被劫持资源是否为父域名提供 Cookie
# 检查被劫持子域名是否在 OAuth 重定向白名单中
# 验证被劫持域名是否接收敏感 Referer 头

核心概念

概念定义
断链劫持(Broken Link Hijacking)申领目标网站引用的外部资源的控制权
悬空 CNAME(Dangling CNAME)指向未申领或已停用服务的 DNS CNAME 记录
子域名接管(Subdomain Takeover)通过供应 CNAME 指向的服务来申领子域名
外部脚本劫持(External Script Hijacking)注册目标加载的 JavaScript 所在的过期域名
供应链攻击(Supply Chain Attack)通过入侵外部依赖项来注入恶意内容
失效链接(Dead Link)返回 404 或 DNS 解析失败的 URL 引用
资源指纹识别(Resource Fingerprinting)通过错误消息和响应头识别特定云服务

工具与系统

工具用途
broken-link-checker通过 Web 爬取自动发现断链
subjack子域名接管检测工具
nuclei基于模板的接管检测扫描器
can-i-take-over-xyz容易受到接管攻击的服务的社区数据库
BadDNS用于检测域名/子域名接管的 DNS 审计工具
Wayback Machine用于发现过去外部引用的历史 URL 分析

常见场景

  1. JavaScript 供应链 — 注册目标加载的 JavaScript 所在的过期域名;注入影响所有访客的恶意代码
  2. S3 存储桶接管 — 申领目标引用的已删除 AWS S3 存储桶;提供恶意内容或窃取上传的数据
  3. GitHub Pages 劫持 — 创建匹配悬空 CNAME 的 GitHub Pages 仓库,在目标子域名上提供钓鱼页面
  4. 社交媒体冒充 — 申领目标网站链接的未申领社交媒体账号进行品牌冒充
  5. CDN 包劫持 — 申领通过 CDN URL 引用的已废弃 npm 包以注入恶意 JavaScript

输出格式

## 断链劫持报告
- **目标**: http://target.com
- **外部链接总数**: 145
- **失效链接**: 12
- **可劫持资源**: 3

### 发现
| # | 资源 | 类型 | 状态 | 影响 |
|---|----------|------|--------|--------|
| 1 | analytics.expired-domain.com | JavaScript | 域名可注册 | 完整 XSS |
| 2 | assets.target.com -> S3 存储桶 | 静态资源 | 存储桶已删除 | 内容注入 |
| 3 | blog.target.com -> GitHub Pages | 子域名 | 无 GitHub 仓库 | 子域名接管 |

### 修复建议
- 删除对已停用外部资源的引用
- 删除未使用子域名的悬空 CNAME 记录
- 为外部脚本实施子资源完整性(SRI)
- 定期审计外部依赖项的可用性
- 使用 Content Security Policy 限制允许的脚本来源
Skills enregistrées