目录

  1. 1. 前言
  2. 2. 基础
    1. 2.1. format基本用法
    2. 2.2. 漏洞
  3. 3. 利用

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

python 格式化字符串漏洞

2023/7/30 Web python
  |     |   总文章阅读量:

前言

这个漏洞跟SSTI有点像,但是又有点不一样,之前一直以为就是ssti来着(

参考合天网安实验室的文章

基础

python3中的格式化字符串主要有以下两种形式:

"test %s" % ('test')
"test {0}".format('test')

这两个语句的输出都是test test

image-20230730173024522

虽然效果一样,但是在python web的开发中一般认为前者比后者要安全,因为后者可能会因为自身支持的一些特殊用法导致配置信息等的泄露

format基本用法

"I am {1},he is {0}".format("a","b")

大括号{}中的数字代表了format的变量顺序

image-20230730173115253

"I am {MyName},he is {HisName}".format(MyName="aa",HisName="bb")

这种语句可以在format函数的参数通过key来赋值

image-20230730173136386

"I am {},he is {}".format("a","b")

这样的用法会让大括号与format的参数一一对应

当大括号与format的参数不能一一对应的时候便会报错

image-20230730174217672

漏洞

"first {0[1]}, second {0}".format(['a','b'])

当format函数的参数是一个列表时,可以通过用方括号添加索引的方式来获取列表的值

image-20230730174507725

我们知道,字符串本身也存在着内置属性

这种用法也可以用来输出对应的属性

print("{0.__class__}".format('a'))

image-20230730174926234


利用

前面也说过python的格式化字符串的利用与沙盒逃逸或者python SSTI很相似,

但format与后两者的区别在于它只能读取属性而不能执行方法

因此,我们一般可以利用这个漏洞读取环境变量获取一些有用的信息

{0.__class__.__init__.__globals__}