Logo WP

菜狗工具

工具1#

学长提醒 SSTI 注入,可以直接执行shell命令,cat就出来了

工具2#

hint1: not_flag 里的内容不是考点!

hint2: poster.jpg 观察并思考

![[image-20240425114907488.jpeg]]

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

On This Page