首页 > 技术文章 > 从Bash漏洞学Shell脚本(冒号)

tom-zhao 2014-09-26 11:36 原文

前天,爆发了Bash安全漏洞,非常恐怖。在网络上开始飞速传播,附带了非常友好的检测工具。

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

看一下运行结果:

vulnerable
this is a test

我的bash是vulnerable。

看一下测试命令。(这个才是我们需要看的东西,从中学习。)开始,我比较蒙。同事给我解释了这个命令的含义和出现问题的原因。

env设置环境变量的命令。给x设置了环境变量'() { :;}; echo vulnerable'。而环境变量经过bash的执行,匿名函数通过了执行,执行了vulnerable。

对于设置环境变量,正常而言是不能执行的。我们可以设置一下函数尝试一下。执行命令

env x='e() { :;}; echo vulnerable'

命令同时会把内容打印出来看

。。。。。。。#省略一些
SHLVL=1
HOME=/root
LOGNAME=root
QTLIB=/usr/lib64/qt-3.3/lib
CVS_RSH=ssh
CLASSPATH=.:/usr/jdk1.7.0_07/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SSH_CONNECTION=192.168.100.231 38730 192.168.100.172 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env
OLDPWD=/root
x=e(){:;};echo vulnerable

在最后x已经定义成功了。把函数和命令当做字符串进行了处理。

看到了他们当中的不同了吗?这个就是bash的漏洞的原因,引申一下:如果骇客执行了恶意程序,后果不堪设想。当然通过网络等方法是用这个漏洞,git/svn。网络服务器等互联网常用的软件,造成网络的极大不安全。

最后我们看一下,这个列子中使用的一个比较不常用的符号 :  (冒号)。在Bash里边:是一个占位符。是一个不执行的命令。这个命令对于命令输入不挑食,可以作为注释方法。

没有输出,可以对文件进行清空。

: > test.file

cat test.file

 

: your comment

 

推荐阅读