代码审计DVWA _Command Injection (high)

文章介绍了如何使用PHP处理表单提交,通过trim()函数清理IP地址输入,创建黑名单并使用str_replace()替换敏感字符,然后根据操作系统类型执行ping命令。同时提到了关键函数如stristr()和php_uname()的使用。
摘要由CSDN通过智能技术生成

打开靶场:

打开源代码:

代码如下:

<?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>";
}

?> 

代码审计:

if( isset( $_POST[ 'Submit' ] ) )

此段代码我们检查是否已提交表单,方法是在 POST 变量中查找名为submit 的按钮。如果找到,脚本将继续执行。

$target = trim($_REQUEST[ 'ip' ])

从表单获取IP地址字段的值并使用 trim() 函数删除其周围的任何空格。

trim():

函数用于删除字符串开头和结尾处的空白字符(空格、制表符、换行符等)或者其它指定字符

例如:

$my_string = " Hello World! ";
echo trim($my_string); // 输出:"Hello World!"

在这个例子中,trim() 函数会删除字符串开始和结束的所有空白字符。所以输出是 "Hello World!" 而不是 " Hello World! "

然后定义一个名为 $substitutions 的数组,该数组包含应从 IP 地址中删除并在运行ping命令之前删除的字符列表。

  • 设置了黑名单,&,;,|+,-,(,),[反引号],||
  • 黑名单中漏掉了关键字符|

重点代码:

  $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.

使用 str_replace() 函数替换所有在 $substitutions 数组中存在的字符。

str_replace():

例如:

<?php
$text = "Hello World!"; 
$new_text = str_replace("World", "Dolly", $text);
 echo $new_text; // 输出:"Hello Dolly!"
?>

在这个例子中,《Hello World!》中的“World”被替换成“Dolly”,所以输出是《Hello Dolly!》。

array_key():

<?php
$array = array("apple", "banana", "cherry");
$key = "orange";

if (array_key_exists($key, $array)) {
   echo "Key exists";
} else {
   echo "Key does not exist";
}
?>

在这个例子中,array_key_exists() 函数用于检查数组中是否存在特定的键。因为数组中不存在键 “orange”,所以输出将是 "Key does not exist"。

stristr():

<?php
$string = "Hello World!";
$search_for = "or";
$pos = stristr($string, $search_for);
echo substr($string, 0, strpos($string, $search_for)); // 输出:"He"
?>

在这个例子中,《Hello World!》中的 “or” 是由 stristr() 函数找到的第一个子串。然后使用 substr() 函数返回从字符串开始到第一个子串出现为止的部分,即 "He"。

php_uname():

       查你现在用的电脑的系统信息,括号里可以放很多值来查询不同的系统信息,例如,‘s’是查询你的操作系统,'n'查询你的主机名称,‘r’查询你的版本

判断操作系统类型,如果是Windows,则执行 shell_exec('ping ' . $target)

否则执行 shell_exec('ping -c 4 ' . $target)。这部分的目的是根据不同的操作系统执行不同的ping命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值