将字符串转换为命令

时间:2013-09-24 00:43:23

标签: python python-2.7 exploit

我正在尝试转换以获取执行的命令,该命令将传递给print语句。例如:

print "exec(raw_input())"

我可以以某种方式运行exec()吗?

6 个答案:

答案 0 :(得分:1)

这样做

command = raw_input("Command: ")
exec(command)

你为什么要打印它?如果这不是你想要的,那就更清楚了

答案 1 :(得分:0)

你要求的东西很简单吗

aString = "raw_input()"
print "exec(" + aString + ")"
exec(aString)

答案 2 :(得分:0)

from __future__ import print_function
def foo(x):
    exec x
print = foo
print("exec(raw_input())")

运行

% test.py
kaboom

结果:

NameError: name 'kaboom' is not defined

答案 3 :(得分:0)

从您应用的代码中,您似乎正在寻找一个魔术字符串,当Python将该字符串传递给print语句时,您可以运行任意代码。

没有这样的已知字符串。你可以尝试很长的字符串,只是在明显的边界上,寻找传统的堆栈和堆溢出情况,但如果你在Python X.Y.Z中找到它,很可能它已经在X.Y.Z + 1中修复了。

如果Python脚本实际上在您的字符串上执行execeval,那么这很容易被利用;如果只是做print,内容甚至都不会被编译,更不用说了;它们只是一根古老的字符串。字符串碰巧看起来像exec这样看似危险的东西是无关紧要的;它比利用Python打印字符串"rm -rf /"更具可利用性。

当然,如果您可以安排一个Python解释器的输出作为另一个解释器中的交互式会话的输入,那么无论您获得第一个要打印的解释器,都将在第二个解释器中执行...但是无论如何,你不需要字符串中间的exec

答案 4 :(得分:0)

默认情况下,print语句写入sys.stdout,而sys.stdout就像一个文件。您可以使用 write 方法创建一个看起来像文件的类,该方法将由 print 语句调用。我整理了一个演示这个的脚本print_exec.py。另请注意,如果print语句中的代码本身包含 print ,则不起作用。即,print "print 'foo'"将无效。所以,在这个例子中,我不得不打印到sys.stderr来实际看到发生的事情。希望这可以帮助。

print_exec.py

    import sys

    class file_like(object):
        def write(self, x):
            exec(x)

    sys.stdout = file_like()
    y = "exec(raw_input())"
    print "exec(y)"

运行print_exec.py:

的示例
    >python print_exec.py 
    print "import sys; print >> sys.stderr, 'hi'"    
    hi
    >

答案 5 :(得分:0)

我猜这就是你要找的东西?

>>> exec("x = raw_input()")
23
>>> x
'23'
>>>