0

很抱歉这个非常广泛的问题,但我们有一些问题,例如 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 更改太多代码。

4

1 回答 1

1

您对 Checkmarx 分析 PHP 代码的能力的问题可能倾向于主观回答,并且您对工具的看法可能会存在偏见,因为您使用的方法(escapeshellcmd)不被识别为消毒剂和您正在询问的框架(Wordpress 和Composer)在技术上不受支持。

公平地说,Checkmarx 确实支持各种 PHP 框架,例如 Zend、Kohana、CakePHP、Symfony 和 Smarty,这些框架可能以较少的误报告终(注意:我不建议您切换平台)

任何静态分析器都需要它的用户提供一些帮助才能使其有效。我建议您从扫描中排除 Composer 文件。

您实际上不必对代码进行更改,只需与您的 AppSec 团队争论这些发现是误报,因为 prepare 方法可以防止SQL 注入攻击,并且escapeshellcmd确实对字符串进行了编码。然而,我的建议是在 $accesskey 上使用escapeshellarg

于 2020-11-28T00:51:12.223 回答