攻防世界Web_python_template_injection
题目:

就一句话啥也没有。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的更多相关文章
- 攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup
攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup 题目介绍 题目考点 SSTI模板注入漏洞 Writeup 知识补充 模板注入:模板引 ...
- CTF--web 攻防世界web题 robots backup
攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...
- CTF--web 攻防世界web题 get_post
攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...
- 攻防世界 web进阶练习 NewsCenter
攻防世界 web进阶练习 NewsCenter 题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...
- 【攻防世界】高手进阶 pwn200 WP
题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...
- XCTF攻防世界Web之WriteUp
XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...
- 攻防世界 | CAT
来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...
- 攻防世界 robots题
来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...
- 【攻防世界】 高手进阶区 Recho WP
0x00 考察点 考察点有三个: ROP链构造 Got表劫持 pwntools的shutdown功能 0x01 程序分析 上来三板斧 file一下 checksec --file XXX chmod ...
随机推荐
- docker创建mysql容器时挂载文件路径后无法启动(已解决)
系统centos7 docker版本: 解决方法: 在docker run中加入 --privileged=true 给容器加上特定权限,如下 docker run --privileged=tru ...
- 【Java】IntelliJ IDEA 快捷键
IntelliJ IDEA 快捷键 1. Editing(编辑) 快捷键 介绍 Ctrl +Space 基本代码补全,输入字母按后列出匹配的词组 Ctrl+Shift+Space 智能代码补全,列出与 ...
- Android官方文档翻译 六 1.4Starting Another Activity
Starting Another Activity 开启另一个Activity This lesson teaches you to 这节课教给你: Respond to the Send Butto ...
- 【摘抄】疑问chatterbot
ChatterBot使用哪种机器学习? -------------------------------------------------- - 简而言之,ChatterBot使用了许多不同的机器学 ...
- VS IDE之xml过大报错
语料处理时遇到这个错误 在命令行中输入 $vsWherePath = Join-Path ${env:ProgramFiles(x86)} "Microsoft Visual Studio\ ...
- 使用Outlook欺骗性云附件进行网络钓鱼
滥用Microsoft365 Outlook 云附件的方式发送恶意文件,使恶意可执行云附件规避云查杀检测 介绍 在本文中,我们将探讨如何滥用 O365 上的云附件功能使可执行文件(或任何其他文件类型) ...
- python3 requests的content和text方法
text返回的是Unicode型的数据 content返回的是是二进制的数据. 也就是说,如果你想取文本,可以通过r.text. 如果想取图片,文件,则可以通过r.content >>&g ...
- Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization
目录 Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization 1.Abstract 2.Intr ...
- .NET 诞生已20周年,您的 .NET 技能是否还停留在2010 年?
20年来,我们见证了超过上千万.NET 开发员,当前有600万.NET 开发者正在使用.NET技术构建各类解决方案.今天,IT市场对.NET 开发人员的需求达到了前所未有的程度,特别是在中国,各大公司 ...
- Spring @Cacheable 缓存不生效的问题
最近在项目中使用了Ehcache缓存,使用方式是用Spring提供的 @Cacheable 注解的方式,这种方式简单.快速.方便,推荐使用. 在使用的过程中,遇到了缓存不生效的情况,经过分析处理,总结 ...