无名商城论坛

搜索
查看: 240|回复: 0

[其他技术] 【限定72小时】web安全之反序列化漏洞

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 18:06:06 | 显示全部楼层 |阅读模式
本教程转载网络,我只是个搬运工
首先要懂什么是序列化漏洞就要懂什么是序列化(好像再说废话[滑稽])
序列化:是将变量转换为可保存或传输的字符串的过程;
反序列化:在适当的时候把这个字符串再转换成原来的变量使用。
php序列化和反序列化函数
serialize()函数:可以将变量转换为字符串并且在转换中可以保存当前变量的值  #用于序列化对象或数组,并返回一个字符串,serialize() 函数序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和结构不会改变
unserialize():可以将serialize生成的字符串变回变量。
php进行序列化的目的:保存一个对象方便以后重用
序列化实例:
$this表示的是伪变量这里代指的是实例化对象。
序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字(上图是序列化之后的对象):O表示数据类型是对象,6表示数据长度(类名为6个字符),"Person"为类名,{}里面的是类的属性变量。显示的结果和前面的一样
反序列化实例:
把上面序列化过后的结果经过反序列化函数赋值给$pre,$pre就是一个实例化对象了。
php魔法函数
php类中包含了一些魔法函数,这些函数可以在脚本的任何地方不用声明就可以使用。
* 与php(反)序列化有关的魔法函数:
1. __construct():当一个对象创建时被调用  #当创建一个对象的时候,会被自动调用该函数
2. __destruct():对象被销毁时触发  #当销毁一个对象的时候会触发该函数。
3. __wakeup():使用unserialize时触发   #使用反序列化函数时会自动触发
4. __sleep():使用serialize时触发  #使用序列化函数的时候会自动触发
5. __toString():把类当作字符串使用时触发  #当把一个类当作字符串使用的时候,就会自动触发该函数
6. __get():用于从不可访问的属性读取数据  #当从一个不可访问的属性中读取数据的时候,就会触发该函数
php魔法函数实例:
上面是一个魔法函数的实例,当Person类创建一个对象的时候,会自动调用__construct魔法函数,当echo 这个对象(也就是把类当作字符串使用)的时候,会自动触发__toString函数,当对象被销毁的时候(脚本执行结束了),就自动触发__destruct函数。
php反序列化漏洞原理:
* php反序列化漏洞又称为对象注入,可能会导致注入,远程代码执行。
* php反序列化如何产生:
1. 如果一个php代码中使用反序列化函数unserialize()去调用某一类,该类中会自动执行执行一些自定义的魔法函数,这些魔法函数中如果包含了一些危险操作,或者这些魔法函数会调用类中其他带有危险操作的函数,如果这些危险操作是我们可控的,那么就可以进行一些不可描述的操作
php反序列化漏洞代码实例1:
1. unlink():删除一个指定的文件。
2. dirname():返回路径中的目录部分
3. 上面的代码(1.php)中,delete类中定义了一个__destruct函数(销毁一个对象的时候会触发该函数里面的操作),该函数中会执行删除文件的操作。如果想利用该类来执行任意文件删除操作,则需要寻找一个可控的反序列化函数。
这个代码(2.php)把上面的1.php包含进去了,并且在最后一行
1. 有一个反序列化的操作。
* 如果有上面两个代码,而且也知道在该目录下面有一个1.txt文件。如果我们想删除这个文件的话,可以通过2.php里面per_serialized参数传入poc生成的payload,之后可以触发1.php里面的delete类,执行unlink函数,然后删除文件
poc代码:
经过poc可以生成一个对象test,且对象的属性变量为我们要操控的1.txt文件的序列化对象
1. 上面就是获得的一个序列化对象,之后就可以把这个序列化对象当作payload访问:
本帖隐藏的内容需要【资源会员】才可浏览,您需要升级才可浏览,点击这里升级【资源会员】
2. 查看www目录,发现1.txt被删除
* 实现经过:把poc代码中的对象delete实例化成为payload,然后通过2.php里面的per_serialized变量来进行参数的传入,2.php会对传入的序列化的payload进行反序列化。反序列化之后,会销毁poc里面的delete类,就会触发1.php里面的__destruct()魔法函数,删除文件。全程和2.php没有什么关系。
* 优先删除的是2.php文件当前目录里的1.txt文件。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表