1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【セキュリティ】No-Space Injection(スペース禁止フィルタの突破術)

Posted at

はじめに

― スペースが無い?なら、作ればいいじゃない ―

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 などで値を分割
  • キーワード分割によるスペース無し構文

“スペース禁止=安全”という考えは完全に破綻している。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?