实用指南:CTFHub RCE通关笔记9:命令注入 过滤目录分隔符(3种方法渗透)

news/2025/10/15 22:23:12/文章来源:https://www.cnblogs.com/slgkaifa/p/19144407

实用指南: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") 分别生成两个 /,与 etcpasswd 拼接后,实际形成的命令是 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,一经查实,立即删除!

相关文章

P1912 [NOI2009] 诗人小G 分析

题目链接:P1912 [NOI2009] 诗人小G 题目概述 给你几个字符串,你可以按照给定的顺序任意拼接(你可以分组),但是拼接的时候中间要打空格,设这个当前的拼接长度为 \(sum\),那么代价为 \(|sum-L|^P\),求最小的代价…

[COCI2022-2023#2] Tramvaji 题解

简要题意 告诉一些站点之间的距离,求两站距离最小的两个站 思路 对于某个站点,站台1到他前面的站的距离一定已经处理好了,所以可以用一个数组维护前缀和,从前面某个站转移过来,最后统计就行了 Code: #include <…

一级指针和二级指针作为函数参数的区别

在函数参数中,一级指针(int*)和二级指针(int**)的核心区别在于能修改的数据层级:一级指针可修改指针指向的变量值,而二级指针可修改一级指针本身(包括其指向或分配的内存) 一级指针作为函数参数 作用:通过一…

ROUGE指标

2025.10.15 1.ROUGE指标是评估文本生成质量的常用指标,通过计算生成文本与参考文本之间的n-gram重叠度来测量内容相似性和召回率

CSP-S 模拟 29

CSP-S 模拟 29 A. 一个赢家 (card) 有 \(2n\) 张卡,第 \(i\) 张卡上写着数字 \(i\)。有 \(n\) 个人,这 \(n\) 个人轮流从这些卡中均匀随机拿走两张,不放回。现在每个人手上各有两张卡,手上两张卡上写的数字的和最大…

实用指南:【编号508】(道路分类)湖南路网数据湖南路网分类数据(2025年)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Linux 文件及相关安全操作指南

Linux 文件及相关安全操作指南 Linux根目录项一行说明 一、Linux 根目录各文件夹一行说明(基础回顾)根目录文件夹 一行核心用途bin 系统启动与普通用户可用的基础可执行程序(如ls、cp)boot 启动相关文件(内核vmli…

day012

今日完成:学习了mysql的数据库编辑,添加. 明日完成:数据库 遇到问题:无

怎么能把一个横着的很长的excel表,输出成一个能完整展示在一个页面中的PDF

参考链接:https://blog.csdn.net/qq_34972627/article/details/128139320 横向的Excel输出为pdf自动分成两页怎么办?不分页,铺满整张纸的方法来了

深入解析:Leetcode+Java+图论+岛屿问题

深入解析:Leetcode+Java+图论+岛屿问题pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

简单介绍

简单介绍AI Agent 即人工智能体,通常是指有能力主动思考和行动的智能体,能够以类似人类的方式工作,通过大模型来 “理解” 用户需求,主动 “规划” 以达成目标,使用各种 “工具” 来完成任务,并最终 “行动” 执…

agent认知与原理分析

agent认知与原理分析1

agent策略分析与Parer解读

agent策略分析与Parer解读1

夸克网盘免费扩容,新用户轻松领取1TB免费空间!一步一步教你如何操作! - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Visual Studio 2022连接mysql数据库,解决System.Data.Odbc.OdbcException (0x80131937)

首先我们要下载MySQL ODBC驱动,下载地址: https://downloads.mysql.com/archives/c-odbc/ 下载Windows (x86, 64-bit), MSI Installer 了解ODBC:接下来要连接mysql数据库了,参考这位前辈的笔记:https://blog.csdn…

[AI生成]Spark-TTS个人理解

Spark-TTS 是一个在设计思路上非常清晰、工程结构合理、适合个人开发者学习和二次开发的优秀开源 TTS 项目。以下是它值得肯定的几个关键点,也解释了为什么它特别适合学习:✅ 为什么 Spark-TTS 适合个人开发者学习?…

2025.10.3 测试

DP+线段树/容斥+DP/贪心+构造/Ad-hocA. 思考如何匹配子序列,肯定是贪心的能扩展就扩展,将这个过程改写成 DP 。 设 \(f[i, j]\) 表示 \(S\) 匹配了 \(i\) 位,\(T\) 匹配了 \(j\) 位的方案数。 枚举下一位匹配位置得…

[20251015]建立和完善col_vlist.sql脚本.txt

[20251015]建立和完善col_vlist.sql脚本.txt--//建立一个支持视图的版本,由于oracle没有视图提取字段信息的视图,只能通过desc提取,通过bash shell处理生成需要的脚本。--//如果有哪个视图支持提取视图字段信息的,…

[20251014]建立和完善col_list.sql脚本.txt

[20251014]建立和完善col_list.sql脚本.txt--//增加选择字段顺序号功能。$ cat col_list.sql-- Copyright 2023 lfree. All rights reserved.-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for…