01 — 面向世界实战:互联网旗标捕猎
哲学:上来就练。不听完课再动手——动手本身就是课。
环境:Arch Linux 物理机笔记本。已装 curl, ssh, nmap, python3。浏览器随便用哪个。
目标:在真实互联网靶场上找到 flag(旗标),每一个 flag 都是一把钥匙,带你进入更深一层。
实战 1-1:SQL 注入 — 让隐藏产品显露
场景:你面前是一个卖东西的在线商城,页面显示 “Welcome to our shop!”,下面列出了几件商品。但有些商品被标记为 “unreleased”(未发布),你作为普通用户看不到。你的任务是:让所有商品——包括未发布的——全部显示出来。
步骤:
- 打开浏览器,访问
https://portswigger.net/web-security/all-labs - 在搜索栏输入
SQL,找到标题为 “SQL injection vulnerability in WHERE clause allowing retrieval of hidden data” 的 lab - 点击 “Access the lab”
- 等待 3-5 秒,你的专属靶场实例就启动了
- 你会看到一个假电商网站,顶部有导航栏:Home / All / Gifts / Accessories / Lifestyle 等等
- 点击任意一个分类链接(比如点击 Gifts),观察 URL 变化。地址栏会变成:
https://<你的实例>.web-security-academy.net/filter?category=Gifts - 这就是注入点。
category参数被直接拼接到 SQL 查询的 WHERE 子句中 - 把 URL 里
category=后面的内容,整个替换成:
完整 URL 示例:'+OR+1=1--https://xxx.web-security-academy.net/filter?category='+OR+1=1-- - 按 Enter
预期结果:页面重新加载,原本只显示 Gifts 分类的商品,现在所有商品全部列出来了。包括本来不该给你看的 “unreleased” 商品。Lab 页面顶部会显示 “Congratulations, you solved the lab!”。
如果你不想手动改 URL,也可以直接在浏览器里操作:点击某个分类,然后在地址栏里修改 category=xxx 为 category='+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。
步骤:
- 在 lab 列表中找到 “Reflected XSS into HTML context with nothing encoded”(最简单的反射型 XSS lab)
- 点击 “Access the lab”
- 靶场启动后,你面前是一个博客网站。页面中间有一个搜索框
- 在搜索框中粘贴以下内容:
<script>alert(1)</script> - 点击搜索按钮(放大镜图标或按 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,问题就来了。
步骤:
- 搜索 lab “DOM XSS in innerHTML sink using source location.search” 并打开
- 你再次看到一个搜索框
- 在搜索框中输入:
<img src=x onerror=alert('dom')> - 点击搜索
预期结果:弹窗。
为什么不是 <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 2220ls看到什么: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 2220ls看到什么: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 2220ls看到什么: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-Z、a-z、0-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。
在源码中搜索 password 或 natas1:
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: | 组织/ISP | org:"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/grep | Part 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
所有外部靶场均为合法注册并授权的教育平台。在未授权系统上使用以上技术属于违法行为。