最もよく知られている脆弱性のクラスの 1 つは、インジェクションの脆弱性です。特に、誰もが疑う余地のない存在である SQL インジェクションは、誰も驚かないでしょう。テクノロジーの世界で SQL インジェクションについて耳にするのは避けられないので、ここではそのことについて話すことにします。
SQL インジェクションを使用すると、SQL クエリの動作を操作して攻撃者の命令を実行することができます。
表面的には異なりますが、すべて同じ原理に基づいて機能する注入タイプは他にもたくさんあります。
要約すると、最も一般的な注入タイプのいくつかは次のとおりです。
- SQL インジェクション
- クロスサイトスクリプティング (HTML/JavaScript インジェクション)
- パストラバーサル (パス/URL インジェクション)
- コマンド・インジェクション
- コード・インジェクション
ア・リトル・インジェクション 101
前述のインジェクションタイプのリストを見ると、すべて共通点が1つあります。それらはすべて文字列に関係し、それがインタープリターを介して実行され、インタープリターが文字列が表すすべての処理を行います。「ユーザー入力」は中括弧で囲んでいます。
| Type | Exemple de saisie | Comment il est interprété |
| SQL | SELECT name FROM users WHERE username = '{admin}' (nom d'utilisateur) | Sélectionne la colonne "Nom" de toutes les lignes du tableau des utilisateurs dont le nom d'utilisateur est "admin". |
| HTML | {John Smith} | Indique le nom "John Smith" en caractères gras |
| Chemin d'accès | /var/www/app/documents/{privacy-policy.pdf} | Pointe le fichier `privacy-policy.pdf` dans le dossier `/var/www/app/documents/`. |
| Commandement | ping {8.8.8.8} | Envoie une série de pings ICMP à l'adresse IP `8.8.8.8`. |
| Code | const name = '{John Smith}'; | Fixe la variable constante `nom` à la valeur `John Smith`. |
では、ユーザー入力の挿入が安全でない場合はどうなるでしょうか。攻撃者には何ができるでしょうか?繰り返しになりますが、このシナリオでは、中括弧内のものはすべて「ユーザー入力」と見なされます。
| Type | Exemple de saisie | Comment il est interprété |
| SQL - Injecté | SELECT name FROM users WHERE username = '{1' UNION SELECT passwordhash from users WHERE username = 'admin}' | Sélectionne le "Nom" de toutes les lignes du tableau des utilisateurs dont le nom d'utilisateur est "admin", et le hachage du mot de passe pour les utilisateurs dont le nom d'utilisateur est "admin". |
| HTML - Injecté | {} | Afficher le nom "John Smith" en caractères gras |
| Chemin - Injecté | /var/www/app/documents/{../../../../../../etc/shadow} | Pointe vers le fichier `shadow` dans le dossier `/etc/`. |
| Commande - Injecté | ping {8.8.8.8 && ls . } | Envoie une série de pings ICMP à l'adresse IP `8.8.8.8`, et affiche le contenu du répertoire courant avec `ls` |
| Code - Injecté | const name = '{John Smith'; exec('ls .'); # }'; | Définit la variable constante `name` à la valeur `John Smith`, puis exécute la commande système `ls . |
これらの例では、入力がどのようにユーザー入力の結果に影響を与えることができるかに注意してください。
これが注射の本質です。元のプログラマーが意図していたこととは違うことを実行させるために、インタープリターに渡される内容に影響を及ぼしているのです。
これらは考慮すべき基本事項にすぎません。もう少し注意が必要なため、いくつかの異なるインジェクションタイプを個別のページに分けました。
ここで見つけることができます:
コマンド・インジェクション
パストラバーサル
SQL インジェクション
クロスサイトスクリプティング