Python2中input()函数漏洞
函数简介
input()函数是python中的内置函数,函数作用是从stdin中读取数据
input() 与 raw_input() 区别
python2 两个常见输入函数:input 和 raw_input 。
raw_input() 会将输入的内容转换为字符串:
1 | #!/usr/bin/env python |
input() 能自动识别出输入的类型,将输入内容转换为对应类型(str、int、float)。这里我们先尝试输入正常无误的例子,注意字符串的输入方式:
1 | #!/usr/bin/env python |
input() 产生漏洞原因
函数会将 stdin 输入的内容当做是 python2 代码去执行,看两个例子:
```python
a = raw_input()
b = input()
print “raw_input:”+a
print “input:”+b
‘’’
$ python 1.py
3+2
3+2
raw_input:%d 3+2
input:%d 5
‘’’1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
input 输入的内容被当做是 python 代码去执行了。
2. ```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
ans = 10
a = raw_input()
if a == ans:
print "raw_input"
b = input()
if b == ans:
print "input"
'''
$ python 1.py
ans
ans
input
'''input 输入 ans 直接读取了 ans 的值到 b 当中,实际效果等同于
b = ans
。在这里也知道了为什么用 input() 输入字符串时,要加上引号,如果我们不加上,很可能被当做是变量名,结果就如同例子 2 。
利用方式
- 如果 python 脚本本身就有引入 os 库,输入 payload 直接 getshell:
1 | os.system('/bin/sh') |
- 如果 python 脚本没有引入 os 库,payload 如下:
1 | __import__('os').system('/bin/sh') |
修复方法
python2 中避免使用 input() 函数,使用 raw_input() 代替,如果需要 int 可以这样:int(raw_input())
。
python3 中 input() 输入默认转换为字符型,raw_input() 被去除。
参考文章
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SkYe231 Blog!