首页 理论教育 Bash环境变量解析失误:实用LinuxShell编程

Bash环境变量解析失误:实用LinuxShell编程

时间:2023-11-18 理论教育 版权反馈
【摘要】:下面模拟一下,运行如下命令,使系统得到一个奇特的email地址:系统中有一个与email地址不相关的脚本,内容如下:执行这个不相关的脚本,或者运行bash进入子shell,都会看到you are stupid这句话:因为系统在启动一个子shell时,会将父shell的环境变量带入,当Bash对这个不一般的环境变量解析失误时,变量EMAIL中的echo you are stupid就会执行。

Bash环境变量解析失误:实用LinuxShell编程

下面的命令将变量x赋值为一个函数的定义。要使函数生效,需用eval命令“扫描”x,然后调用函数fun_b,那么函数中的echo命令可以运行:

下面的命令将变量x赋值为一个函数的定义连同命令echo after fun_b(用分号隔开),用eval命令“扫描”x后函数生效(扫描的同时,命令echo after fun_b被执行,所以先显示afterfun_b),然后调用函数fun_b:

为了理解漏洞,还需看一看被导出的函数在环境中的“样子”:

从表面看,fun_a是个普通的、只不过是以“(){”等特殊字符开头的环境变量。那么,定义一个这种特殊字符开头的环境变量,是不是就会被Bash解释为函数呢?试一试:

看来用特殊字符开头的字符串来定义函数的方法是可行的,而且省去了eval命令的扫描。在特殊字符开头的字符串的后半部加一条其他命令(用分号隔开):

命令echoafterfun_x被执行了吗?根据env命令的格式,上面命令中的fun_x='......'只是变量赋值,引号之间是字符串,echoafterfun_x是字符串的后半部,这里并没有用eval扫描变量,但是变量赋值的后半部竟然被解释为命令并被执行了。漏洞出现了!如果将上面命令中的echoinfun_x换为null命令,即冒号,再将afterfun_x换为vulnerable、将fun_x换为true,就得到了一开始提到的检测漏洞的命令。(www.xing528.com)

为什么说这是个漏洞呢?假设某系统的普通用户以环境变量的形式通过某种途径向系统提供自己的email地址,用于接收公共信息。普通用户没有权限控制或进入系统,用户自己负责email地址的正确性,系统不检查。如果有居心不良的人提供了恶意的email地址,就可能使系统遭到破坏。下面模拟一下,运行如下命令,使系统得到一个奇特的email地址:

系统中有一个与email地址不相关的脚本,内容如下:

执行这个不相关的脚本,或者运行bash进入子shell,都会看到you are stupid这句话:

因为系统在启动一个子shell时,会将父shell的环境变量带入,当Bash对这个不一般的环境变量解析失误时,变量EMAIL中的echo you are stupid就会执行。如果将echo you are stupid替换为破坏性的命令,如rm -fr *,那么,没有权限控制系统的人也能轻易地摧毁系统。

通过前面的分析可知,只要是接受通过某种方法传递过来的环境变量的Bash程序都有可能受此影响,看来Shellshock的确是一个严重的漏洞。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈