gpt4 book ai didi

perl - IPC::System::Simple capturex 是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 23:27:23 25 4
gpt4 key购买 nike

documentation capurex 声明函数从不调用 shell

我的假设:由于没有调用 shell,像 *; 这样的字符不会被解释,因此不会造成伤害。这就是为什么对外部程序的调用不会(或不太)容易受到意外错误输入或预期注入(inject)攻击的影响,如下例所示(对于德语输出消息感到抱歉):

use v5.26;
use IPC::System::Simple 'capturex';

# (very) vulnerable to shell injection
say `ls @ARGV`;

# just a visual line
say '----------';

# no shell injection "possible" (?)
say capturex('ls', @ARGV);

输出:

user@host:-$ perl shell-injection.pl -1 \*.pl \; hostname
shell-injection.pl
host

----------
ls: Zugriff auf '*.pl' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf ';' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'hostname' nicht möglich: Datei oder Verzeichnis nicht gefunden
"ls" unexpectedly returned exit value 2 at shell-injection.pl line 11.
user@host:-$

我的问题:

  1. 可以用什么术语来描述,代码是如何用capturex执行的?其他语言或环境中使用的示例/技术/术语是什么? (例如系统调用?)

  2. 实际上是否建议在不检查输入的情况下使用这种技术(我假设不是),如果不是,出于什么原因(攻击向量)?

最佳答案

了解capturex 运作方式的最佳方式是查看its source。 .

子程序以“列表形式”实现自己的管道打开,以解决(古老的!)v5.6.x 限制。它是通过 fork-ing 使用 piped open 的进程,然后“手动”exec-ing 在子进程中执行命令来实现的使用列表形式。然后在父级中读取输出。按照 open 中的“管道”一词页面,然后链接到 perlipc .

所以从 exec 开始就不会涉及到 shell LIST 形式中使用 execvp(3) 系统调用直接运行命令。 (如果它不包含 shell 元字符,那么当它使用单个参数运行时可能会发生什么。)因此,在 shell 中(将)具有特殊含义的字符可以在命令中自由地用作文字字符。

至于第二个问题——如果命令是由用户输入形成的,则必须始终仔细检查真的!请注意,不应在命令中按字面意思使用输入,而应支持程序构成命令的关键字和参数。避免使用 shell 当然会有所帮助,但必须检查任何用户输入。

注入(inject)错误更多的是编程错误,即变量插值没有正确使用并导致意外命令;那里不需要恶意行为,只需要暴露错误的“正确”输入。

关于perl - IPC::System::Simple capturex 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61019946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com