使用subprocess的Python漏洞利用
我有一个小程序(程序A),它会要求输入密码,如果密码正确,就会打开一个命令行界面。我想用Python写另一个程序(程序B),让它调用程序A,并把密码作为输入,这样就能打开命令行界面。
我现在做的是这样,但程序直接结束了,没有让我使用命令行界面。
p = subprocess.Popen("./ProgramA", stdin=subprocess.PIPE)
p.communicate("password")
当我运行程序B时,我的终端显示如下:
~/Desktop/$./ProgramB
Password: Here is your shell.
~/Desktop/$ (this is not the shell opened by program A)
我该怎么解决这个问题呢?
3 个回答
0
假设你在使用Linux或Mac电脑,程序的运行方式通常会有所不同,如果输入是通过管道而不是直接从终端输入的话。很多程序会“绕过”标准输入,直接从终端读取密码。在你的情况中,程序可能没有检测到终端,所以就退出了。你可以试试使用Python的pexpect模块,或者查看它的源代码,了解如何为标准输入打开一个伪终端。
0
Popen.communicate()
这个方法会关闭子进程的输入(也就是 stdin
),然后等这个子进程结束,这是正常的行为。你需要做的很简单,就是用 p.stdin.write("password")
来写入密码。
0
由ProgramA
启动的这个命令行界面(shell)会从它的父进程那里继承标准输入(stdin),也就是继承了一个管道。这个管道在那时已经关闭了,所以命令行界面就退出了。
你可能想要把终端作为标准输入,但这样的话就很难模拟输入密码了。