今夜分かるSQLインジェクション対策Security&Trust ウォッチ(42)

» 2006年11月02日 10時00分 公開
[上野宣@IT]

【関連記事】

本内容についてのアップデート記事を公開しています。あわせてご確認ください(編集部)

Security&Trustウォッチ(60)
今夜こそわかる安全なSQLの呼び出し方 〜 高木浩光氏に聞いてみた

http://www.atmarkit.co.jp/fsecurity/column/ueno/60.html



 Web1SQLPHPmagic_quotes_gpc

 SQLSQL

SQL


 SQLSQL InjectionWeb1SQL使SQL使

 SQLIPAWeb20069141%221%SQLWeb

 SQL

 uidpwd
SELECT * FROM user WHERE uid='$uid' AND pwd='$pwd' 

 $uid$pwd

 $uid   :  ueno

 $pwd  :  ' OR 'A'='A


 これを入力するとSQLは以下のようになる。

SELECT * FROM user WHERE uid='ueno' AND pwd='' OR 'A'='A'

 OR

 SELECTDELETESQL

【関連リンク】隠されていたSQLインジェクション

http://www.atmarkit.co.jp/fsecurity/rensai/hoshino09/hoshino01.html


 この問題の対策としては、入力値には半角英数字のみを許可するよう制限する方法や、以下の例のようにSQLで使える特殊文字をエスケープして対処するという方法が一般的になっている。

 '    →  ''

 \   →  \\

【注】

「\」を拡張してるRDBMSでは「\\」とエスケープする必要がある



 SQL

SQL


 SQLHTML

 GETPOSTCookieHTTPHTTPSQL

 $uid'''

 $uid  :   ueno' union……


イメージ図

 SQL使SQL

 SQL

使SQL


 SQL''使

 
SELECT name FROM user where uid = '$uid' AND age > $age

 このSQLに渡される$uidと$ageの特殊文字は、適切にエスケープされているとしよう。ここに次のような値を渡す。

 $uid   :  ueno

 $age  :  31 UNION……


 これを入力するとSQLは以下のようになる。

SELECT name FROM user where uid = 'ueno' AND age > 31 UNION……

 UNIONSQLage
SELECT name FROM user where uid = '$uid' AND age > '$age'

マルチバイト文字の問題

 マルチバイト文字というのは、シフトJISやEUC-JPなどの2バイト文字などのことを指す。このマルチバイト文字を適切に処理しないと思わぬところでSQLインジェクションが発生することがある。

 PHPならばaddslashes()といった関数を使って、フォームから受け取った入力値に含まれる「'」を「\'」と置換するなどの処理をしてSQLインジェクションによる攻撃を回避しようとするかもしれない。

 以下の例を見てみよう。

 \x97' OR A=A   →   予' OR A=A


 「\x97' OR A=A」を前述のように「'」を「\'」とエスケープして処理してみると、「予' OR A=A」と変換されることがある。これはシフトJISの環境で発生する現象だ。

 この現象を詳しく見てみよう。

 \x97' → \x97\'


 ポイントとなるのは「\x97'」の部分で、これの「'」をエスケープするために「\'」と置換すると「\x97\'」となる。

 「\'」の部分もエンコードしてみると、「\x5C\x27」となり、全体では「\x97\x5C\x27」となる。

 \x97\x5C\x27 → '


 これを文字に戻すと、手前から「\x97\x5C」が2バイト文字として扱われて「予」となり、「\x27」が1バイト文字として扱われてしまい「'」となる。

 予' OR A=A


 結果として、「'」を「\'」とエスケープしたはずなのに、「'」が残ってしまうという現象が起きる。

 シフトJISは2バイト文字だが、中には2バイト目に1バイト文字の文字コードを含んだ文字がある。そのためにこのような現象が起きる。

 \x94\x5C → 能

 \x95\x5C → 表

 \x96\x5C → 暴



 \x97''''

 JIS使EUC-JP使

 1


Perl Encode::from_to($str, "sjis","sjis");

PHP mb_convert_encoding($str, 'SJIS', 'SJIS')


 PHPmagic_quotes_gpc

 SQL

【関連リンク】マルチバイトの落とし穴マルチバイトの落とし穴 http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino01.html


SQLインジェクション対策


 SQL2005SQL

Web



SQL

JIS1

SQLO/RObject/Relational





Web



WAFWeb Application Firewall

IDSIntrusion Detection SystemIPSIntrusion Prevention System










 WAF

 1


 SQLSQL

Profile


  





TCP/IPHTTP

●修正履歴


2006/11/2

SQL使\RDBMS\\

SQL\'''


2006/11/6

SQLWebSQL  SQL

「SecurityTrust ウォッチ」バックナンバー


SQL  

Web

Perl Mongers



 Black Hat Japan 2008AVTokyo2008

 Black Hat Japan 2008AVTokyo2008

 

!? 

CeCOS II

 

 





Web10

 1

1



WindowsSysinternals

SQL



CSSCSSXSS







 



Whoppix使

 CSRF

25







 







  PC 









Blaster









SARS



MS



Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。