加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

PHP反序列化漏洞简介及相关技巧小结

发布时间:2019-08-12 15:30:31 所属栏目:策划 来源:xiaopan233
导读:要学习PHP反序列漏洞,先了解下PHP序列化和反序列化是什么东西。 php程序为了保存和转储对象,提供了序列化的方法,php序列化是为了在程序运行的过程中对对象进行转储而产生的。序列化可以将对象转换成字符串,但仅保留对象里的成员变量,不保留函数方法。

__construct感觉没什么用,先扔在一边,重点看__wakeup和__destruct函数,__wakeup是调用了一个waf函数,用来做正则过滤的,这个我们先放一下,我们看__destruct函数,它使用了call_user_func_array这个php内置的方法,作用是调用一个指定方法。举个这个函数的简单栗子:

image.png

第一个参数是要调用的函数,第二个参数是一个数组,用于给调用的函数传参。数组中第一个值就是函数中的第一个参数,以此类推。

但是题目中的call_user_func_array中的第一个参数是个数组,这什么意思呢。。?

PHP反序列化漏洞简介及相关技巧小结

数组的话就是数组的第一个元素表示是该方法所在的类,第二个元素就是方法名。

我们来看看这个类的成员变量吧,在可以反序列化后,就要明白这个类中的所有成员变量都是我们可控的,所以call_user_func_array()中的$this->method和$this->args也就是我们可控的。不过由于执行这个函数要通过一个if,且调用的函数必须是本类的函数,那我们就只能看看本类中还有什么方法吧。

我们看看进入call_user_func_array()函数前的if判断,它判断我们要调用的函数名是否在一个允许调用的列表里,而这个列表就只有echos这一个函数,也就是说我们的method变量已经限定死了,必须为echos。

那么我们只能去看看echos函数里有什么了,居然有system函数

image.png

那么我们就可以进行命令注入了,可以看到echos函数就只有一个形参,结合上面我们说到的call_user_func_array()函数,就形成了这样一个思路:

  • 通过反序列化控制method和args两个成员变量
  • method必须是echos不然通不过if判断
  • 通过call_user_func_array()函数第一个参数调用本类中的echos方法,第二个参数给方法传参-
  • 由于echos方法中的system函数的参数是拼接形参的,完成命令注入。

思路有了,那么我们看看args变量要怎么写吧。根据执行顺序,先wakeup再destruct(由于是反序列化的,不会执行construct,只有new才会执行construct)。那么我们看看wakeup中又进行了什么操作

image.png

可以看到它默认将args变量视为一个数组,对其进行了foreach,然后又对数组中的每个元素送去了waf进行过滤。这表明我们传入的args是一个数组。

再来看看waf函数是干嘛的。

image.png

第一行,正则匹配args的元素,如果元素中出现将斜杠/之间的任意一个字符,就将他们替换为空。这里过滤了|符号,这个有点伤,因为命令中是通过|进行管道的操作,在命令注入时用|进行拼接很有用,不过即使它禁用了,我们还可以通过& 达到多个命令一行执行的目的。

第二行,如果args中的元素中存在flag这个字符串,替换为空,也就是说我们要读取flag文件时要通过双写flag进行绕过。

这里注意一下system函数,有个坑。。。

PHP反序列化漏洞简介及相关技巧小结

echo写错写成了echos。。。。即这个命令本身就是错的,所以选择命令的分隔符要慎重。

资料:

  • 是不管前后命令是否执行成功都会执行前后命令
  • 是前面的命令执行成功才能执行后面的命令
  • 是前面的命令执行不成功才能执行后面的命令
  • 管道符

所以我们要使用&符而不能使用&&。

image.png

image.png

复制这一串序列化字符串到Postman上,然后既然我们都拿到源码了,我们把第2行的error_reporting(0);先注释起来,这个意思是抑制报错,这对我们调试代码很不友好,把报错打开才能更快找到问题所在。

image.png

发送payload,emmm…… no responose?

image.png

在这里思来想去,折腾了一下,后面通过var_dump才找到问题源头(var_dump大法好)

image.png

image.png

前面刚说了要注意类型。。。private和protected的变量名前都是有0×00的。。。echo的输出由于是NULL就空过去了,但是没有逃过var_dump的法眼(var_dump大法好)

那么我们就要手动添加0×00上去了,这里可以用python、php等编程语言将0×00转换成字符然后再通过他们自己的网络模块发送,

栗子:

python:(2.7)

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读