最もよく知られている脆弱性のクラスのひとつは、インジェクション脆弱性である:SQLインジェクションだ。技術界でSQLインジェクションを聞かないのは難しい。
SQLインジェクションでは、SQLクエリの動作を操作して攻撃者の思い通りにすることが可能です。
その他にも、表面上は異なるが、すべて同じ原理に基づいて機能する多くの種類の注射がある。
簡単にまとめると、最も一般的な注射の種類は以下の通りである:
- SQLインジェクション
- クロスサイト・スクリプティング(HTML/Javascriptインジェクション)
- パストラバーサル (パス/URL インジェクション)
- コマンド・インジェクション
- コード・インジェクション
小さな注射101
先ほどのインジェクション・タイプのリストを見ると、共通していることが1つあります。それは、すべて文字列を含み、その文字列がインタプリタを通して実行され、そのインタプリタが文字列が表すことを何でも実行するということです。ユーザー入力」を中カッコでマークした。
タイプ | 入力例 | どのように解釈されるか |
SQL | SELECT name FROM users WHERE username = '{admin}' | usersテーブルから、ユーザー名が'admin'であるすべての行から "Name "カラムを選択する。 |
HTML | {ジョン・スミス} | 太字で「ジョン・スミス」と表示 |
パス | /var/www/app/documents/{privacy-policy.pdf}。 | var/www/app/documents/`フォルダ内の`privacy-policy.pdf`ファイルを指す。 |
コマンド | ピング{8.8.8.8}。 | IPアドレス `8.8.8.8` に一連のICMP pingを送る。 |
コード | const name = '{John Smith}'; | 定数変数 `name` に値 `John Smith` をセットする。 |
では、もしユーザー入力の挿入が安全でなかったらどうなるだろうか?攻撃者は何ができるだろうか?繰り返しになるが、このシナリオでは、中カッコ内のすべてが「ユーザー入力」とみなされる。
タイプ | 入力例 | どのように解釈されるか |
SQL - インジェクション | SELECT name FROM users WHERE username = '{1' UNION SELECT passwordhash from users WHERE username = 'admin}' | usersテーブルから、ユーザー名が'admin'であるすべての行から "Name "を選択し、ユーザー名が'admin'であるユーザーのパスワードハッシュを選択する。 |
HTML - インジェクション | {} | 太字で「ジョン・スミス」と表示 |
パス - インジェクション | /var/www/app/documents/{.../.../.../etc/shadow}. | etc/`フォルダ内の`shadow`ファイルを指す。 |
コマンド - 注入 | ping {8.8.8.8 && ls .} | IP `8.8.8.8` に一連の ICMP ping を送信し、`ls` でカレントディレクトリの内容を表示する。 |
コード - インジェクション | const name = '{John Smith'; exec('ls .'); # }'; | 定数変数 `name` に値 `John Smith` をセットし、システムコマンド `ls . |
これらの例では、ユーザー入力から得られる結果に影響を与えるために、入力がどのように使われるかに注意してください。
これがインジェクションの本質だ。本来のプログラマーが意図したこととは違うことをさせるために、インタープリターに渡されるものに影響を与えるのだ。
これらは考慮すべき基本的なことに過ぎない。インジェクションの種類によっては、もう少し注意が必要なものもあるので、それぞれのページに分けました。
ここで見つけることができる:
コマンド・インジェクション
パス・トラバーサル⇄200D
SQLインジェクション
クロスサイト・スクリプティング