最もよく知られている脆弱性のクラスの 1 つは、インジェクションの脆弱性です。特に、誰もが疑う余地のない存在である SQL インジェクションは、誰も驚かないでしょう。テクノロジーの世界で SQL インジェクションについて耳にするのは避けられないので、ここではそのことについて話すことにします。
SQL インジェクションを使用すると、SQL クエリの動作を操作して攻撃者の命令を実行することができます。
表面的には異なりますが、すべて同じ原理に基づいて機能する注入タイプは他にもたくさんあります。
要約すると、最も一般的な注入タイプのいくつかは次のとおりです。
- SQL インジェクション
- クロスサイトスクリプティング (HTML/JavaScript インジェクション)
- パストラバーサル (パス/URL インジェクション)
- コマンド・インジェクション
- コード・インジェクション
ア・リトル・インジェクション 101
前述のインジェクションタイプのリストを見ると、すべて共通点が1つあります。それらはすべて文字列に関係し、それがインタープリターを介して実行され、インタープリターが文字列が表すすべての処理を行います。「ユーザー入力」は中括弧で囲んでいます。
| 유형 | 입력 예시 | 해석 방법 |
| SQL | SELECT name FROM users WHERE username = '{admin}' | 사용자 테이블의 모든 행에서 사용자 이름이 'admin'인 '이름' 열을 선택합니다. |
| HTML | {존 스미스} | "John Smith"라는 이름을 굵은 글씨로 표시합니다. |
| 경로 | /var/www/app/documents/{privacy-policy.pdf} | var/www/app/documents/` 폴더에 있는 `privacy-policy.pdf` 파일을 가리킵니다. |
| 명령 | ping {8.8.8.8} | IP `8.8.8.8`로 일련의 ICMP 핑을 보냅니다. |
| 코드 | const name = '{John Smith}'; | 상수 변수 'name'을 'John Smith' 값으로 설정합니다. |
では、ユーザー入力の挿入が安全でない場合はどうなるでしょうか。攻撃者には何ができるでしょうか?繰り返しになりますが、このシナリオでは、中括弧内のものはすべて「ユーザー入力」と見なされます。
| 유형 | 입력 예시 | 해석 방법 |
| SQL - 주입됨 | SELECT name FROM users WHERE username = '{1' UNION SELECT passwordhash from users WHERE username = 'admin}' | 사용자 테이블의 모든 행에서 사용자 아이디가 'admin'인 사용자의 '이름'과 사용자 아이디가 'admin'인 사용자의 비밀번호 해시를 선택합니다. |
| HTML - 삽입됨 | {} | "John Smith"라는 이름을 굵은 글씨로 표시합니다. |
| 경로 - 주입됨 | /var/www/app/documents/{../../../../../etc/shadow} | etc/` 폴더의 `shadow` 파일을 가리킵니다. |
| 명령 - 주입 | ping {8.8.8.8 && ls . } | IP `8.8.8.8`로 일련의 ICMP 핑을 보내고, 현재 디렉토리의 내용을 `ls`로 출력합니다. |
| 코드 - 주입 | const name = '{John Smith'; exec('ls .'); # }'; | 상수 변수 `name`을 `John Smith` 값으로 설정한 다음 시스템 명령 `ls`를 실행합니다. |
これらの例では、入力がどのようにユーザー入力の結果に影響を与えることができるかに注意してください。
これが注射の本質です。元のプログラマーが意図していたこととは違うことを実行させるために、インタープリターに渡される内容に影響を及ぼしているのです。
これらは考慮すべき基本事項にすぎません。もう少し注意が必要なため、いくつかの異なるインジェクションタイプを個別のページに分けました。
ここで見つけることができます:
コマンド・インジェクション
パストラバーサル
SQL インジェクション
クロスサイトスクリプティング