July Tech Festa 2015にて登壇した際の資料です。
なお後日、小河さんがOpen VASのCLI操作の解説について以下のスライドを追加投稿してくれました!
「フリーでできるセキュリティチェック OpenVAS CLI編」
http://www.slideshare.net/abend_cve_9999_0001/openvas-cli-51048313
12. ■ SQL インジェクション
Prepared Statementって
準備された文という意味。
SELECT * FROM users WHERE id = ’ test ’ AND pwd = ’ ’ OR ’1’=’1’ ;
入力の結果、「OR '1'='1'」としてSQLが評価(赤箇所)され、作成者の意図と
異なる挙動(SQL文の構文が変更される)になる。
そうならないために・・・
SELECT * FROM users WHERE id =
AND pwd = ;?
?
実行されるSQLを事前に用意しておく。
データベースアプリケーション
id =
pwd =
test
pass
必要な情報だけ引き渡す。
Prepared Statementは、引き渡される情報(パラメータ)のみ受け渡してSQL文の
構文変化を行わせないようにしている。
SELECT * FROM users WHERE id = ’ test ’ AND pwd = ’ ’ ’ OR ’ ’ 1’ ’ =’ ’ 1 ’ ;
26. 論理和トラップを調査してみた
こんなテーブル(users)にデータをセット。
ID:varchar NAME:varchar
■ SQL インジェクション
ID NAME
1 aaa
2 bbb
3 cccc
a ddd
b eee
論理和の第二オペランドがTrueかどうかが肝。Falseの場合でも第一オペランドの値で
マッチする条件が対象となる。Trueの判定も最初の文字が0以外の数字ならいけちゃう。
(環境:CentOS MySQL5.1.67、WinXP MySQL5.6.11)
① SELECT * FROM users WHERE id = '1' || '1'; 実行結果:全5件出力された。
② SELECT * FROM users WHERE id = '1' || '0'; 実行結果:ID「1」のみ1件出力された。
③ SELECT * FROM users WHERE id = 'a' || '1'; 実行結果:全5件出力された。
④ SELECT * FROM users WHERE id = 'a' || '0'; 実行結果:ID「a」のみ1件出力された。
⑤ SELECT * FROM users WHERE id = 'a' || '1xx'; 実行結果:全5件出力された。
⑧ SELECT * FROM users WHERE id = 'c' || 1; 実行結果:全5件出力された。
⑥ SELECT * FROM users WHERE id = 'a' || '01'; 実行結果:全5件出力された。
⑦ SELECT * FROM users WHERE id = 'a' || 'x1'; 実行結果:ID「a」のみ1件出力された。