bash代码注入的安全漏洞分析
bash的环境变量
环境变量是操作系统运行shell中的变量,很多程序的运行需要获取系统的环境变量参数。具体赋值格式如下:
$ var="hello world"
然后你就可以使用这个变量了,但是只是局部变量,即是当前进程可以用,若当前进程的子进程或者其他进程需要用,需要用到 export将本进程的变量copy到其他进程。丽日如下测试
没加export,当新建一个bash,再输出$var 就不能获取环境变量
$ var="hello coolshell"
$ echo $var
hello coolshell
$ bash
$ echo $var
所以得加个export
$ export var="hello coolshell"
bash的函数
bash与上面得环境变量同理
$ foo(){ echo "hello coolshell"; }
$ foo
hello coolshell
$ bash
$ foo
bash: foo: command not found
同理, 加个export -f
$ foo(){ echo "hello coolshell"; }
$ foo
hello coolshell
$ export -f foo
$ bash
$ foo
hello coolshell
bash的bug
先看如下测试代码:
$ export X='() { echo "inside X"; }; echo "outside X";'
再用env 查看创建出来的环境变量
$ env
X=(){ echo "inside X"; }; echo "outside X";
当我们在当前的bash shell进程下产生一个bash的子进程时,新的子进程会读取父进程的所有export的环境变量,并复制到自己的进程空间中,很明显,上面的X变量的函数的后面还注入了一条命令:echo “outside X”,这条命令会在父进程向子进程复制的过程中被执行。
$ export X='() { echo "inside X"; }; echo "outside X";'
$ bash
outside X
这就是bash的bug—— 函数体外面的代码被默认地执行了
实践
要找到网站运行bash的CGI文件,网上搜索,网站的默认路径为/cgi-bin中
然后用bp抓包,在Connection中加入bash指令操作,创建环境变量顺便执行查看key
拿到key
参考链接:https://blog.csdn.net/jingxia2008/article/details/39637085