当前位置:科技动态 > python SSTI Tornado render模板注入

python SSTI Tornado render模板注入

  • 发布:2023-10-01 20:26

原理
tornado render是python中的一个渲染函数,它是一个模板。通过调用不同的参数生成不同的网页。如果用户控制了render内容,不仅可以注入XSS代码,还可以通过{{}}传递变量并执行简单的表达式。
一个简单的理解示例如下:
------------------------------------ ------ -------------------------------------------------------- ------
导入tornado.ioloop
导入tornado.web

类MainHandler(tornado.web.RequestHandler):
def get(self):
self. render('index.html')
class LoginHandler(BaseHandler):
def get(self):
'''
当用户登录时,我们必须向他写入一个 cookie,但如果不写在这里,又写在哪里呢?
在哪里?我之前写的Handlers都继承了RequestHandler。这次继承了BaseHandler,写了自己的Handler
继承自己的类,给类添加扩展initialize!这里我们可以在这里做 获取用户cookie或者写入cookie都可以在这里做
'' '
' '
我们知道Loginhandler对象是Self,我们可以self.set_cookie()吗,我们可以self .get_cookie ()




'' # # # # SELF.SET_ COOKIE ()
# SELF.GET_COOKIE ()
自己。登录(请求):
#获取用户输入
login_form = AccountForm.LoginForm(www.sychzs.cn)
if request.method == 'POST':
#判断用户输入是否合法
if login_www.sychzs.cn_valid():#如果用户输入是legalM username = request.post.get('username')
password = request.post.get('password')
if models.userinfo.gets.get(username = userna me) 和模型。用户信息。 objects.get(用户名=用户名).password == 密码:
         else:
                                                                                                                                             请求,'account/login.html',{'model': login_form,'backend_autherror':'用户名或密码不正确'} )
                                                          return render(request,'account/login.html',{'model': login_form,'errors':error_msg})
# 如果登录成功,写入session并跳转到index
return render(request, 'account/login.html', {'model': login_form}
---------------------------------------- -------------------------------------------------------- ---从上面可以看出:render是一个模板式的东西。可以使用不同的参数来访问网页
在Tornado模板中,有一些快速的对象可以访问,比如{{escape(handler.Settingsings["cookie"])}}

你可能有看到这两个 {{}} 和这个字典对象。是的,就是这个handler.settings对象
handler指向RequestHandler

而RequestHandler.settings又指向self.application.settings

所有的handler.settings都指向RequestHandler.application.settings!

也就是说,这里是我们的环境变量,就是我们获取cookie_secret的地方

看问题的错误页面


可见页面返回的值是由msg的值决定的。修改msg的值,形成注入,获取环境变量
?msg={{handler.settings}}(见上面灰色高亮部分)
页面回显环境变量
{'autoreload': True, 'compiled_template_cache': False, 'cookie_secret': 'M)Z.>}{O]lYIp(oW7$dc132uDaKget cookie_秘密

相关文章