Web_php_unserialize
源码如下:
知识点:
1、__construct():当对象创建(new)时会自动调用。但在 unserialize() 时是不会自动调用的。(构造函数)
2、__destruct():当对象被销毁时会自动调用。(析构函数)
3、__wakeup():unserialize() 时会自动调用
4. 正则 : /[oc]:\d+:/i
\d 是匹配一个数字
+表示一个或多个
i忽略大小写(修饰符)
[xyz]字符集合,匹配所包含的任意一个字符(x,y,z)
正则表达式中"/"是表达式开始和结束的标记
5. preg_match 返回1 / 0
preg_match_all 返回 0/匹配次数
如 : preg_match("/php/i", "PHP is the web scripting language of choice.")
两个函数用法一样
flag在 fl4g.php
想到了正则表达式绕过, 但是就卡在这了.后面也没想到绕过正则后构造什么payload
这恰好是这题的两个考察点
反序列化绕过数字
"O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}"
----> "O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}"
+号绕过
这里利用了 unserializer
的一个特性
具体可参考:
https://www.phpbug.cn/archives/32.html
https://www.guildhab.top/?p=990
绕过 __wakeup() 函数
参考:
CVE-2016-7124 https://bugs.php.net/bug.php?id=72663
创建对象之后 , 对对象的属性检查 , 若属性检查通过 , 就调用
__wakeup()
方法若对象属性检查不通过 , 则会跳出
object_common2()
函数 , 不再调用_