[极客大挑战 2019]PHP
首先,进入网址,发现有一个非常有趣的动态画面,你可以用毛线球逗小猫玩,小猫也会与你互动,真不错! 咳咳,返回正题,上面提示一段文字,说他有网站备份的习惯,查看网页源码什么信息都没有,应该是把关键文件放到别的路径了。去尝试一下看看,这里有一些常用的网站备份路径:
常用后缀:
tar.gz,zip,rar,tar
常用文件名:
web,website,backup,back,www,wwwroot,temp
我们一个个尝试一下,发现当我们使用www.zip时,下载了一个文件
打开看看有一个flag.php,打开看看,发现一串flag形式的代码,拿去试试,果然不行,没这么简单。
我们继续查看其他文件,其中index.php,文件里有一串代码
这段代码提示是get传参,且对参数进行了反序列化操作,这里我们猜测要使用到反序列化漏洞,
紧接着查看class.php,里面有对这个类的定义如下:
这个代码说只有在username===admin时我们才能得到flag,这是一个强相等的比较。
这里涉及到一个知识点,当我们调用反序列化操作时,会先检查有没有__wakeup函数,如果有会执行这个函数,而题目的代码中的函数会将username设为guest,这样我们后面的比较就不会成功,就得不到flag,所以我们要想办法绕过这个函数。
这里就涉及到如何绕过wakeup函数这个知识点,这里简单介绍一下:
一般反序列化函数内的参数形式为:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
这里O:表示这是一个对象,即object首字母缩写,还有很多这里只介绍O
4表示后面xctf的长度,xctf是对象名,1表示这个对象只有一个属性。
里面的s是string的缩写,4一样表示字符串长度,flag是属性名字,后面的111是属性值,
绕过wakeup的关键在于上面的1所在位置,它表示括号内属性个数
只要他大于大括号内里属性的个数就可以不执行wakeup
那么我们可以构造payload:
O:4:"Name":3{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
这里面的%00是一种反序列化参数格式,有需要请自行了解,这里不在阐述,在url栏输入:
select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
即得到flag{fa503083-ee86-4031-8af9-108925d3843e}
标签:00Name%,极客,14,flag,PHP,2019,wakeup,序列化,函数 From: https://www.cnblogs.com/wzffzw/p/18333031