héros bg sans séparateur
Lignes directrices

インジェクション 101

最もよく知られている脆弱性のクラスの 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 インジェクション

クロスサイトスクリプティング