- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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:-$
我的问题:
可以用什么术语来描述,代码是如何用capturex
执行的?其他语言或环境中使用的示例/技术/术语是什么? (例如系统调用
?)
实际上是否建议在不检查输入的情况下使用这种技术(我假设不是),如果不是,出于什么原因(攻击向量)?
最佳答案
了解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/
documentation capurex 声明函数从不调用 shell。 我的假设:由于没有调用 shell,像 * 或 ; 这样的字符不会被解释,因此不会造成伤害。这就是为什么对外部程序的调用不会
我是一名优秀的程序员,十分优秀!