PHP原生类的利用
利用背景
当我们发现源码中有可以反序列化的点,但是却找不到POP链的时候,就可以考虑用到php里的原生类可构造POP链,从而实现触发反序列化漏洞。
查找原生类
我们利用原生类,其实就是利用它们自带的一些魔术方法。所以换句话说,具有对我们有用的魔术方法的原生类,才是我们需要的原生类。
所以可以通过下面的代码先查看一下有哪些原生类是对我们有用的:
<?php
$classes = get_declared_classes();
foreach ($classes as $class) {
$methods = get_class_methods($class);
foreach ($methods as $method) {
if (in_array($method, array(
'__destruct',
'__toString',
'__wakeup',
'__call',
'__callStatic',
'__get',
'__set',
'__isset',
'__unset',
'__invoke',
'__set_state'
))) {
print $class . '::' . $method . "\n";
}
}
}
部分结果:
常用的原生类
有些类不一定能够进行反序列化。
php中使用了zend_class_unserialize_deny来禁止一些类的反序列化。
例如序列化DirectoryIterator的时候:
CTF中原生类多数被用于,XSS、SSRF、反序列化、XXE等。
常用的原生类有:
- Error
- Exception
- SoapClient
- DirectoryIterator
- SimpleXMLElement
- SplFileObject
Error原生类
适用于php7
需要开启报错
开启报错:
php.ini中设置display_errors = On
没权限修改php.ini的话可以在代码中加入:
ini_set("display_errors", "On");error_reporting(E_ALL | E_STRICT);