dvwa解题(1)Ping a device

发布时间 2023-11-27 23:29:10作者: 逆世混沌

选择上来先看source

LOW

<?php

// 检查是否提交了表单
if (isset($_POST['Submit'])) {
    // 获取输入的目标 IP 地址
    $target = $_REQUEST['ip'];

    // 确定操作系统并执行 ping 命令
    if (stristr(php_uname('s'), 'Windows NT')) {
        // 如果是 Windows 操作系统
        $cmd = shell_exec('ping ' . $target);
    } else {
        // 如果是类 Unix 操作系统
        $cmd = shell_exec('ping -c 4 ' . $target);
    }

    // 将 ping 命令的输出显示给最终用户
    echo "<pre>{$cmd}</pre>";
}

?>

这个是low等级,可以看到没做过滤,直接加命令

MED

接下来是

med等级

<?php

// 检查是否提交了表单
if (isset($_POST['Submit'])) {
    // 获取输入的目标 IP 地址
    $target = $_REQUEST['ip'];

    // 设置黑名单(用于防止命令注入)
    $substitutions = array(
        '&&' => '',   // 移除 &&
        ';'  => '',   // 移除 ;
    );

    // 从输入中移除黑名单中的任何字符
    $target = str_replace(array_keys($substitutions), $substitutions, $target);

    // 确定操作系统并执行 ping 命令
    if (stristr(php_uname('s'), 'Windows NT')) {
        // 如果是 Windows 操作系统
        $cmd = shell_exec('ping ' . $target);
    } else {
        // 如果是类 Unix 操作系统
        $cmd = shell_exec('ping -c 4 ' . $target);
    }

    // 将 ping 命令的输出显示给最终用户
    echo "<pre>{$cmd}</pre>";
}

?>

可以看到过滤了&&和;

直接用  |  解决

 当然也有

 这个是利用过滤将;删除之后剩余的&&

HIGH

<?php

// 检查是否提交了表单
if (isset($_POST['Submit'])) {
    // 获取输入的目标 IP 地址,并去除首尾的空格
    $target = trim($_REQUEST['ip']);

    // 设置黑名单,定义需要移除的特殊字符
    $substitutions = array(
        '&'  => '',   // 移除 &
        ';'  => '',   // 移除 ;
        '| ' => '',   // 移除 |
        '-'  => '',   // 移除 -
        '$'  => '',   // 移除 $
        '('  => '',   // 移除 (
        ')'  => '',   // 移除 )
        '`'  => '',   // 移除 `
        '||' => '',   // 移除 ||
    );

    // 从输入中移除黑名单中的任何字符
    $target = str_replace(array_keys($substitutions), $substitutions, $target);

    // 确定操作系统并执行 ping 命令
    if (stristr(php_uname('s'), 'Windows NT')) {
        // 如果是 Windows 操作系统
        $cmd = shell_exec('ping ' . $target);
    } else {
        // 如果是类 Unix 操作系统
        $cmd = shell_exec('ping -c 4 ' . $target);
    }

    // 将 ping 命令的输出显示给最终用户
    echo "<pre>{$cmd}</pre>";
}

?>

对IP进行了很细致的过滤,但是只要是过滤就得出现绕过

这里的代码发现有

'| '

会修改|加空格,那么只要我们命令里没用空格就可以解决

 还有“ | | ”这里有空格也可以绕过

 

PHP是世界上最好的语言

<?php

// 检查是否提交了表单
if (isset($_POST['Submit'])) {
    // 检查 Anti-CSRF 令牌
    checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');

    // 获取输入
    $target = $_REQUEST['ip'];
    $target = stripslashes($target);

    // 将 IP 拆分成 4 个八位
    $octet = explode(".", $target);

    // 检查每个八位是否为整数
    if (
        (is_numeric($octet[0])) &&
        (is_numeric($octet[1])) &&
        (is_numeric($octet[2])) &&
        (is_numeric($octet[3])) &&
        (sizeof($octet) == 4)
    ) {
        // 如果所有 4 个八位都是整数,重新组合 IP
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

        // 确定操作系统并执行 ping 命令
        if (stristr(php_uname('s'), 'Windows NT')) {
            // Windows
            $cmd = shell_exec('ping ' . $target);
        } else {
            // *nix
            $cmd = shell_exec('ping -c 4 ' . $target);
        }

        // 反馈给最终用户
        echo "<pre>{$cmd}</pre>";
    } else {
        // 操作失败。告知用户有错误
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    }
}

// 生成 Anti-CSRF 令牌
generateSessionToken();

?>