打开dvwa靶场,先把难度调到high,在点击“Command injection”进入命令执行漏洞靶场
<?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>";
}
?>
trim
函数出现的位置7行
出现在target值的后面,在传ip参数的前面,大胆猜测一下是不是一个过滤在输入ip里怪东西的函数
函数用法
用于删除前后的空格
<?php
$a = trim(' 123 ');
echo $a;
?>
可以看到我在代码里打了很多空格,但是运行时没有
str_replace23行
函数出现的位置
出现在第二次给traget赋值的后面、括号前,括号后面用array_key函数去除关键字和替换值组成了个新的值赋给target,大胆猜测这个函数可能是限制这个新产生的值。
函数用法
将 c 位置的 b 内容替换成 a
<?php
echo str_replace("world")("4684531")("h");
?>
可以看到hello world中的world被替换成了114514
array_keys23行
函数出现的位置
函数用法
返回包含数组中所有键名的一个新数组
<?php
$a=array("Volvo"=>"XC90","BMW"=>"X5","Toyota"=>"Highlander");
print_r(array_keys($a));
?>
大白话话理解是,看到【函数出现位置】那张图这个函数出现的地方上面那个叫【$substitutions】的值了吗,那堆【=>】左边的东西单独拎出来组成一个新的组。
当然这样理解不太好,你能理解加粗的字更好,理解不了就看我写的那个。
stristr
函数出现的位置26行
函数用法
查找 b 在 a 中第一次出现,并且输出剩余字符串
<?php
echo strustr("hellodasda","w000");
?>
大白话理解:找到 a 中第一次出现 b 的地方并且把前面的东西都嘎了,留下第一次出现 b 的地方以及后面的字符
php_uname
函数出现的位置26行
函数用法
返回运行 PHP 的电脑系统的有关信息,‘s’ 为操作系统名称
<?php
echo php_uname( 's' );
?>
大白话理解:php_uname查你现在用的电脑的系统信息,括号里可以放很多值来查询不同的系统信息,例如,‘s’是查询你的操作系统,'n'查询你的主机名称,‘r’查询你的版本