high难度的命令注入主要利用了黑名单验证的方式来达到一个过滤的效果。
源码分析
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = trim($_REQUEST[ 'ip' ]);
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// Remove any of the charactars 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>";
}
?>
当 $_POST['Submit']
被调用时,变量 $target
将被设置为用户输入的 IP 地址。
if( isset( $_POST[ 'Submit' ] ) ) {
$target = trim($_REQUEST[ 'ip' ]);
……
从用户输入中移除特殊字符,例如 '&'
、';'
、'|'
、'-'
、'$'
、 '('
、 ')'
、 和 '||'
。
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
存在漏洞:
High难度的命令注入漏洞源代码中曾加了替换特殊字符的数量,但我们仍能从中找到黑名单以外的字符来实现命令注入。
漏洞利用:
不难发现特殊符号没有对 '|'(无空格) 进行替换,在输入框输入 ip地址|系统命令 并执行,便可轻松获取想获取的系统信息,例如:
trim函数
这个函数主要用于删除字符串首尾的空白字符或者其他特殊字符。例如,如果你有一个字符串 " hello world ", 并且你想去掉两边的空格,你可以使用 trim()
如下所示:
php
$string = " hello world ";
echo trim($string); // 输出:hello world
str_replace函数
这个函数用于查找字符串中的某一部分并替换为新的内容。例如,如果你想把字符串 "Hello World" 中的 "World" 替换为 "Universe",你可以这样做:
php
$string = "Hello World";
$newString = str_replace("World", "Universe", $string);
echo $newString; // 输出:Hello Universe
array_keys函数
- 这个函数用于从关联数组中提取所有的键名,并返回一个新的数组。例如:
php
$array = array("a" => 1, "b" => 2, "c" => 3);
$keys = array_keys($array);
print_r($keys); // 输出:Array ( [0] => a [1] => b [2] => c )
stristr函数
这个函数用于查找字符串中是否存在指定的子串,并返回从匹配点开始到结束的部分。与 strstr
不同的是,stristr
是不区分大小写的。例如:
php
$string = "Hello World!";
if (stristr($string, "world")) {
echo "找到 'world' 子串!";
} else {
echo "未找到 'world' 子串。";
}
php_uname函数
- 这个函数用于获取关于运行 PHP 的服务器的操作系统信息。例如:
php
echo php_uname();