背景
Upload fileの中に怪しい・危ない文字列を入れたら、それをpostすると、Azure WAF側で検知されますか。との検証をやってみました。
検証経緯
1.まずはtest.txt ファイルを用意します。中身には変な文字列がいっぱいあります。
"payload=<script>alert('xss')</script>&id=1=1; --"
payload=<script>alert('xss')</script>&id=1=1; --
bash
cc
echo
[https://[URL]/?q=]https://[URL]/?q= <script>alert('XSS')</script>
j_id_id186pc2:090-7927--3999
passwd=test
2.Curlコマンドで実施します。
curl -X POST -F "file=@C:\Users\hirtan\test.txt"
結果は200です。検知されませんでした。
C:\Users\hirtan>curl -X POST -F "file=@C:\Users\hirtan\\test.txt" https://tanappgw.jpninjateams.com
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テキストファイルアップロード</title>
</head>
<body>
<h2>テキストファイルアップロード</h2>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="textfile" accept=".txt">
<input type="submit" value="アップロード">
</form>
</body>
</html>
-F ではなく、--data-binaryに変更してpostしたら、検知されるようになりました。
curl -X POST --data-binary @C:\Users\hirtan\test.txt https://tanappgw.jpninjateams.com
C:\Users\hirtan>curl -X POST --data-binary @C:\Users\hirtan\test.txt https://tanappgw.jpninjateams.com
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>Microsoft-Azure-Application-Gateway/v2</center>
</body>
</html>
4.-F と --data-binaryの違い:
-Fを使用した場合:
リクエストがmultipart/form-data形式で送信され、サーバー(tanappgw.jpninjateams.com)はこれをフォームアップロードとして処理。
--data-binaryを使用した場合、
リクエストがapplication/octet-stream形式で送信され、ファイルの内容がそのままボディに含まれる。
5.実際browser上でtest.txt fileをアップロードしてみたら、成功でした。

結論
Application Gateway の WAF においてはアップロードされたファイルの中身を検査することは出来ません。
(= 要求本文の検査のような検査を、ファイルの中身に対して行うことは出来ません。)
つまり、WAF 経由でアップロード可能なファイルの上限サイズを設定することは可能ですが、
ファイルと判断されたデータ (Content-type が multipart/form-data のデータ) は、
要求本文とは異なり、中身にマネージド ルールに検知される内容が含まれていたとしても、
検知されない動作となります。