【代码审计】dvwa命令执行漏洞的代码(高级)

环境搭建:

环境系统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:½
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值