Python 模板引擎的注入问题分析
2019/7/13 23:18:25
本文主要是介绍Python 模板引擎的注入问题分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
这几年比较火的一个漏洞就是jinjia2之类的模板引擎的注入,通过注入模板引擎的一些特定的指令格式,比如 {{1+1}} 而返回了 2 得知漏洞存在。实际类似的问题在Python原生字符串中就存在,尤其是Python 3.6新增 f 字符串后,虽然利用还不明确,但是应该引起注意。
最原始的 %
userdata = {"user" : "jdoe", "password" : "secret" } passwd = raw_input("Password: ") if passwd != userdata["password"]: print ("Password " + passwd + " is wrong for user %(user)s") % userdata
如果用户输入 %(password)s 那就可以获取用户的真实密码了。
format方法相关
https://docs.python.org/3/library/functions.html#format
除了上面的payload改写为 print ("Password " + passwd + " is wrong for user {user}").format(**userdata) 之外,还可以
>>> import os >>> '{0.system}'.format(os) '<built-in function system>'
会先把 0 替换为 format 中的参数,然后继续获取相关的属性。
但是貌似只能获取属性,不能执行方法?但是也可以获取一些敏感信息了。
例子: http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/
CONFIG = { 'SECRET_KEY': 'super secret key' } class Event(object): def __init__(self, id, level, message): self.id = id self.level = level self.message = message def format_event(format_string, event): return format_string.format(event=event)
如果 format_string 为 {event.__init__.__globals__[CONFIG][SECRET_KEY]} 就可以泄露敏感信息。
Python 3.6中的 f 字符串
这个字符串非常厉害,和Javascript ES6中的模板字符串类似,有了获取当前context下变量的能力。
https://docs.python.org/3/reference/lexical_analysis.html#f-strings
>>> a = "Hello" >>> b = f"{a} World" >>> b 'Hello World'
而且不仅仅限制为属性了,代码可以执行了。
>>> import os >>> f"{os.system('ls')}" bin etc lib media proc run srv tmp var dev home linuxrc mnt root sbin sys usr '0' >>> f"{(lambda x: x - 10)(100)}" '90'
但是貌似 没有 把一个普通字符串转换为 f 字符串的方法,也就是说用户很可能无法控制一个 f 字符串,可能无法利用,还需要继续查一下。
这篇关于Python 模板引擎的注入问题分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-08有遇到过吗?同样的规则 Excel 中 比Python 结果大
- 2024-03-30开始python成长之路
- 2024-03-29python optparse
- 2024-03-29python map 函数
- 2024-03-20invalid format specifier python
- 2024-03-18pool.map python
- 2024-03-18threads in python
- 2024-03-14python Ai 应用开发基础训练,字符串,字典,文件
- 2024-03-13id3 algorithm python
- 2024-03-13sum array elements python