很抱歉有一个非常宽泛的问题,但我们有一些问题,例如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注入执行的命令,该命令由<?php方法,位于REDACTED的第1行。
我还想知道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更改太多代码。
Checkmarx分析PHP代码的效果问题可能倾向于主观答案,并且您对该工具的看法可能会有偏差,因为您使用的方法(escapeshellcmd(未被识别为消毒剂,并且您查询的框架(Wordpress和Composer(在技术上不受支持。
公平地说,Checkmarx确实支持各种PHP框架,如Zend、Kohana、CakePHP、Symfony和Smarty,这些框架可能会导致较少的误报(注意:我不建议您切换平台(
任何静态分析器都需要it用户的帮助才能有效。我建议您从扫描中排除Composer文件。
你真的不必对代码进行更改,只需与你的AppSec团队争论这些发现是误报,因为prepare方法可以防止SQL注入攻击,而escapeshellcmd确实对字符串进行了编码。然而,我的建议是在$accesskey上使用escapeshellarg,而不是