DVWA(lmpossible模式) ---- 命令执行代码审计

以下是lmpossible模式代码:

<?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、首先肯定是理解内容哈,通过第一行可以看到就是php语言所写,紧接着整个先理解它php语句所表达的意思,如下图所示:

 

 2、整体的一个语句大致意思就是 if 语句的一个判断结果,如果值为true(真),则执行,如果值为flase(假),则不执行,接下来我们就了解里面一些生僻或者翻译不了的函数以及它所能实现的作用,如下图所示:

#   isset

  •  函数的意思:检测变量是否已声明并且值是否为空

  •  还是判断的意思哈,值为空就不往下执行,反之执行往下语句

 

 

#   trim

  • 函数的意思:去除字符串首尾处的空白字符(或者其它字符)

  • 下图中演示是没有函数的显示,左边图可以看到我在编写的时候专门输入了两空格,右边图显然可以看到空格是展示出来的 (在执行完的页面右击查看源代码就可以看到了)

 

 

  • 下图就是演示有函数的显示了,还是跟上图一样在页面中右击查看源代码,可以看到空格很明显消失了

 

#  array_keys

  • 函数的意思:返回数组中的数字或者字符串的键名  (这个不太好理解,那咱们上图看看)
  • 第一张图返回了一个索引数组,还是理解的有点模糊,接着上图

 

  • 这第二张明显了吧,通过array_keys这个函数发现返回的值为数组里的键名,让其组成了一个新的数组

     

    #  str_replace

  •  函数的意思:子字符串替换

  •  图中可以清晰的看到就是将传入的值进行对比替换输出得到$str的值

 

#  stristr

  • 函数的意思:查找字符串首次出现的地方并且忽略大小写

#  php_uname

  • 返回允许PHP的系统的相关信息

 

 

以上就是对整个代码中不理解的函数进行多方面的查询得到的结果,查询方式例如:php手册

综上理解后,对整个代码进行审计,如下图所示:

<?php
 
if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input   
    // 判断从前端通过post方式传来的值是否为空
    
    $target = trim($_REQUEST[ 'ip' ]);
    // Set blacklist
    // 从请求中获取一个名为 "ip" 的参数,然后使用trim()函数去除该参数值的首尾空格,并将其赋值给变量 $target
    
    $substitutions = array(
        '&'  => '',
        ';'  => '',
        '| ' => '',
        '-'  => '',                  
        '$'  => '',           //这里的语句就是一个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.
    // 先通过array_keys返回以上数组中的键名,紧接着根据键名去找$target中是否有跟键名一样的值,如果有将会在$substitutions数组中的值进行替换
    
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        // 通俗的理解就是判断是否为Windows系统(stristr忽略大小写)
        
        $cmd = shell_exec( 'ping  ' . $target );
        // 以上语句成立如果是Windows系统,则利用shell_exec命令执行ping命令
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
        // 如果不是Windows系统,则利用shell_exec命令执行ping命令
    }
 
    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}
 
?>

# 个人理解,有不足麻烦指出,感谢各位大佬

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值