DVWA靶场Command Injection impossible代码审计

PHP代码函数解析

全篇的代码解释在最后

后面有整体代码解释,第一次写博客,望个位大佬担待ヾ(≧▽≦*)o

代码中函数的解释

1.isset函数检测变量是否已声明并且其值不为 null

这里我使用了GET传参更能直白的看见isset函数的效果。

<?php
//在if语句中使用isset函数来判断cmd是否有传值若有则答应出来,反之告诉用户输入为空,请重新输入
if( isset( $_GET[ 'cmd' ]  ) ){
	echo $_GET[ 'cmd' ];
}
else{
	echo "输入为空,请重新输入";
}
?>  

传入参数后的结果

在这里插入图片描述
没有传入参数的结果

在这里插入图片描述

2.checkToken函数通常用于验证表单提交的数据是否合法,以防止跨站点请求伪造(CSRF)攻击。

用checkToken函数来确认页面的user_token,session_token和页面重定向

user_token通常是在用户登录时生成的,用于标识用户身份和授权用户访问系统中的资源。它通常是长期有效的,直到用户注销或者修改密码等操作;

session_token则是在用户每次访问系统时生成的,用于标识用户当前的会话状态和授权用户访问当前会话中的资源。它通常是短期有效的,当用户关闭浏览器或者长时间不活动时会自动失效;

// $_REQUEST函数默认情况下包含了 $_GET,$_POST 和 $_COOKIE 三种方法。
/*$_SESSION它允许在不同页面和请求之间保持用户数据的状态。当一个用户访问一个网站时,
服务器会为该用户创建一个唯一的会话 ID,并将该 ID 存储在用户的浏览器中的 cookie 中。
在用户的后续请求中,服务器可以使用该会话 ID 来访问该用户的会话数据。*/
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
3.stripslashes 函数是 PHP 中的一个字符串处理函数,用于删除反斜杠。

在 PHP 中,反斜杠(\)通常用于转义特殊字符,例如双引号、单引号、换行符等。但是有时候我们需要将字符串中的反斜杠删除,这时候就可以使用 stripslashes 函数;

<?php
//给str赋予一个值
$str = "Is your name O\'reilly?";
echo $str;
echo "<br />";
// 使用stripslasher函数删除反斜杠
echo stripslashes($str);
?>

在这里插入图片描述

4.explode使用一个字符串分割另一个字符串

这里我输入了一串IP例如192.168.143.121,然后使用explode函数通过.将IP分割为四组

<?php
    //传入一个IP值
    $target = $_REQUEST[ 'ip' ];
    // 通过.将IP分为四组
    $octet = explode( ".", $target );
    echo "<br />";
    echo $octet[0];
    echo "<br />";
    echo $octet[1];
    echo "<br />";
    echo $octet[2];
    echo "<br />";
    echo $octet[3];
?>

在这里插入图片描述

5.is_numeric检测变量是否为数字或数字字符串
<?php
    //传入一个IP值
    $target = $_REQUEST[ 'ip' ];
    // 通过.将IP分为四组
    $octet = explode( ".", $target );
    echo "<br />";
    echo $octet[0];
    echo "<br />";
    echo $octet[1];
    echo "<br />";
    echo $octet[2];
    echo "<br />";
    echo $octet[3]."<br />";
    //用if来做判断,用is_numeric函数来判断是否为数字字符串,用sizof函数来匹配每组字符串是否为四个数字字符串
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ){
        echo "全是数字字符串,并且每组都有四个数字字符串";
    }
    else{
        echo "输入IP有误,重新输入";
    }
?>) )

在这里插入图片描述

在这里插入图片描述

6.数组的拼接
//通过`.`将分割后的数组拼接起来
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

在这里插入图片描述

7.stristr() 函数用于查找字符串中第一次出现指定子字符串的位置,并返回该子字符串及其后面的所有字符。
<?php
  $email = 'USER@EXAMPLE.com';
  //stristr函数匹配第一个e字符串后输出之后的字符串
  echo stristr($email, 'e')."<br />";
  //当给stristr函数一个true时。匹配第一个e字符串后输出之前的字符串
  echo stristr($email, 'e', true);
?>

在这里插入图片描述

8.php_uname() 返回了运行 PHP 的操作系统的描述。
  • ‘a’:此为默认。包含序列 “s n r v m” 里的所有模式。
  • ‘s’:操作系统名称。例如: FreeBSD。
  • ‘n’:主机名。例如: localhost.example.com。
  • ‘r’:版本名称,例如: 5.1.2-RELEASE。
  • ‘v’:版本信息。操作系统之间有很大的不同。
  • ‘m’:机器类型。例如:i386
//php_uname返回版本信息其中的s是php_uname的参数
echo php_uname('s');

在这里插入图片描述

9.shell_exec通过 shell 执行命令并将完整的输出以字符串的方式返回
<?php
//通过shell_exec执行ipconfig命令查询IP信息
$output = shell_exec(ipconfig);
//将执行后的结果输出到页面上
echo "<pre>$output</pre>";
?>

在这里插入图片描述

10.generateSessionToken()函数

这个函数的作用是生成一个会话令牌(Session Token),用于在客户端和服务器之间建立会话。会话令牌通常是一个随机生成的字符串,用于标识一个特定的用户会话。在客户端登录后,服务器会生成一个会话令牌并将其返回给客户端,客户端在后续的请求中需要携带这个会话令牌,以便服务器能够识别该用户的身份并提供相应的服务。

整体代码解析

 <?php
//判断post传参是否为空
if( isset( $_POST[ 'Submit' ]  ) ) {
    // 用checktoken验证页面的user_token,session_token,和首页的重定向
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    // 获取传入IP值
    $target = $_REQUEST[ 'ip' ];
    //利用stripslasher函数删除IP值中的反斜杠
    $target = stripslashes( $target );
    // 通过.符号将IP信息分割
    $octet = explode( ".", $target );
    // 使用is_numeric判断每组数组是否为数字或者数字字符串,使用sizeof判断每组是否为4位
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
        // 将每四位数字重新拼接起来
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
        // 利用stristr函数忽略大小写版本号,使用php_uname函数判断php操作系统。s代表操作系统名称
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
            // 如果是windows系统ping+IP地址
            $cmd = shell_exec( 'ping  ' . $target );
        }
        else {
             // 如果是Linux系统ping四次IP地址
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
        }
        // 输出最终的结果
        echo "<pre>{$cmd}</pre>";
    }
    else {
        // 否则告诉用户输入IP地址有错
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    }
}
// 创建唯一token值
generateSessionToken();
?>
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值