浅学$IFS在Shell与Web攻击中的用法

今天在分析数据包搜索资料的时候，偶然看到了一篇 Freebuf 文章提到了 ${IFS}。
附下链接：
https://www.freebuf.com/articles/web/286513.html

知识盲区，所以特地搜了一圈，记录下自己的理解。

$IFS 是 shell 脚本中的一种 set 变量，当 shell 处理 "命令替换" 和 "参数替换" 时，shell 根据 IFS 的值，默认是 space, tab, newline 来拆解读入的变量，然后对特殊字符进行处理，最后重新组合赋值给该变量。

如果直接 echo "cd${IFS}/home" %{IFS} 内的值应该是 \n

但是 当用双引号包裹住 $IFS 时，$IFS 会失效。比如创建 shell 文件写入下方内容
输入

Copy
IFS='-'
string2="1--2--3--4"
echo $string2
echo "$string2"

输出：

Copy
1 2 3 4
1--2--3--4

根据链接中的黑客攻击操作，尝试在服务器上直接执行:

Copy
/bin/sh${IFS}-c${IFS}'cd${IFS}/home/target;ls${IFS}-l'

这种写法的命令是可以被执行的，并且能拿到命令的执行结果
如果这种命令出现在了 URL 中，且 WEB 中存在目录穿越漏洞，且 IPS 或者 WAF 在检测 URL 时没有包含对 ${IFS} 的判断 那么很有可能会被攻击者得手
那时候攻击者可能就是提取的 passwd 文件，nc 回连等操作了。

如果后续有新的学习心得，再补充吧～