php 序列化键、值逃逸
转自https://www.cnblogs.com/wangtanzhi/p/12261610.html
PHP反序列化的对象逃逸(很重要一点,引号的匹配是从左到右按字符串长度进行匹配)
任何具有一定结构的数据,只要经过了某些处理而把自身结构改变,则可能会产生漏洞。
参考链接:
https://blog.csdn.net/a3320315/article/details/104118688/
过滤函数分为两种情况
第一种为关键词数增加
例如: where->hacker,这样词数由五个增加到6个。
第二种为关键词数减少
例如:直接过滤掉一些关键词,例如这道题目中。
过滤函数filter()是对serialize($_SESSION)进行过滤,滤掉一些关键字
那么我们有两种方法:
键逃逸和值逃逸
值逃逸:
这儿需要两个连续的键值对,由第一个的值覆盖第二个的键,这样第二个值就逃逸出去,单独作为一个键值对(其实这里构造了2对键值,第二对为
,因为要将img字段丢弃)
var_dump的结果为:
键逃逸:
这儿只需要一个键值对就行了,我们直接构造会被过滤的键,这样值得一部分充当键,剩下得一部分作为单独得键值对
var_dump的结果为:
这儿得s:7:""之所以为空,是因为我们构造得键flagphp都是会被过滤得,所以显示为空,这样就能吃掉一部分值了,然后将剩下得值充当另一个对象逃逸出去~~
0|10x01 解题
回到题目,我们首先看源码
构造payload来对
d0g3_f1ag.php读取。
解释一下:
这里首先phpflagphpflag会被过滤为空,吃掉一部分值
$serialize_info的内容为
刚好把后面多余的img部分截断掉
payload:
读取/d0g3_fllllllag
payload:
参考链接:
https://www.jianshu.com/p/1f44650b0822
https://blog.csdn.net/a3320315/article/details/104118688/