攻防世界 Web_python_template_injection

时间:2024-03-19 09:58:38

前言

这是一道关于python的flask模板注入的题目,刚碰到这个题目的时候我对于flask和模板注入是没有接触过的,因此上网查找相关知识并结合攻防世界给出的WP做出了这个题目。

做题前知识点的了解

https://xz.aliyun.com/t/3679
这篇博客对于我这样的萌新来说非常友好,对于flask的ssti模板注入讲解的很好,推荐一看。看完这个,就对flask的模板注入有了一个大致的了解,但是对于如何应用可能有些迷茫,下面结合攻防世界的这个题目来更加深入的了解。

WP

作为一个萌新,刚打开这个题目的时候是很蒙蔽的,我用dirsearch扫,f12看源码,用burp抓包甚至试了index.phps这个知识点去希望弄源码。但是这些都是没用的,主要是我刚看完上述的博客,对于模板注入陷入了一种需要知道源码才能注入的误区,另一个误区是我以为需要get把注入点传递进去,但是get传递的参数并不知道,例如/?id=1这样的,为此我甚至进行了SQL注入的一些操作,事实证明这些都是不对的。直接在后面写{{内容}}就可以了,比如http://220.249.52.133:53187/%7B%7B%22%22.class%7D%7D

至于为什么知道这样注入呢,就和SQL注入一样,一开始要看看是否有注入点。
我们注入{{7*7}},发现服务器返回URL http://220.249.52.133:53187/49 not found,看到49,说明我们注入的7*7确实被执行了,说明存在注入点。

之后便是按照我最开始推荐的博客里面的内容,进行注入。不过那里没提到的是下面的内容:
首先,题目告诉我们这是一个 python 注入问题,那么脚本肯定也是 python 的,思考怎样用 python 语句获取控制台权限:想到了 os.systemos.popen (参考资料), 这两句前者返回 退出状态码 , 后者 以 file 形式 返回 输出内容, 我们想要的是内容,所所以选择 os.popen

而我们想要的 os 所在的 site._Printer 类,它在列表的第七十二位,即 __subclasses__()[71]。那么直接进去最后的步骤,找到这个类,通过__subclasses__([71].__init__.__globals__['os'].popen('命令行语句').read()调用服务器的控制台 并显示 ,这下我们就可以随便用控制台输出了。例如这样:
{{"".__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen("ls").read()}}就可以执行ls命令,这样可以执行shell命令,就没有什么难得了,找到flag在哪然后通过cat命令获取就可以了。

最后附上一些很常用的注入语句
攻防世界 Web_python_template_injection

第三个是对文件进行读取,__subclasses__()[40]找到的是<type ‘file’>。