审计impossible难度的命令执行

这里防止命令注入的思路是白名单,也就是说对输入进行过滤,只允许输入ip地址。

将输入的命令分成4段,每一段都判断一下是不是数字,总共是不是4段,如果是的话,再用点把4

段数字拼接起来,因此不存在命令注入。

if( isset( $_POST[ 'Submit' ]  ) ) {    //判断上传的Submit参数是否为空


    // 在用户提交表单时验证表单 token 的有效性,以防止跨站点请求伪造(CSRF)攻击。
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    //checkToken() 函数会检查用户传入的 user_token 和服务器存储的 session_token 是否相等,以此来验证用户的身份。其中,user_token 和session_token是分别存储在用户请求中和服务器会话中的令牌,用于防止CSRF攻击;index.php 则是当验证失败时将要跳转的页面。

   //将客户端传递的 ip 参数值赋值给 $target 变量,使用REQUEST请求方式
    $target = $_REQUEST[ 'ip' ];
    $target = stripslashes( $target ); //使用 stripslashes() 函数将其解除转义,并返回一个新的没有转义的字符串。
    
    $octet = explode( ".", $target );   //explode() 函数用于将一个字符串按照“.”分隔符拆分成多个子字符串,并将这些子字符串存储在数组中。
    
    //将一段 IP 地址字符串 $target 拆分成了一个数组 $octet,而每个数组元素均为一个字符串类型。要检查每个数组元素是否均为整数,我们可以遍历 $octet 数组,然后对于每个元素使用 is_numeric() 函数检查其是否为数值类型,如果是,则将其转换为整数类型进行后续操作。
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
       

       //将一个包含 4 段 IP 地址的数组 $octet 拼接成一个完整的 IP 地址字符串,并将其赋值给 $target 变量。
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
    
        // 确定操作系统并执行ping命令。
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
       //判断当前运行 PHP 代码的操作系统是否为 Windows NT。其中 php_uname('s') 函数会返回当前运行操作系统的信息。stristr() 函数则用于在返回的字符串中查找特定的子字符串,当查找到 'Windows NT' 这个字符串时,说明当前的操作系统是 Windows NT,返回 true,否则返回 false。
            $cmd = shell_exec( 'ping  ' . $target );  //使用shell_exec() 让ping与之前的重组的$target拼接成一条ping命令
        }
        else {
            // linux
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
        }
    
        // Feedback for the end user  最终对用户的反馈
        echo "<pre>{$cmd}</pre>";
    }
    else {

        //在网页中输出一条错误消息。
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    }

}

// Generate Anti-CSRF token   生成反CSRF令牌
generateSessionToken();   //生成一个用于会话标识的随机字符串 token。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故事讲予风听

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值