Linux无斜杠路径替代语法咨询:绕过路径遍历防护访问秘密文件
回答
首先得明确一个核心点:Linux系统中唯一的路径分隔符就是/,所有合法的路径解析都依赖它。不过针对你的场景,我们可以分情况讨论有没有绕开直接输入斜杠的方法:
情况1:后端直接通过系统调用(如open/fopen)处理文件
如果后端是直接调用系统接口打开文件,而非通过shell执行命令,那没有无需使用斜杠的通用方法能构造出/tmp/secret.txt的路径。因为任何路径的层级分隔都必须用/,而你说后端已经转义了所有输入的斜杠,这些斜杠会被当作普通文件名字符处理,无法起到路径分隔的作用。
不过有个极端特殊情况:如果后端进程的当前工作目录恰好是/tmp,那你直接上传secret.txt就能访问目标文件——但这完全依赖后端的运行环境,不具备通用性。
情况2:后端通过shell命令(如cat/cp)处理文件名
如果后端是将你上传的文件名拼接到shell命令中执行(比如cat "$UPLOADED_FILENAME"),那你可以利用shell的特性间接构造路径,无需直接输入斜杠:
- 命令替换:先通过
find命令定位目标文件的inode号(比如find /tmp -name secret.txt -printf "%i"得到inode号12345),然后上传构造的文件名$(find /tmp -inum 12345)。shell会先执行括号内的命令,将结果替换成目标文件的路径,进而实现读取。 - 环境变量结合命令输出:如果系统中存在指向
/tmp的环境变量(比如$TMPDIR),可以尝试上传$(echo $TMPDIR)$(printf '\x2f')secret.txt——这里用printf '\x2f'输出斜杠的ASCII编码,避免直接输入/,shell会解析并拼接成/tmp/secret.txt的完整路径。
需要注意的是,这些方法本质上属于命令注入漏洞的利用,而非单纯的路径遍历,前提是后端没有过滤$、(、)这些shell特殊字符。
最后提醒下:这类测试请仅在你拥有合法授权的环境中进行,未经授权的测试可能违反法律法规。
内容的提问来源于stack exchange,提问作者Yeti
相关产品推荐
相关产品推荐

