为什么将 exec() 函数推入 input() 时会出现 SytaxError

Why there is a SytaxError when pushing an exec() function into an input()

有一个 netcat CTF 任务需要通过 RCE 获取标志(对我来说最简单和明显的变体是 exec()

Python 2.7.18 (default, Apr 28 2021, 17:39:59)
[GCC 10.2.1 20210110] on linux2

>>> print input()
pow(2, 3) # No problems with functions
8

>>> print input()
None # Can print None values
None

>>> print input()
eval('1 + 1')
2

>>> print input()
eval('1 + 1') # eval() works
2

>>> x = 1
>>> print input()
eval('x + 1') # eval() with local variables involved also works
2

>>> print input()
exec('') # Even empty exec() causes an error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    exec('') # Even empty exec() causes an error
       ^
SyntaxError: invalid syntax

>>> print input()
exec('import os') # exec() call causes an error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    exec('import os') # exec() call causes an error
       ^
SyntaxError: invalid syntax

是否可以在 Python 2.7 中使用 input() 推送 exec()? (无法切换 Python 版本或更改可执行文件 print input()

UPD

我需要这样的东西:

>>> print input()
exec('import os\nprint os.name') # I need a similar RCE in this CTF task, so eval() is not suitable
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    exec('import os\nprint os.name') # I need a similar RCE in this CTF task, so eval() is not suitable
       ^
SyntaxError: invalid syntax

而不是

>>> print input()
exec('1 + 1') 

>>> print input()
eval('1 + 1') 

你会得到你期望的输出2exec() 需要可执行语句; eval() 需要一个表达式,这就是 1+1 是什么。尽管这更简单且等效:

>>> print input()
1 + 1 

我必须承认我不知道什么是 CTF 任务,也不知道为什么它需要执行 RTE 代码,无论如何,但考虑到您的真正要求不是产生 1 + 1 的结果,而是而不是 os.name 的值,它可能更适合您的目的,以避免在过时的 input() 函数的极端情况下进行 futzing,而只是作为命令行

python -c "import os;print(os.name)"

哪个(在我的系统上)产生输出

nt

并且将适用于 Python 的每个版本。

Python 2 input() 函数不能做你想做的事情的原因是 Python 2

  • exec 是语句,不是函数。
  • input() 大致等同于 eval(raw_input()):它将接受表达式但不接受语句。