前言
这个漏洞跟SSTI有点像,但是又有点不一样,之前一直以为就是ssti来着(
基础
python3中的格式化字符串主要有以下两种形式:
"test %s" % ('test')
"test {0}".format('test')
这两个语句的输出都是test test
虽然效果一样,但是在python web的开发中一般认为前者比后者要安全,因为后者可能会因为自身支持的一些特殊用法导致配置信息等的泄露
format基本用法
"I am {1},he is {0}".format("a","b")
大括号{}
中的数字代表了format的变量顺序
"I am {MyName},he is {HisName}".format(MyName="aa",HisName="bb")
这种语句可以在format函数的参数通过key来赋值
"I am {},he is {}".format("a","b")
这样的用法会让大括号与format的参数一一对应
当大括号与format的参数不能一一对应的时候便会报错
漏洞
"first {0[1]}, second {0}".format(['a','b'])
当format函数的参数是一个列表时,可以通过用方括号添加索引的方式来获取列表的值
我们知道,字符串本身也存在着内置属性
这种用法也可以用来输出对应的属性
print("{0.__class__}".format('a'))
利用
前面也说过python的格式化字符串的利用与沙盒逃逸或者python SSTI很相似,
但format与后两者的区别在于它只能读取属性而不能执行方法
因此,我们一般可以利用这个漏洞读取环境变量获取一些有用的信息
{0.__class__.__init__.__globals__}