最もよく知られている脆弱性のクラスの 1 つは、インジェクションの脆弱性です。特に、誰もが疑う余地のない存在である SQL インジェクションは、誰も驚かないでしょう。テクノロジーの世界で SQL インジェクションについて耳にするのは避けられないので、ここではそのことについて話すことにします。
SQL インジェクションを使用すると、SQL クエリの動作を操作して攻撃者の命令を実行することができます。
表面的には異なりますが、すべて同じ原理に基づいて機能する注入タイプは他にもたくさんあります。
要約すると、最も一般的な注入タイプのいくつかは次のとおりです。
- SQL インジェクション
- クロスサイトスクリプティング (HTML/JavaScript インジェクション)
- パストラバーサル (パス/URL インジェクション)
- コマンド・インジェクション
- コード・インジェクション
ア・リトル・インジェクション 101
前述のインジェクションタイプのリストを見ると、すべて共通点が1つあります。それらはすべて文字列に関係し、それがインタープリターを介して実行され、インタープリターが文字列が表すすべての処理を行います。「ユーザー入力」は中括弧で囲んでいます。
| 类型 | 输入示例 | 如何解释 |
| 查询语言 | SELECT name FROM users WHERE username = '{admin}' Name | 从用户表中用户名为 "admin "的所有行中选择 "姓名 "列 |
| 超文本标记语言 | {约翰-史密斯} | 用粗体字显示 "约翰-史密斯 "的名字 |
| 路径 | /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 ping |
| 代码 | const name = '{John Smith}'; | 将常量变量 `name` 设置为 `John Smith |
では、ユーザー入力の挿入が安全でない場合はどうなるでしょうか。攻撃者には何ができるでしょうか?繰り返しになりますが、このシナリオでは、中括弧内のものはすべて「ユーザー入力」と見なされます。
| 类型 | 输入示例 | 如何解释 |
| SQL - 注入 | 从用户中 SELECT name WHERE username = '{1' UNION 从用户中 SELECT passwordhash WHERE username = 'admin}' | 从用户表中用户名为 "admin "的所有行中选择 "姓名",并从用户名为 "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 . |
これらの例では、入力がどのようにユーザー入力の結果に影響を与えることができるかに注意してください。
これが注射の本質です。元のプログラマーが意図していたこととは違うことを実行させるために、インタープリターに渡される内容に影響を及ぼしているのです。
これらは考慮すべき基本事項にすぎません。もう少し注意が必要なため、いくつかの異なるインジェクションタイプを個別のページに分けました。
ここで見つけることができます:
コマンド・インジェクション
パストラバーサル
SQL インジェクション
クロスサイトスクリプティング