Unicode Injection
Reading time: 8 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Introduction
バックエンド/フロントエンドが奇妙なユニコード文字を受け取ったときの動作によって、攻撃者は保護を回避し、任意の文字を注入することができ、これによりXSSやSQLiなどの注入脆弱性を悪用することが可能になります。
Unicode Normalization
ユニコード正規化は、ユニコード文字がASCII文字に正規化されるときに発生します。
この種の脆弱性の一般的なシナリオは、システムがチェックした後にユーザーの入力を何らかの方法で変更するときに発生します。たとえば、いくつかの言語では、入力を大文字または小文字にするための単純な呼び出しが、与えられた入力を正規化し、ユニコードがASCIIに変換され新しい文字が生成される可能性があります。
詳細については、次を確認してください:
\u
to %
ユニコード文字は通常、\u
プレフィックスで表されます。たとえば、文字㱋
は\u3c4b
です(ここで確認)。バックエンドが**\u
プレフィックスを%
に変換すると、結果の文字列は%3c4b
になり、URLデコードすると<4b
になります。そして、見ての通り、<
文字が注入されます**。
バックエンドが脆弱であれば、この技術を使用して任意の種類の文字を注入することができます。
必要な文字を見つけるには、https://unicode-explorer.com/を確認してください。
この脆弱性は、研究者が発見した脆弱性に由来します。詳細な説明については、https://www.youtube.com/watch?v=aUsAHb0E7Cgを確認してください。
Emoji Injection
バックエンドは、絵文字を受け取るときに何かおかしな動作をします。これは、研究者が💋img src=x onerror=alert(document.domain)//💛
のようなペイロードでXSSを達成したこのレポートで起こったことです。
この場合、サーバーが悪意のある文字を削除した後、UTF-8文字列をWindows-1252からUTF-8に変換したことがエラーでした(基本的に入力エンコーディングと変換元エンコーディングが不一致でした)。そのため、適切な<を提供せず、奇妙なユニコードのものが得られました:‹
``そのため、彼らはこの出力を取り、今度はUTF-8からASCIIに再変換しました。これにより、‹
が<
に正規化され、これがそのシステムでのエクスプロイトが機能する方法でした。
これが起こったことです:
<?php
$str = isset($_GET["str"]) ? htmlspecialchars($_GET["str"]) : "";
$str = iconv("Windows-1252", "UTF-8", $str);
$str = iconv("UTF-8", "ASCII//TRANSLIT", $str);
echo "String: " . $str;
Emojiリスト:
- https://github.com/iorch/jakaton_feminicidios/blob/master/data/emojis.csv
- https://unicode.org/emoji/charts-14.0/full-emoji-list.html
Windows Best-Fit/Worst-fit
この素晴らしい投稿で説明されているように、WindowsにはBest-Fitという機能があり、ASCIIモードで表示できないunicode文字を類似の文字に置き換えることがあります。これにより、バックエンドが特定の文字を期待しているのに異なる文字を受け取ると、予期しない動作が発生する可能性があります。
**https://worst.fit/mapping/**でbest-fit文字を見つけることができます。
Windowsは通常、実行の最後の部分でunicode文字列をascii文字列に変換するため(通常は「W」サフィックスのAPIから「A」サフィックスのAPIに移行する、例えばGetEnvironmentVariableA
とGetEnvironmentVariableW
)、攻撃者はunicode文字を送信することで保護を回避し、最終的に予期しない動作をするASCII文字に変換されることができます。
ブログ投稿では、文字のブラックリストを使用して修正された脆弱性を回避する方法、“/“ (0x2F)にマッピングされた文字を使用してパストラバーサルを悪用する方法、“\“ (0x5C)にマッピングされた文字を使用する方法、またはPHPのescapeshellarg
やPythonのsubprocess.run
のようなシェルエスケープ保護をリストを使用して回避する方法が提案されています。例えば、**全角二重引用符 (U+FF02)**を二重引用符の代わりに使用することで、最終的に1つの引数のように見えたものが2つの引数に変換されました。
アプリが脆弱であるためには、「W」Windows APIを使用し、最終的に「A」Windows APIを呼び出す必要があるため、unicode文字列の「Best-fit」が作成されます。
「修正すべき問題について誰が責任を持つべきかに合意がないため、発見された脆弱性のいくつかは修正されないでしょう。」
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。