审计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
: 如果令牌无效,要重定向到的 URLdvwaMessagePush & dvwaRedirect
是靶场自定义的函数