有时候看看国外的ctf比赛的wp还是挺好的
Mindreder
可以通过f参数直接读取到想读的文件
那么如何确定flag的位置?
既然可以读文件,那么第一步的想法就是读源码
确定后端是flask
源码:
1 | from flask import Flask, request, abort |
看到flag是藏在环境变量里面的,而环境变量就在/proc/environ
中
那就直接去读呗
但是限制了:1
2
3
4
5
6if 'f' in request.args:
try:
f = request.args['f']
if re.search(r'proc|random|zero|stdout|stderr', f):
abort(403)
elif '\x00' in f:
Linux中有一个叫做symlink method
也就是相当于一个快捷方式,但是却不同于Windows中的shortcut
而正好:/dev/fd
这个指向了/proc/self/fd
这样payload就不难理解了:/dev/fd/../environ
访问/dev/fd
就相当于访问了/proc/self
之后回退一次就可以找到environ
这个文件了
Linux中 /dev/fd/0
运行效果是这样的,相当于你输入啥它就会回答啥1
2
3
4
5 ✘ pxy@LAPTOP-UBIEP4K5 ~ sudo cat /dev/fd/0
a
a
pxy
pxy
接下来了解一下ln命令
- 软链接:英文
symbolic link
非常类似于Windows中的快捷方式 - 硬链接:英文
hard link
这类文件会拥有自己的inode节点和名称,其inode会指向文件内容所在的数据块emmm后面不是很懂了
建立软链接的方式:ln -s 源文件名称 软链接文件名称
目录和文件均可
现在当前目录下创建一个指向/proc/sys
的链接
然后我们就可以通过目录遍历来进入到其他的目录了。
软链接还会存在这个问题:
链接的重复定义
这样就不会出问题了,加个-n
选项