您当前的位置: 首页 > 

合天网安实验室

暂无认证

  • 0浏览

    0关注

    748博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SoapClient反序列化SSRF

合天网安实验室 发布时间:2019-09-02 08:20:00 ,浏览量:0

序列化中的魔术方法

https://www.php.net/manual/zh/language.oop5.magic.php

construct(), destruct(), call(), callStatic(), get(), set(), isset(), unset(), sleep(), wakeup(), toString(), invoke(), set_state(), clone() 和 __debugInfo() 等方法在 PHP 中被称为魔术方法(Magic methods)

  • 构造函数 __construct 对象被创建的时候调用

  • 析构函数 __destruct 对象被销毁的时候调用

  • 方法重载 __call 在对象中调用一个不可访问方法时调用

  • 方法重载 __callStatic 在静态上下文中调用一个不可访问方法时调用

  • 在给不可访问属性赋值时,__set() 会被调用。

  • 读取不可访问属性的值时,__get() 会被调用。

  • 当对不可访问属性调用 isset()empty() 时,__isset() 会被调用

  • 当对不可访问属性调用 unset() 时,__unset() 会被调用

  • __sleep()serialize() 函数执行之前调用

  • __wakeup()unserialize() 函数执行之前调用

  • __toString 在一个类被当成字符串时被调用(不仅仅是echo的时候,比如file_exists()判断也会触发

php中的内置类

如上,使用SoapClient反序列化+CRLF可以生成任意POST请求。

Deserialization + __call + SoapClient + CRLF = SSRF

CTF题目

以下只关注SSRF的利用,其他知识点不再赘述

n1ctf2018 easy_harder_php

https://github.com/Nu1LCTF/n1ctf-2018/tree/master/source/web/easy_harder_php

拿到admin密码之后,需要从127.0.0.1登陆,用到SSRF,通过注入a`, {serialize object});#引发反序列化漏洞

反序列化后的SoapClient对象去调用不存在的getcountry方法,调用__call,实现SSRF

控制PHPSESSID为自己的session,SSRF来进行admin登陆


再使用上面的PHPSESSID访问,就是admin了

SUCTF2019 upload-lab2

https://github.com/team-su/SUCTF-2019/tree/master/Web/Upload%20Labs%202

题目可以上传文件,检查文件类型

admin.php

if($_SERVER['REMOTE_ADDR'] == '127.0.0.1'){
    if(isset($_POST['admin'])){
        
        $ip = $_POST['ip'];     //你用来获取flag的服务器ip
        $port = $_POST['port']; //你用来获取flag的服务器端口


        $clazz = $_POST['clazz'];
        $func1 = $_POST['func1'];
        $func2 = $_POST['func2'];
        $func3 = $_POST['func3'];
        $arg1 = $_POST['arg1'];
        $arg2 = $_POST['arg2'];
        $arg2 = $_POST['arg3'];
        $admin = new Ad($ip, $port, $clazz, $func1, $func2, $func3, $arg1, $arg2, $arg3);
        $admin->check();
    }
}

需要通过本地来访问,执行$admin->check();

Ad类中

    function __destruct(){
        getFlag($this->ip, $this->port);
        //使用你自己的服务器监听一个确保可以收到消息的端口来获取flag
    }

直接就能拿到flag

class.php中,File类的getMIME方法调用了finfo_file函数

    function getMIME(){
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $this->type = finfo_file($finfo, $this->file_name);
        finfo_close($finfo);
    }

finfo_file/finfo_buffer/mime_content_type均通过_php_finfo_get_type间接调用了关键函数php_stream_open_wrapper_ex,导致均可以使用phar://触发 phar反序列化

File类的__wakeup方法通过反射初始化了一个类并调用了其check成员方法。将类名改为SoapClient,调用check方法时就会去调用__call方法,实现SSRF

exp:

            
关注
打赏
1665306545
查看更多评论
0.0406s