前言
在nctf中遇到了一pydash的题目,是没见过的知识,所以写一篇文章复现分析一下。
2024-nctf
源码
|
|
分析
我们拿到附件的源码。可以看到这里有两个关键的路由/setValue
和/render
,既然是要分析原型链污染,那么我们就主要关注
|
|
这个调用,追溯一下。
|
|
大体作用就是传入一个对象obj,一个path属性名以及一个value值。就可以改掉obj对象中的path属性的值。示例如下:
|
|
运行效果:
根据源码中的提示,我们知道,flag在环境变量中,所以我们想读取flag可以通过读取/proc/self/environ
文件来读取flag。那么我们的思路就清晰了,在/render
路由中,调用了:
|
|
我们就可以通过修改渲染模板中的某个记录了模板路径的变量,来实现读取environ
文件。那么我们现在追溯一下这个template方法,寻找一下符合条件的变量。
|
|
我们关注这一行代码。
|
|
这里的作用是获取模板的渲染引擎,可以看到默认获取的是SimpleTemplate
,lookup
也就是模板的搜索路径,也就是TEMPLATE_PATH
这个变量,默认值为:['./', './views/']
,所以这里会从lookup所指示的目录中获取对应的模板文件,然后交给SimpleTemplate
去解析。
|
|
这里是一个切换通过模板渲染还是字符串渲染的判断逻辑,跟进解析器。由于传入的模板路径而不是字符串,所以这里会通过lookup这个参数去寻找对应目录下的模板文件,读取后再交给解析器解析。
其中name
就是我们传入的path
参数,假设我们传入的参数path=test
。获取到lookup的路径后,进入search
方法最后把name
拼接到所有的路径中并尝试读取模板文件。
当读取到文件内容后,就会交给prepare
|
|
这个方法的作用就是初始化模板的字符处理逻辑,支持 HTML 转义或直接输出原始 HTML,也就是解析这个传入的template变成html,然后回到template结尾。进入render方法。
|
|
继续追溯execute方法。
|
|
可以看到这里构建了env
环境,然后在exec
中调用了执行预编译的模板也就是self.co
,如果这里调用了rebase方法,就会递归的去调用父模板。之后会读取test
文件的内容,然后在render
中返回解析的内容。
到这里我们就分析完了整个利用链。整理一下:
|
|
利用
那么利用的思路就很简单了,我们希望读取environ文件,只需要通过set_
方法修改TEMPLATE_PATH
即可结合黑名单,payload如下:
|
|
但是pydash
不允许修改__globasl__
的属性,声明在helpers.py
文件中。
所以我们还要先污染一下RESTRICTED_KEYS
payload如下:
|
|
我们可以得到如下python脚本:
|
|