很抱歉这个非常广泛的问题,但我们有一些问题,例如 Checkmarx 抱怨代码注入如下
$accesskey = $_GET['accesskey'] ?? $argv[1] ?? null;
if (!$accesskey || !ctype_alnum($accesskey)) {
throw new RuntimeException(sprintf('Passed accesskey "%s" is invalid', $accesskey));
}
$commandParts = ['echo', $accesskey]
$commandParts = array_map('escapeshellarg', $commandParts);
$command = implode(' ', $commandParts);
$command = escapeshellcmd($command);
system($command);
我认为命令被转义了,一切都很好,但为什么 Checkmarx 的想法不同?
应用程序的 <?php 方法在 REDACTED 的第 1 行调用带有系统的 OS(shell)命令,使用不受信任的字符串和要执行的命令。
这可能允许攻击者注入任意命令,并启用命令注入攻击。
攻击者可能能够通过用户输入 _GET 注入执行的命令,该命令由应用程序在 REDACTED 的第 1 行的 <?php 方法中检索。
我还想知道 Checkmarx 是否以及如何能够理解通过 Composer 安装的库或框架代码?例如
Assert::oneOf($unsafeUserInput, ['foo', 'bar']); // throws an Exception if $unsafeUserInput is not 'foo' or 'bar'
// $unsafeUserInput is now safe
或 WP 相关的东西,这些东西也经常被错误地标记为容易发生 SQL 注入
global $wpdb;
$foo = $wpdb->getVar($wpdb->prepare('SELECT foo FROM bar WHERE baz = %s', $_GET['baz'] ?? ''));
如果它检查消毒方法,是否有特定的方法?老实说,我想避免为 Checkmarx 更改太多代码。