[极客大挑战 2019]PHP
[极客大挑战 2019]PHP
打开发现,提示说备份了,然后没有任何的注入点,所以使用dirsearch 扫描一下

得到结果,发现一个压缩包,访问一下
解压后得到

分别打开这三个文件,flag.php,index.php,class.php,其中index是源码,三个图片分别对应index,class,flag



flag是假的,然后先看class.php,这里的class为了方便所以把index.php中的一点也搬过来好解析一点,
我们传入select 参数,经过unserialize转为php对象,这就是漏洞来源,叫反序列化漏洞,
然后,包含了flag.php文件,定义了Name,然后有username和password的初始化,然后将传入的值给到他们,但是经过 function_wakeup()时又会变为guest,所以不论你输入的username是多少都会变成guest,然后看下面if(password!=100)就会die,所以password必须是100,然后username===’admin’,判断username是不是admin,这里必须是admin才能打印出flag,然后password也不能中道崩成,所以这里要满足,password=100,username=’admin’,但是无论怎么做都会变成guest,所以这里用到一个知识点
绕过 __wakeup:CVE-2016-7124
漏洞本质:序列化字符串里声明的"属性个数"如果大于真实属性个数,PHP 会跳过 __wakeup(),但对象照常创建、属性照常填充。
所以,当传入的属性大于原本的属性是就会跳过执行,而这里只有两个属性,一个是password,和username
接下来,就是怎么传入值,我们需要了解两个知识点
- 反序列化字符串的语法

这个就是类名,
这一串属于属性部分

s代表字符串,i代表整形
属性中的
要根据下面来决定
- 每个声明方式对应的序列化里的名字

所以这题我们要构造的payload是:
select=O:4:”Name”:3:{s:14:”\0Name\0username”;s:5:”admin”;s:14:”\0Name\0password”;i:100;}
解释一下,\0代表一个字节所以是1+4+1+8=14,然后传数值不用写长度,个部位用;分号分隔。
但是,如果你直接这样发送大概率还是不行,因为浏览器不认\0所以建议,将payload使用url编码结果是
select=O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bi%3A100%3B%7D
select不需要编码

浙公网安备 33010602011771号