环境搭建:
环境系统 | Windows |
靶场 | dvwa靶场 |
命令执行漏洞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>";
}
?>
运行原理
1.通过post方式上传一个参数(如果不是post参数则不执行)
2.利用trim()函数,删除上传命令首尾的空白字符和预定义字符,然后再将$target。(过滤预定义字符:括号、引号、运算符等)
3.创建一个数组
4.利用array_keys将原数组的key(键名)生成一个新的数组
5.利用str_replace()函数将查看上传的数据有没有array_keys生成的新数组值(如果有则将数据中与新数组值一样的值替换成原数组的vale值.(过滤)
6.利用php_uname()函数获取主机信息
7.利用stristr()函数对上传的数据进行搜索,判断数据中有没有'Windows NT',如果有是Windows输出,否则是nix输出.
重点函数使用
- trim
trim()
是 PHP 中的一个函数,用于删除字符串首尾处的空白字符或其他预定义字符。 这个函数接受两个参数:第一个参数是要修剪的字符串,第二个参数是一个可选的字符串,指定要删除的字符。如果没有提供第二个参数,那么trim()
将默认删除字符串两端的空白字符(空格、制表符、换行符等)。 下面是一个使用trim()
函数的例子:$text = " Hello, world! "; echo trim($text);
输出
Hello, world!
,因为在字符串的开头和结尾处分别有一个空格,这些空格已经被
trim()
函数删除掉了。 需要注意的是,trim()
函数并不会删除字符串中间的空白字符。
- str_replace
str_replace()
是 PHP 中的一个内置函数,用于替换字符串中的一部分内容。 这个函数接受三个参数:第一个参数是要搜索的目标字符串,第二个参数是要被替换的新字符串,第三个参数是要在其中进行替换的操作字符串。 下面是一个使用str_replace()
函数的例子:$old_string = "Hello, World!"; $new_string = str_replace("World", "Earth", $old_string); echo $new_string;
输出
Hello, Earth!
,因为我们在
Hello, World!
这个字符串中用Earth
替换了World
。 需要注意的是,str_replace()
函数只会替换字符串中第一次出现的目标字符串,如果您想替换所有出现的目标字符串,可以使用str_ireplace()
或preg_replace()
函数。
- array_keys
array_keys()
是 PHP 中的一个内置函数,用于返回数组中所有的键名作为新的数组。 这个函数接受一个数组作为参数,并返回一个新数组,其中包含了原数组的所有键名。 下面是一个使用array_keys()
函数的例子:$array = array("apple" => 0, "banana" => 1, "cherry" => 2); print_r(array_keys($array));
输出:
Array ( [0] => apple [1] => banana [2] => cherry )
这就是因为
array_keys()
函数返回了一个新数组,其中包含了原数组$array
的所有键名:apple、banana 和 cherry。
- stristr
stristr()
是 PHP 中的一个函数,用于在字符串中搜索一个子串,忽略大小写。 这个函数接受两个参数:第一个参数是要搜索的目标字符串,第二个参数是要搜索的子串。如果找到了匹配的子串,那么就返回包含该子串及其后面部分的字符串;否则返回 FALSE。 下面是一个使用stristr()
函数的例子:$string = "Hello, World!"; $search = "world"; $result = stristr($string, $search); echo $result;
输出
rld!
,因为它是在忽略大小写的条件下搜索
world
子串的结果。 需要注意的是,stristr()函数只会返回找到的第一个匹配项及其后面的部分,
- php_uname
php_uname()
是 PHP 中的一个函数,用于获取系统的信息。 这个函数返回一个包含系统信息的字符串,包括操作系统名称、版本号、主机名等内容。 下面是一个使用php_uname()
函数的例子:$info = php_uname(); echo $info;
输出:
Linux localhost 4.4.0-19041-Microsoft #267-Microsoft Thu Dec 12 14:58:½