PHP反序列化裂痕简介及相干能力小结
__construct感受没什么用,先扔在一边,重点看__wakeup和__destruct函数,__wakeup是挪用了一个waf函数,用来做正则过滤的,这个我们先放一下,我们看__destruct函数,它行使了call_user_func_array这个php内置的要领,浸染是挪用一个指定要领。举个这个函数的简朴栗子: 第一个参数是要挪用的函数,第二个参数是一个数组,用于给挪用的函数传参。数组中第一个值就是函数中的第一个参数,以此类推。 可是标题中的call_user_func_array中的第一个参数是个数组,这什么意思呢。。? 数组的话就是数组的第一个元素暗示是该要领地址的类,第二个元素就是要领名。 我们来看看这个类的成员变量吧,在可以反序列化后,就要大白这个类中的全部成员变量都是我们可控的,以是call_user_func_array()中的$this->method和$this->args也就是我们可控的。不外因为执行这个函数要通过一个if,且挪用的函数必需是本类的函数,那我们就只能看看本类中尚有什么要领吧。 我们看看进入call_user_func_array()函数前的if判定,它判定我们要挪用的函数名是否在一个应承挪用的列内外,而这个列表就只有echos这一个函数,也就是说我们的method变量已经限制死了,必需为echos。 那么我们只能去看看echos函数里有什么了,居然有system函数 那么我们就可以举办呼吁注入了,可以看到echos函数就只有一个形参,团结上面我们说到的call_user_func_array()函数,就形成了这样一个思绪:
思绪有了,那么我们看看args变量要怎么写吧。按照执行次序,先wakeup再destruct(因为是反序列化的,不会执行construct,只有new才会执行construct)。那么我们看看wakeup中又举办了什么操纵 可以看到它默认将args变量视为一个数组,对其举办了foreach,然后又对数组中的每个元素送去了waf举办过滤。这表白我们传入的args是一个数组。 再来看看waf函数是干嘛的。 第一行,正则匹配args的元素,假如元素中呈现将斜杠/之间的恣意一个字符,就将他们替代为空。这里过滤了|标记,这个有点伤,由于呼吁中是通过|举办管道的操纵,在呼吁注入时用|举办拼接很有效,不外纵然它禁用了,我们还可以通过& 到达多个呼吁一行执行的目标。 第二行,假如args中的元素中存在flag这个字符串,替代为空,也就是说我们要读取flag文件时要通过双写flag举办绕过。 这里留意一下system函数,有个坑。。。 echo写错写成了echos。。。。即这个呼吁自己就是错的,以是选择呼吁的脱离符要稳重。 资料:
以是我们要行使&符而不能行使&&。 复制这一串序列化字符串到Postman上,然后既然我们都拿到源码了,我们把第2行的error_reporting(0);先注释起来,这个意思是克制报错,这对我们调试代码很不友爱,把报错打开才气更快找到题目地址。 发送payload,emmm…… no responose? 在这里思来想去,折腾了一下,后头通过var_dump才找到题目源头(var_dump大法好) 前面刚说了要留意范例。。。private和protected的变量名前都是有0×00的。。。echo的输出因为是NULL就空已往了,可是没有逃过var_dump的高眼(var_dump大法好) 那么我们就要手动添加0×00上去了,这里可以用python、php等编程说话将0×00转换成字符然后再通过他们本身的收集模块发送, 栗子: python:(2.7) (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |