python格式化字符串漏洞_python格式化字符串研究

原创 Ash 合天智汇

前言

前两天与队友交流时提及python的格式化字符串漏洞,这个漏洞之前接触不多,所以写篇文章从基础部分仔细研究了研究。python环境是python3.7。

Python3里的格式化字符串

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

"test %s" % ('test')

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

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

首先,format形式的格式化字符串基本用法如下:

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

这个语句的输出是I am b,he is a,大括号{}中的数字代表了format的变量顺序。

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

这个语句的输出是I am aa,he is bb,这种语句可以在format函数的参数通过key来赋值。

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

这个语句的输出是I am a,he is b,这样的用法会让大括号与format的参数一一对应。

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

"I am {0},he is also {0}".format('a')

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

前者会输出I am a,he is also a,而后者会报错tuple index out of range。

这些format函数的基本用法并不是导致格式化字符串漏洞的根源,查看下列代码:

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

输出为first b, second ['a', 'b'],可见当format函数的参数是一个列表时,可以通过用方括号添加索引的方式来获取列表的值。同样的,这种用法也可以用在类的属性上,比如以下代码会输出字符串a的内置属性__class__:

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

输出结果是

一般利用

python的格式化字符串的利用与沙盒逃逸或者python SSTI很相似,但format与后两者的区别在于它只能读取属性而不能执行方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值