概述
ctfweb-PHP反序列化
我的blog,欢迎来玩
学习了一下php反序列化漏洞,并做了一些整理。
简单理解
serialize将一个对象转换成一个字符串
unserialize将一个字符串还原成一个对象
序列化:
如图所示:
O:6:"People":2:{s:4:"name";s:4:"jack";s:3:"age";i:18;}
就是我们输入的people信息经过序列化得到的字符串,其中
需要注意的是:
x00 + 类名 + x00 + 变量名 反序列化出来的是private变量
x00 + * + x00 + 变量名 反序列化出来的是protected变量
反序列化
我们通过post传递这串序列化的字符串,来验证使用unserialize
两者配合引起了问题所在。
魔术方法
__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当脚本尝试将对象调用为函数时触发
最常用的:
__construct,构造函数,PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初 始化工作。
__toString,打印一个对象时,如果定义了__toString()方法,就能在测试时,通过echo 打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含 的数据。
__destruct,析构函数,PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言, 如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
__sleep magic方法在一个对象被序列化的时候调用。
__wakeup magic方法在一个对象被反序列化的时候调用。
php反序列化漏洞
PHP反序列化漏洞又叫PHP对象注入漏洞,反序列化的数据本质上来说是没有危害的,但是在 反序列化参数可控时,可能会产生严重的安全威胁。当传给 unserialize() 的参数可控时, 我们可以通过传入一个精心构造的序列化字符串,从而控制对象内部的变量甚至是函数。
攻击流程就是在本地写一个序列化的文件,拿得到的字符串去打远程
重点关注的函数:
代码执行:eval() assert()
命令执行:exec() passthru() system() popen()
文件操作:file_put_contents() file_get_contents() unlink()
常用:
exec — 执行一个外部程序(exec(whoami))
passthru — 执行外部程序并且显示原始输出,同上
system — 执行外部程序,并且显示输出(system(whoami)、system(ls))
file_get_contents — 将整个文件读入一个字符串(file_get_contents(flag.php))
unlink — 删除文件
END
最后
以上就是忐忑奇异果为你收集整理的ctfweb-PHP反序列化简单理解魔术方法php反序列化漏洞的全部内容,希望文章能够帮你解决ctfweb-PHP反序列化简单理解魔术方法php反序列化漏洞所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复