菜狗工具
工具1#
学长提醒 SSTI 注入,可以直接执行shell命令,cat就出来了
工具2#
hint1: not_flag 里的内容不是考点!
hint2: poster.jpg 观察并思考
![[image-20240425114907488.jpeg]]
cat not_flag
显示CHROOT JAIL
,出题人表示不是考点- 尝试
__globals__['flag']
和__globals__.get('flag')
- 找到拿到其他模块的
__builtins__
的办法,然后黑名单问题解决了 - 整半天没整出来,尝试一些shell命令,比如
find
,失败 - 歪个路,尝试
from importlib import reload
,没啥用 - 尝试获取python源码,
get_source
失败 - 开始查看字节码
dis.dis(module_name, file=i)
,获取到./app.py
的字节码,找不到flag,本地调试之后,发现全局变量并不会直接到字节码中(后续:直接这样传入并不会给出完全的字节码) - 发现重新把整个文件导入,然后
compile
编译(成Code Object
)再dis.dis
,就有全局变量了,所以得想办法找到整个文件的Code Object
- 找到
StackOverflow
的资料,直接dis.dis
出来的字节码是不包含最外层的代码的,要用frame.f_back
逐层返回,直到最顶层 - 通过遍历
frame.f_back
,可以打印出堆栈,发现最顶层的是threading
,说明不是主线程 - 打印出主线程
threading.enumerate()[0]
,然后按照StackOverflow
给出的frame = sys._current_frames().get(main_thread.ident, None)
就可以获取到主线程的frame
- 主线程最顶层的
frame
就是./app.py
,此时dis.dis
就可以拿到frame