大约
命令注入攻击的目的是在易受攻击的应用程序中注入和执行攻击者指定的命令。 在这种情况下,执行不需要的系统命令的应用程序就像一个伪系统外壳,攻击者可能会使用它 作为任何授权的系统用户。但是,命令的执行权限和环境与 Web 服务具有的权限和环境相同。
在大多数情况下,命令注入攻击是可能的,因为缺乏正确的输入数据验证,攻击者可以操纵 (表单、cookie、HTTP 标头等)。
操作系统 (OS) (如 Linux 和 Windows)之间的语法和命令可能有所不同,具体取决于它们所需的操作。
这种攻击也可以称为“远程命令执行(RCE)”。
目的
远程查找操作系统上 Web 服务的用户,以及通过 RCE 的计算机主机名。
低水平
这允许直接输入到将在操作系统上执行命令的许多PHP函数之一。可以逃出设计的命令,并且 执行了无意的操作。
这可以通过在请求中添加“命令成功执行后,运行此命令”来完成。
Spoiler: To add a command "&&". Example: 127.0.0.1 && dir.
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
用户提供的IP地址执行ping命令,然后将结果输出到Web页面上以便用户查看。
同样地,该代码存在安全风险,因为它没有经过输入验证和过滤,可能会导致命令注入攻击。同时,它也没有任何限制来确保只对ping命令进行操作,并且没有限制ping命令执行的路径和参数。
为了增强代码的安全性,我们需要做以下一些事情:
1.输入过滤和验证。我们应该验证输入值的格式和范围,并确保它是一个有效的IP地址,以减少输入注入的机会。
2.限制执行命令的特权。我们应该最小化Web服务器的特权,使用非特权用户来运行Web服务器,并且最好通过使用suEXEC或sudo来限制shell的特权。
3.限制执行命令的范围。同样,我们应该限制所执行命令的路径和参数,以确保它仅执行ping命令,而不是其他命令。
应用这些最佳实践可以大大减少Web应用程序所受到的风险,并帮助保护您的Web应用程序免受安全漏洞和攻击的影响。
发现命令不仅执行了ping,而且显示了目录下的文件。
中级
开发人员已经阅读了命令注入的一些问题,并放置了各种模式修补来过滤输入。然而,这还不够。
可以使用各种其他系统语法来中断所需的命令。
Spoiler: e.g. background the ping command.
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Set blacklist
$substitutions = array(
'&&' => '',
';' => '',
);
// Remove any of the characters in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
在这个更新后的代码中,我们添加了一些新的安全措施,以使ping命令更加安全。
首先,我们使用一个黑名单数组来过滤不安全的输入,例如"&&"和";"等字符,这些字符可能会导致命令注入攻击。我们使用 str_replace() 函数来替换任何黑名单中的字符。
然后,我们再次执行ping命令,但这次我们只对经过过滤的输入执行操作,这样就可以确保不会执行恶意或不必要的命令。
这些改进可以大大提高代码的安全性,使其更加安全可靠。但是,仍然有些潜在的安全风险没有解决,例如我们仍然没有对输入进行足够的验证和过滤。因此,我们应该始终使用最佳安全实践来保护我们的Web应用程序免受攻击的影响。
这次未显示目录下文件,而是输出了ip错误
高水平
在高级别中,开发人员回到绘图板并输入更多模式来匹配。但即使这样也不够。
开发人员要么对过滤器做了一个小的拼写错误,并相信某个PHP命令将使他们免于这个错误。
Spoiler: trim() removes all leading & trailing spaces, right?.
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = trim($_REQUEST[ 'ip' ]);
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// Remove any of the characters in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
在这里,我们又一次对代码进行了改进,进一步强化了安全性。我们添加了更多的字符到黑名单集合中,如"|"、"-"、"$" 等,以避免由于输入注入攻击而导致问题。我们还使用了 trim() 函数来删除用户输入中可能存在的空格和换行符,以避免意外输出。
虽然这些改进可以极大地提高代码的安全性,但是仍然需要更多的工作来确保代码在使用上是安全的。建议你继续遵循最佳实践,如使用过滤和验证来限制输入,限制代码所执行命令的范围,以及最小化Web服务器的特权等。
不可能的水平
在不可能的关卡中,挑战被重写,只允许非常严格的输入。如果这不匹配并且不产生特定结果, 将不允许执行。这不是“黑名单”过滤(允许任何输入并删除不需要的),而是使用“白名单”(仅允许某些值)。
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );
// Split the IP into 4 octects
$octet = explode( ".", $target );
// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
else {
// Ops. Let the user name theres a mistake
echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
在这个更新后的代码中,我们进一步增强了安全性,并增加了反跨站点请求伪造(CSRF)保护措施。具体而言,该代码中增加了以下改进:
1. 添加了一个名为 "checkToken()" 的函数,用于检查反CSRF令牌以确保请求是由该网站上某个页面的正常表单提交而不是篡改请求信息的攻击者发出的。这个函数需要在每个需要进行保护的表单处理程序中调用,例如这里的 ping 命令处理程序。
2. 添加了一个会话令牌,可以避免CSRF攻击。每次在页面上加载时都会生成一个会话令牌,并将其存储在会话变量中。在处理提交的表单时,该会话令牌将与表单提交的CSRF令牌进行比较,以验证请求的合法性。
3. 添加了对用户输入的IP地址的验证和过滤,以确保只有有效的IP地址才能被用于执行ping命令。
这些改进可以极大地提高代码的安全性,使其更加可靠。但是,请注意,这只是最佳实践之一,您还应该根据特定的使用情况来评估可能存在的风险,并采取适当的安全措施来保护您的Web应用程序。
在这种模式下,只能识别ip地址。