#!/bin/bash
var=$1
if [ "$var" -eq 42 ];
then echo "Success"
fi
./script.sh "1+a[$(rm -rf /)]"
在上述例子中,$(rm -rf /) 是一个命令替换语法,Bash 会在展开变量时立即执行其中的命令。因此,当 [ "$var" -eq 42 ] 被解析时:
- Bash 遇到
$(rm -rf /),执行rm -rf /(删除根目录下的所有文件,假设有权限)。 - 命令替换完成后,假设
rm -rf /没有输出,表达式变为1+a[](因为$(rm -rf /)为空)。 - Bash 继续尝试解析
1+a[],但由于a未定义且数组索引为空,最终抛出错误。
尽管最终的比较会失败,但危险在于,rm -rf / 已经被执行。这种"副作用"使得攻击者可以在不依赖 eval 的情况下,通过精心构造的输入注入并执行任意命令。