PHP代码审计(2)

审计dvwa命令执行漏洞的代码-------impossible难度

代码

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {		//判断值是否为空
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $target = $_REQUEST[ 'ip' ];			//接收request传参并赋值target
    $target = stripslashes( $target );		//去除里面的反斜杠

    // Split the IP into 4 octects
    $octet = explode( ".", $target );		//以.作为分隔符,将target打散为数组,并赋值octet

    // Check IF each octet is an integer
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {	//判断是否为4个键值对
        // If all 4 octets are int's put the IP back together.
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];	//再把值拼接起来

        // Determine OS and execute the ping command.
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {		//判断版本信息,如果包含Windows NT则继续执行	
            // Windows
            $cmd = shell_exec( 'ping  ' . $target );		//执行系统命令ping并赋值cmd
        }
        else {
            // *nix
            $cmd = shell_exec( 'ping  -c 4 ' . $target );		//执行系统命令ping并赋值cmd
        }

        // Feedback for the end user
        echo "<pre>{$cmd}</pre>";		//将执行结果以宽字节方式输出
    }
    else {
        // Ops. Let the user name theres a mistake
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';		//报错
    }
}

// Generate Anti-CSRF token
generateSessionToken();			//执行类

?>

主要参数说明

stripslashes()

stripslashes()删除由addslashes()函数添加的反斜杠
addslashes()括号里出现预定义字符' " \,添加反斜杠

<?php
	$str = addslashes('a "b" c');
	echo($str);
	echo stripslashes($str);
?>

输出结果
a \"b\" c
a "b" c

explode()

explode()把字符串打散为数组
语法
explode(separator,string,limit)
参数描述
separator必需。指定分隔符
string必需。要分割的字符串
limit可选。设置返回几个键值对

<?php
	$str = "Hello world. I love Shanghai!";
	print_r (explode(" ",$str));
?>

输出结果
Array
(
    [0] => Hello
    [1] => world.
    [2] => I
    [3] => love
    [4] => Shanghai!
)

checktoken

跳转该函数所在位置

function checkToken( $user_token, $session_token, $returnURL ) {
	if( $user_token !== $session_token || !isset( $session_token ) ) {
		dvwaMessagePush( 'CSRF token is incorrect' );
		dvwaRedirect( $returnURL );
	}
}
如果用户提交的token不等于存储在会话中的token值,或没有存储的token,推送一条消息并重定向到URL
  • $user_token: 用户提交的token
  • $session_token: 存储在会话中的token
  • $returnURL: 如果令牌无效,要重定向到的 URL
  • dvwaMessagePush & dvwaRedirect是靶场自定义的函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值