You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何eval选项解析场景下该输入会引发代码注入?

Bash中eval代码注入的具体解析

你之前的误解源于对name变量值的错误计算,我们一步步拆解整个流程:

  1. 输入参数的处理
    当执行./foo --test-'; ls -l /etc/passwd;x='时,脚本里的name=${i#--}会去掉参数开头的--,所以name的实际值是:test-'; ls -l /etc/passwd;x=,而非你认为的-'; ls -l /etc/passwd;x=。

  2. eval命令的拼接与执行
    脚本中eval "$name=\$name"会把name的值代入,最终eval要执行的字符串是:

    test-'; ls -l /etc/passwd;x=='$name
    

    Bash在解析这个字符串时,会按分号分割成独立命令依次执行:

    • 第一个命令:test-'='$name——给名为test-'的变量赋值为$name的内容,这是合法的变量赋值操作,不会触发错误
    • 第二个命令:ls -l /etc/passwd——被直接执行,这就是为什么能读取/etc/passwd的详细信息
    • 第三个命令:x=='$name——给变量x赋值,不影响恶意命令的执行
  3. 为什么不会触发你预期的错误
    你以为会出现bash: eval: -': invalid option错误,是因为错误认为name的值以-开头,导致eval的第一个参数是-'。但实际name的值是test-';...,第一个命令是给test-'变量赋值,完全符合bash语法,不会触发参数错误。

本质上,eval的危险性在于它会将字符串当作bash命令直接解析执行,而这个脚本没有对用户输入做任何过滤,直接将输入内容作为变量名代入eval,导致攻击者可以通过构造带分号、引号的输入,插入任意恶意命令。

内容的提问来源于stack exchange,提问作者dandan13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:00:15