python字符串格式
python字符串的格式化输出有多种写法:
|
|
举一些例子:
|
|
更多具体使用方式的可以参照python手册
字符串格式化漏洞
如果我们控制了格式化输出字符串内容会有什么危害呢?我们发现{name}
这个东西为什么那么熟悉,其实是因为他和模板的格式一致的,那么我们自然而然联想到SSTI,SSTI的其他内容可以参考这里。以Django
为例:
|
|
很明显,如果我email
参数的值是:
|
|
实际上就是输出了request.user.password
如果存在这个内容,就会输出密码值,是非常危险的一件事情。
漏洞利用
如果我们想进一步利用这个漏洞,应该怎么做呢?假设能够获取的对象只有request.user
,如何去获取django的配置项等敏感信息。
Django自带的应用“admin”(也就是Django自带的后台)的models.py中导入了当前网站的配置文件
利用这一点和SSTI
的方式,找到admin
的model
,再通过这个model
获取settings
对象,进而获得敏感信息。
类似的payload如下:
|
|
f修饰符与任意代码执行
PEP 498中引入了新的字符串类型修饰符:f或F,用f修饰的字符串将可以执行代码
举几个简单的例子:
|
|
有一点像eval
函数,但是f字符串中是自动执行的。
但有一个问题就是python中没有将普通字符串转成f字符串的方法,所以实际使用时效果不明。