PHP反序列化漏洞
2021-04-24 17:29
标签:范围 cti 文件中 initial news phpstudy 类型 自动 font 前言 这几天一直在关注新管状病毒,从微博到各大公众号朋友圈了解感觉挺严重的看微博感觉特别严重看官方说法感觉还行那就取中间的吧 自己要会对这个东西要有理性的判断。关注了好两天所以耽搁了学习emmm 希望病毒早点过去吧! 反序列化漏洞 为了有效地存储或传递数据,同时不丢失其类型和结构,经常需要利用序列化和反序列化函数对数据进行处理。 反序列化函数返回字符串,此字符串包含了表示值的字节流,可以存储于任何地方 反序列化函数对单一的已序列化的变量进行操作,将其转换成员来的值 这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性 PHP语言中常用的序列化和反序列化函数有serialize、unserialize、json_encode、json_decode PHP序列化 1.serialize函数 serialize是序列化函数,PHP在序列化动作之前调用改对象的成员函数__sleep。这样就允许对象在被序列化之前做任何清除操作。’ (1) NULL的序列化 在PHP中,NULL被序列化为N。 (2) Boolean型数据的序列化 Boolean型数据被序列化成b: (3) Integer型数据的序列化 Interger型(整型)数据被序列化为i: (4) Double型数据的序列化 Double型(浮点型)数据被序列化为d: (5) String型数据的序列化 String型(字符串型)数据序列化为s: (6) 数组的序列化 数组序列化通常被序列化为 (7) 对象的序列化 对象通常被序列化称: 解读:s表示字符串类型,3是字段值长度 字段名称是str。s表示字符串7表示字段值长度 字段名称是xiaohua PHP反序列化 unserialize是反序列化函数 若被序列化的变量是一个对象,在重新构造对象之后,会自动调用__wakeup成员函数(如果存在) 反序列化漏洞利用 反序列化漏洞产生主要原因: (2)存在魔法函数 1.__construct函数和__destruct函数 void __construct([mixed $args[,$...]]) PHP5允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新的对象时先调用此方法,所以__construct函数非常适合在使用对象之前做一些初始化工作。 __destruct函数 void __destruct(void) PHP5引入了析构函数的概念,这类似于其他面向对象的语言,如C++.析构函数会在对某个对象的所有引用都被删除或者对象被显式销毁时执行 示例代码: 创建xiaohua类的新对象时,会调用__construct函数,输出 In construct;对象被销毁时,会调用__destruct函数输出 Destruct my xiaohua 2.__sleep函数和__wakeup函数 __sleep函数 Serialize函数会坚持类中是否存在__sleep函数,如果存在函数会先被调用,然后执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称数组。如果该函数未返回任何内容,则NULL被序列化,并产生一个E_NOTICE级别的错误. __sleep函数不能返回父类的私有成员的名字,会产生E_NOTICE错误,该函数可以用serializable接口替代。 __sleep函数常用于提交未提交的数据或进行类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,则使用此功能比较好。 __wakeup函数 Unserialize函数会检查是否存在__wakeup函数。如果存在,则会先调用__wakeup函数,预先准备对象需要的资源。 __wakeup函数经常用在反序列化操作中,例如,重新建立数据连接或者性其他初始化操作。 反序列化后,会自动调用__wakeup函数,输出wakeup。序列化对象后,会自动调用__sleep函数输出sleep 反序列化漏洞代码分析 漏洞分析: (1) unserialize函数的参数$class可控 (2) 存在__destruct函数,此函数会将$this->test的值写入C:\phpStudy\PHPTutorial\WWW\hua.php文件 漏洞利用 通过参数re传入的值要实例化a,并且改变$test的值。因为__destruct函数可以将$test的值写入hua.php文件中,所以可以利用该函数将PHP代码传入hello.php文件中。 pyload: http://127.0.0.1/test.php?re=O:1:"a":1:{s:4:"test";s:22:"";} 参考学习:《web安全原理分析与实践》 https://www.freebuf.com/vuls/116705.html PHP反序列化漏洞 标签:范围 cti 文件中 initial news phpstudy 类型 自动 font 原文地址:https://www.cnblogs.com/xhds/p/12233720.html序列化和反序列化
php
$str=NULL;
$xl_str=serialize($str);
print_r($xl_str);
?>
页面结果为: N;
php
$str1=true;
$str2=false;
$xl_str1=serialize($str1);
$xl_str2=serialize($str2);
print_r($xl_str1."
");
print_r($xl_str2);
?>
页面结果为:
b:1;
b:0;php
$str1=123;
$xl_str1=serialize($str1);
print_r($xl_str1);
?>
页面显示为:i:123;
php
$double1=1.23;
$xl_str1=serialize($double1);
print_r($xl_str1);
?>
页面显示为:d:1.23;
php
$str1="test xiaohua";
$xl_str1=serialize($str1);
print_r($xl_str1);
?>
页面显示结果为:s:12:"test xiaohua";
a:
php
$shu=array(‘xiaohua1‘,‘xiaohua2‘,‘xiaohua3‘);
$xl_str1=serialize($shu);
print_r($xl_str1);
?>
页面显示结果:a:3:{i:0;s:8:"xiaohua1";i:1;s:8:"xiaohua2";i:2;s:8:"xiaohua3";}
O:
php
class xiaohua{
public $str=‘xiaohua‘;
public $str2="huahua";
function Func(){
print("this is Func‘‘");
}
}
$aaa=new xiaohua;
$se=serialize($aaa);
print $se;
?>
页面显示结果:
O:7:"xiaohua":2:{s:3:"str";s:7:"xiaohua";s:4:"str2";s:6:"huahua";}
s:3:"str";s:7:"xiaohua";
反序列化
php
class xiaohua{
public $str=‘xiaohua‘;
public $str2="huahua";
function Func(){
print("this is Func‘‘");
}
}
$aaa=new xiaohua;
$se=serialize($aaa);
$stra=‘O:7:"xiaohua":2:{s:3:"str";s:7:"xiaohua";s:4:"str2";s:6:"huahua";} ‘;
$stra=unserialize($stra);
var_dump($stra);
?>
页面显示结果:object(xiaohua)#2 (2) { ["str"]=> string(7) "xiaohua" ["str2"]=> string(6) "huahua" }
反序列化漏洞利用
(1)unserialize函数的参数可控 1 php
2 class xiaohua{
3
4 function __construct(){
5
6 print "In construct
";
7
8 $this->name="my xiaohua";
9
10 }
11
12 function __destruct(){
13
14 print "Destruct
" .$this->name."\n";
15
16 }
17
18 }
19
20 $obj=new xiaohua();
21
22 ?>
25 执行结果:
26 In construct
27 Destruct
28 my xiaohua 1 php
2
3 class xiaohua{
4
5 function huahua(){
6
7 $this->name="huahua";
8
9 print $this->name;
10
11 }
12
13 function __wakeup(){
14
15 echo "wakeup
";
16
17 }
18
19 function __sleep(){
20
21 echo "
sleep
";
22
23 return array(‘name‘);
24 }
25
26 }
27
28 $sst=‘O:7:"xiaohua":2:{s:3:"str";s:7:"xiaohua";s:4:"str2";s:6:"huahua";} ‘;
29 $sst=unserialize($sst);
30 var_dump($sst);
31 $xiaohua1=new xiaohua;
32 $xiaohua1->name="bobo";
33 $sr=serialize($xiaohua1);
34 print $sr;
35
36 ?>
37 执行结果:
38 wakeup
39 object(xiaohua)#1 (2) { ["str"]=> string(7) "xiaohua" ["str2"]=> string(6) "huahua" }
40 sleep
41 O:7:"xiaohua":1:{s:4:"name";s:4:"bobo";}反序列化漏洞代码分析
1 php
2 highlight_file(__FILE__);
3 class a{
4 var $test=‘hello‘;
5 function __destruct(){
6 $fp=fopen("C:\phpStudy\PHPTutorial\WWW\hua.php","w");
7 print "===".$this->test;
8 fputs($fp,$this->test);
9 fclose($fp);
10 }
11 }
12
13 $class=stripslashes($_GET[‘re‘]);
14 print $class;
15 $class_unser=unserialize($class);
16 require ‘C:\phpStudy\PHPTutorial\WWW\hua.php‘;
17 ?>
1 php
2 class a{
3 var $test=‘‘;
4 }
5 $a=new a();
6 $class_sere=serialize($a);
7 print_r($class_sere)
8 ?>
9 执行结果:
10 O:1:"a":1:{s:4:"test";s:22:"";}
上一篇:Go_Json序列化