函数简介

input()函数是python中的内置函数,函数作用是从stdin中读取数据

input() 与 raw_input() 区别

python2 两个常见输入函数:input 和 raw_input 。

raw_input() 会将输入的内容转换为字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
# -*- coding: utf-8 -*-
a1 = raw_input("字符串:")
print type(a1)

a2 = raw_input("数字:")
print type(a2)

a3 = raw_input("变量名:")
print type(a3)

'''
$ python 1.py
字符串:skye
<type 'str'>
数字:2311
<type 'str'>
变量名:a3
<type 'str'>
'''

input() 能自动识别出输入的类型,将输入内容转换为对应类型(str、int、float)。这里我们先尝试输入正常无误的例子,注意字符串的输入方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env python
# -*- coding: utf-8 -*-
a1 = input("字符串:")
print type(a1)

a2 = input("数字:")
print type(a2)
'''
$ python 1.py
字符串:"skye"
<type 'str'>
数字:2311
<type 'int'>
'''

input() 产生漏洞原因

函数会将 stdin 输入的内容当做是 python2 代码去执行,看两个例子:

  1. ```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() 被去除。

参考文章