源码分析
- 这里的代码其实与 [Level 5]([[Level 5-RCE-labs-WP]]) 唯一不同的地方就是
preg_match
函数的第一个参数- 这里不再是匹配
flag
字段 - 而是匹配这一堆字符
- 小写 b 到 z (没有小写 a, 这是个突破口)
- 大写 A 到 Z
- _@#%^&*:{}-+<>"|`;[] 这些符号(注意到了吗, 没有什么符号?)
- 对了还有数字可以使用
- 这里不再是匹配
解题分析
- 这次的WAF进行了升级
- 可以利用的字符只有 数字, 小写a 和
?
, 对了还有两种斜杆 ?
可以匹配任何一个单字符- 那么就可以通过
/??a?
对应/flag
, 系统正常情况下根目录中符合这个要求是没有的, 所以就可以索引到flag
这个文件
- 那么就可以通过
- 之前是通过
cat
命令读取文件, 那现在可以使用?a?
来使用cat
命令吗?(自己打开终端试试吧) - 显然是不行的,
?
作为通配符只在路径中有效 - 那我们要如何读取文件呢
cat
虽说是命令, 但是其实也就是个程序- 只需要找到其路径, 直接通过路径访问就可以了
- 如
/bin/cat /flag
- 使用通配符后
/???/?a? /??a?
- 但是你会发现
/???/?a?
不单指向了cat
, 似乎还指向了其他东西- 可以通过在自己的终端中使用如下命令查看
/???/?a?
指向了什么echo /???/?a?
- 输出结果
/bin/cat /bin/tar
- 可以通过在自己的终端中使用如下命令查看
- 发现
/???/?a?
还指向tar
- 那怎么办呢
- 先看看有哪些读取文件的函数(还是引用了官方的WP)
命令 描述 cat
从第一行开始显示内容,并将所有内容输出 tac
从最后一行倒序显示内容,并将所有内容输出 more
根据窗口大小,一页一页地显示文件内容 less
根据窗口大小,显示文件内容,可以使用键盘上的 [Pg Dn] 和 [Pg Up] 翻页 head
用于显示文件的头几行 tail
用于显示文件的尾几行 nl
类似于 cat -n
,显示时输出行号tailf
类似于 tail -f
,实时显示文件尾部内容sort
读取并排序文件内容 od
以二进制的方式读取文件内容 vi
一种编辑器,能查看文件内容 vim
一种编辑器,能查看文件内容 uniq
过滤重复行,能查看文件内容 file -f
显示文件类型信息,若出错会报告具体内容 - 或许你可以试试能不能通过通配符的方式, 唯一定位到上述几个函数(这里就不试)
- 因为这里发现数字似乎来可以利用, 似乎命令里代数字的挺少的
- 于是就想到了
base64
命令, 可以把输入进行 base64编码 后输出 - 于是就有了如下解法
解题步骤
base64
的位置于/bin/base64
, 所以构造如下/???/?a??64
- 衔接
/flag
/???/?a??64 /??a?
- 最后 Payload 如下
?cmd=/???/?a??64 /??a?
- 进行 Base64解码 就是flag了