ライザムーン(LizaMoon)攻撃に対してもWAFは有効
ライザムーン攻撃に対する行き届いた解説を読みました。
大規模インジェクション 「LizaMoon」攻撃について調べてみた。 - piyolog
ここで紹介されている内容は素晴らしいと思うのですが、一点、WAFに関する以下の記述が引っかかりました。
SQLインジェクションであれば既知の攻撃手法でありWAFで防ぐことは出来るのではという考え方もありますが、例えばブラックリストタイプのWAFでこの数値リテラル型をつくSQLインジェクションを防ぐことが出来ません。HTTPリクエストとして受けた文字列だけで、最終的にデータベースに対して発行されるSQLでその文字列がどのような扱いになるか(数値リテラルになるのかどうか)判断することが出来ないためです。
本当にブラックリストタイプのWAFで防ぐことができないのでしょうか。IBMのレポートに紹介されている以下の攻撃で考えてみます。
/target.asp?id%3D17871+update+【テーブル名】+set+【カラム名】%3DREPLACE(cast(...
https://www-950.ibm.com/blogs/tokyo-soc/?lang=ja
これはターゲットサイトのテーブルを改ざんするリクエストのURLですが、確かにシングルクォート「'」もセミコロン「;」も使われていないため、昔のWAFだと素通ししてしまいそうです。
しかし、現代的なWAFであればそうではありません。日経SYSTEMS 2009年3月号に「WAFでWebアプリの脆弱性を守れるか」という検証レポートを書いた際に以下の5製品でWAFを検証しました。その際のメモを元に、ライザムーン攻撃とWAFの関係について検討します。
- 米F5 Networksの「BIG-IP Application Security Manager(以下,BIG-IP)」
- 米Citrix Systemsの「Citrix Application Firewall(以下,Citrix)」
- 米Impervaの「SecureSphere」
- 米Barracuda Networksの「Barracuda Web Application Firewall(以下,Barracuda)」
- ジェイピー・セキュアの「SiteGuard」
日経システムズの検証の際に用いたパターンの一つがこれです。
1 update pet set kind=CAST(0x48494a AS VARCHAR(2000)) where id=1001
このパターンは、ライザムーン攻撃の特徴をいくつか含んでいます。
- 数値リテラルに対するSQLインジェクションであること
- セミコロンのない複文を使用していること
- シングルクォートを用いずcast関数を使用していること
このため、このパターンをブロックできれば、ライザムーン攻撃もブロックできる可能性が高いと考えられます。
結果は以下の通りです。
BIG-IP | Citrix | SecureSphere | Barracuda | SiteGuard |
---|---|---|---|---|
○ | × | △(検知のみ) | ○ | ○ |
ご覧のように、このパターンを検知できなかったWAFはCitrixのみでした。今回の検証ではホワイトリストの設定はしていないので、ブラックリストによりライザムーン型のSQLインジェクション攻撃が検知できたことになります。
まとめ
ライザムーン攻撃に似た攻撃パターンを用いて、WAFのブラックリストでこの種の攻撃が検知できることを示しました。
id:Kangoさんの「ブラックリストタイプのWAFでこの数値リテラル型をつくSQLインジェクションを防ぐことが出来ません」という認識は、古いWAFのイメージに引きずられた典型的な誤解と考えられます。現実には、2008年(この検証を実施した時期)には、多くのWAFがライザムーン型の攻撃を防御できる性能を持っていたことになります。
したがって、WAFへの過信は禁物でアプリケーション側の対策が重要ではあるものの、既存アプリケーションに対する防御や、多層防御の一つとして、WAFは有効であると考えます。