拿到靶场后,做一下目录扫描
1.访问 /start.sh
获得了网站的路径
2.访问/index.php/login
拿到一个page的参数,因为page的内容是可以回显的因此尝试利用伪协议读取任意文件漏洞
?page=php://filter/read=convert.base64-encode/resource=index.php
?page=file:///var/www/html/index.php
两种方法都尝试,发现php伪协议成功拿到源码
将这一串源码拿去base64解密(因为我们读取源码采用了base64加密)
对源码进行过滤,发现利用点
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
echo "<br >Welcome My Admin ! <br >";
$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];
if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}
}
知识点1: xff伪造
就是在Host下面添加一条 X-Forwarded-For
如果不行的话说明位置不对,或者空格少了
知识点2 preg_replace() /e 漏洞
preg_replace() 函数,该函数执行一个正则表达式的搜索和替换。
搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
参数说明:
-
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
-
$replacement: 用于替换的字符串或字符串数组。
-
$subject: 要搜索替换的目标字符串或字符串数组。
-
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
-
$count: 可选,为替换执行的次数。
源码中
pat传入一个正则,rep传入命令执行的函数,sub需要和pat的正则进行匹配
/e 的原理就是 搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换,然后执行sub的内容
如图,命令被执行了
接下来就是常规的命令执行,找flag
由于空格会导致字符失效,因此,利用+来替代空格(url中+就是空格)