为何eval选项解析场景下该输入会引发代码注入?
Bash中
eval代码注入的具体解析 你之前的误解源于对name变量值的错误计算,我们一步步拆解整个流程:
输入参数的处理
当执行./foo --test-'; ls -l /etc/passwd;x='时,脚本里的name=${i#--}会去掉参数开头的--,所以name的实际值是:test-'; ls -l /etc/passwd;x=,而非你认为的-'; ls -l /etc/passwd;x=。eval命令的拼接与执行
脚本中eval "$name=\$name"会把name的值代入,最终eval要执行的字符串是:test-'; ls -l /etc/passwd;x=='$nameBash在解析这个字符串时,会按分号分割成独立命令依次执行:
- 第一个命令:
test-'='$name——给名为test-'的变量赋值为$name的内容,这是合法的变量赋值操作,不会触发错误 - 第二个命令:
ls -l /etc/passwd——被直接执行,这就是为什么能读取/etc/passwd的详细信息 - 第三个命令:
x=='$name——给变量x赋值,不影响恶意命令的执行
- 第一个命令:
为什么不会触发你预期的错误
你以为会出现bash: eval: -': invalid option错误,是因为错误认为name的值以-开头,导致eval的第一个参数是-'。但实际name的值是test-';...,第一个命令是给test-'变量赋值,完全符合bash语法,不会触发参数错误。
本质上,eval的危险性在于它会将字符串当作bash命令直接解析执行,而这个脚本没有对用户输入做任何过滤,直接将输入内容作为变量名代入eval,导致攻击者可以通过构造带分号、引号的输入,插入任意恶意命令。
内容的提问来源于stack exchange,提问作者dandan13
相关产品推荐
相关产品推荐

