论剑场web21 php伪协议+反序列化

1. 看到题目,提示不是admin;查看源码发现部分PHP代码,审计PHP代码。
a. 这里需要输入两个参数user和file。user值需要满足不为空,并且经过函数去取文件file_get_contents($user,'r')后,需要为字符串形式的admin。
b. 文件包含了$file的值,并提示包含值应该为class.php

2. 根据include()文件包含,可以想到的是用php伪协议读取文件,所以参数file=php://filter/read=convert.base64-encode/resource=class.php || index.php 这里读取index.php和class.php的源码;而对于参数user需要满足这个file_get_contents($user,'r')==="admin")。
3. 如果让参数user的值为一个字符串,当file_get_contents($user,'r'),如果找不到该文件,其结果为false,就算可以找到文件也不能确定文件转换为字符串之后为admin,所以这里考虑到使用php://input协议。php://input协议可以对没有经过处理的post参数值进行文件读写操作。故参数user=php://input,并且传递一个post参数 admin。

4. 获取到index.php和class.php 经过base64加密过的源码。解密后继续审计代码。
a. index.php中文件包含结束后,要对参数$pass的值进行反序列化,并输出反序列化后的类$pass
b. class.php的Read类中toString()函数,将文件转换成字符串,并输出。并提示应读取的文件为fla9.php

5. 构造payload,对于参数user,其值继续为php://input并传递一个post值admin;对于参数file=class.php,将class.php文件包含进来;对于参数pass应该为Read序列化后的字符串,并且其变量$file值应为fla9.php。

 

 


6. 在其源码中获得flag

posted @ 2020-10-11 10:25  二算i  阅读(158)  评论(0编辑  收藏  举报