这道题包含了文件包含、代码审计、和反序列化。
1、查看源码:
发现这个file_get_contents函数读取的是前端发送的数据,正常来讲这个函数是读取文件的,还有就是它通过GET接收了一个file,然后把class.php包含进去了,然后我们试试文件包含,给user传一个admin,才能使文件包含成立,然后试一下文件包含漏洞,看看能不能爆出源码。
这里简单解释下为什么这么构造文件包含的惯用套路代码是 ?参数=php://input&file=指定的php文件(xx.php)
而php://read=convert.base64-encode/resource=则是编码设置,以base64显示,去掉了就不行
得到:
base64解码得到:
同理去解码class.php,得到:
有两个if语句,先满足第一个,让$user的值为admin,然后再让第二个if为False,就能成功的包含class.php了。
进行代码分析,知道flag有可能在f1a9.php中,这个unserialize();这是个反序列化函数,我们可以利用这个函数,传入参数导致调用index.php中的class类,然后读取f1a9.php中的内容。
构造payload:O:4:"Read":1:{s:4:"file";s:8:"f1a9.php";}
简单解释下这个payload,O:4:"Read"指4个字符的对象Read,s:8:"f1a9.php"指8个字符的字符串f1a9.php
将payload传入参数
得到:
检查源码,我的火狐右键检查源码无效,直接检查器查看即可: