これはSQLインジェクションの問題ではなくパーセントエンコードの問題ですね。
ブラウザはアドレスバーに入力された一部の記号文字を自動的にパーセントエンコードします。その文字は、RFCで決まっているものと、RFCで必須とはされていないものの「安全側に倒して」パーセントエンコードするものがあります。後者の対象文字はブラウザにより違います。
以下の記事によると、シングルクォートはパーセントエンコードが必須の文字ではありませんが、「他の文字もエンコードできます」ということなので、Google ChromeやFirefoxではエンコードされます。一方、IEではエンコードされません。これらはRFCの規約通りの正しい処理です。
エンコードが必要な特殊文字は、':', '/', '?', '#', '[', ']', '@', '!', '$', '&', "'", '(', ')', '*', '+', ',', ';', '='、および '%' 自体です。他の文字もエンコードできますが、エンコードする必要はありません。
Percent-encoding (パーセントエンコーディング) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
では、そもそもなぜパーセントエンコードが必要かというと、クエリ文字列や x-www-form-urlencoded 形式のPOSTパラメータでは、name1=value1&name2=value2 ... という形式でパラメータ名とパラメータ値を指定するので、名前や値の文字列に = や & などの記号が入ると「紛らわしい」からです。例えば、value1として「1&name3=4」という値を指定すると、
等となるので、受け取り側は以下のように解釈してしまいます。
name1: 1
name3: 4
name2: 2
これを避けるには、&→%26 =→%3d とエンコードして、
name1=1%26name3%3d&name2=2
とする必要があります。そうすると、名前や値の中に区切り文字(&や=)が含まれないので、「紛らわしさ」がなくなります。RFCでは他の状況も含めて、さらに多くの文字をエンコード対象にしているわけです。
ということで、ご質問への回答ですが、
なぜこの「'」は%エンコーディング(%3B)が必要ないのでしょうか?
これはRFCに要求がなく、上記の「紛らわしさ」にも該当しないからです。
イマイチどのタイミングでエンコーディングが必要なのかがわからないです。
パーセントエンコードについては、URLを記載する際やアドレスバーに設定する際に必要になります。例外はMETHOD=GETのフォームでinput要素等に指定する場合で、この場合はブラウザが自動的にパーセントエンコードしてくれます。パーセントエンコードが必要な文字はRFCで規定されていますが、パーセントエンコードが必要とされる文字でも文脈上誤解の余地がなければブラウザが適当に解釈してくれます。
(コメントへの返答を追記)
■つまり、METHOD=GETのフォームでパラメータを送信し、その値をBurpSuiteなどで改竄する時は、
パーセントエンコーディングされた値を挿入しなければならないという理解であっておりますでしょうか?
はい。そのとおりです。
また、すいません、上記に関連して、一つ追加で質問をさせて頂けないでしょうか。
■「例外はMETHOD=GETのフォームで〜」とご回答頂いておりますが、METHOD=POSTとcookieに保存された値もブラウザが自動的にパーセントエンコードしてくれるのでしょうか?
POSTはその通りです。cookieは言語やライブリに依存しますが、PHPのsetcookieの場合はパーセントエンコードしますが、setrawcookieの場合はパーセントエンコードしません。そもそもcookieをセットするのはブラウザではないですね。ブラウザはサーバーがSet-Cookieヘッダで指定した値を保存するだけで、その際にパーセントエンコードは考慮しません。