Share
## https://sploitus.com/exploit?id=8C428402-EB58-5578-9BE2-6A1A753F581C
# ๐Ÿ”ฌ sqli-research
### Time-Based Blind SQL Injection โ€” Riset, PoC & Mitigasi

> **DISCLAIMER:** Seluruh materi dalam repositori ini **hanya untuk keperluan
> edukasi dan riset keamanan yang diotorisasi pada lingkungan localhost/lab yang
> terisolasi**. Mengeksekusi teknik-teknik ini terhadap sistem apapun tanpa
> izin tertulis yang eksplisit adalah tindakan ilegal berdasarkan hukum
> kejahatan siber yang berlaku dan sepenuhnya menjadi tanggung jawab pengguna.
> Penulis tidak bertanggung jawab atas segala bentuk penyalahgunaan.

---

## ๐Ÿ“‹ Daftar Isi
1. [Gambaran Umum](#gambaran-umum)
2. [Deskripsi Kerentanan](#deskripsi-kerentanan)
3. [Proof of Concept & Pembahasan Teknis](#proof-of-concept--pembahasan-teknis)
4. [Tantangan Inti: False Positive](#tantangan-inti-false-positive)
5. [Solusi: Logika Double Verification](#solusi-logika-double-verification)
6. [Mitigasi](#mitigasi)
7. [Struktur Repositori](#struktur-repositori)
8. [Lingkungan & Cara Penggunaan](#lingkungan--cara-penggunaan)

---

## Gambaran Umum

Repositori ini mendokumentasikan latihan riset terfokus pada **Time-Based Blind
SQL Injection**, salah satu varian SQLi yang paling menantang secara teknis
karena sifatnya yang sepenuhnya inferensial dan berbasis *side-channel*. Lebih
dari sekadar mereproduksi kelas serangan yang sudah dikenal, penelitian ini
secara khusus menginvestigasi masalah reliabilitas di dunia nyata โ€” **false
positive akibat latensi jaringan** โ€” dan mengimplementasikan solusi rekayasa
kustom untuk menanganinya.

Repositori ini disusun sebagai artefak portofolio keamanan yang praktis,
mendemonstrasikan pemahaman ofensif (bagaimana kerentanan dieksploitasi)
sekaligus panduan defensif (bagaimana kerentanan tersebut diperbaiki secara
permanen).

---

## Deskripsi Kerentanan

**SQL Injection (SQLi)** terjadi ketika sebuah aplikasi memasukkan data yang
dikendalikan pengguna tanpa sanitasi langsung ke dalam kueri database, sehingga
memungkinkan penyerang mengubah struktur logis kueri tersebut.

**Blind SQLi** adalah varian di mana aplikasi tidak mengembalikan pesan error
atau hasil kueri yang terlihat kepada penyerang. Sebagai gantinya, kebenaran
harus disimpulkan dari *efek samping* yang dapat diamati dari perilaku aplikasi.

**Time-Based Blind SQLi** mengeksploitasi efek samping yang spesifik: **latensi
respons**. Dengan menyuntikkan pernyataan kondisional `IF(kondisi, SLEEP(N), 0)`,
penyerang "memerintahkan" database untuk berhenti selama `N` detik *jika dan
hanya jika* kondisinya bernilai benar. Karena kondisi tersebut dapat menguji
karakter individual dari data sensitif, penyerang dapat merekonstruksi seluruh
string rahasia (misalnya, hash password) satu karakter dalam satu waktu, murni
dengan mengukur waktu respons HTTP.

```
Request normal   โ†’ respons ~50ms    โ†’ kondisi bernilai FALSE
SLEEP tersuntik  โ†’ respons ~3050ms  โ†’ kondisi bernilai TRUE
```

**Penyebab Utama:** Konstruksi kueri dinamis melalui penggabungan string
(*string concatenation*), di mana input pengguna tidak pernah dipisahkan secara
struktural dari sintaks SQL.

---

## Proof of Concept & Pembahasan Teknis

**File:** [`time_based_sqli_poc.py`](./time_based_sqli_poc.py)

### Konteks Target

Analisis *white-box* mengungkap bahwa kueri login di sisi backend membungkus
username dalam tanda kurung:

```sql
SELECT * FROM users WHERE username=('$username') AND password='$password'
```

Konteks ini mengharuskan payload menutup tanda kurung pembuka sebelum
menyuntikkan logika berbahaya.

### Struktur Payload

```
admin') AND IF((SELECT SUBSTRING(password,{pos},1) FROM users WHERE username='admin')='{char}', SLEEP(3), 0) #
```

| Segmen | Tujuan |
|---|---|
| `admin')` | Memenuhi sintaks `('$username')` asli dan menutupnya dengan benar |
| `AND IF(...)` | Menambahkan ekspresi kondisional yang dievaluasi oleh MySQL |
| `SELECT SUBSTRING(password, N, 1)` | Mengekstrak karakter ke-N dari password target |
| `= '{char}'` | Menguji apakah karakter tersebut sama dengan kandidat saat ini |
| `SLEEP(3)` | Menyebabkan jeda 3 detik jika kondisi bernilai TRUE |
| `0` | Mengembalikan respons instan jika kondisi bernilai FALSE |
| `#` | Komentar baris MySQL โ€” menetralisir sisa kueri asli |

### Loop Ekstraksi

Skrip mengiterasi setiap posisi karakter `(1 โ†’ MAKS)` dan setiap kandidat
karakter dalam ruang pencarian `(a-z, 0-9, A-Z, karakter khusus)`. Untuk setiap
pasangan `(posisi, kandidat)`, skrip mengirimkan payload dan mengukur waktu
respons terhadap ambang batas. Ketika kecocokan terkonfirmasi, karakter
ditambahkan ke hasil dan loop berpindah ke posisi berikutnya.

---

## Tantangan Inti: False Positive

Serangan berbasis waktu secara inheren bersifat **probabilistik**, bukan
deterministik. Inilah keterbatasan paling signifikan di dunia nyata.

Sebuah paket jaringan dapat tertunda karena:

- **Retransmisi TCP** setelah terjadi kehilangan paket
- **Jeda GC di sisi server** atau lonjakan CPU yang bersifat sementara
- **Shared hosting contention** atau gangguan penjadwalan hypervisor
- **Overhead pemrosesan CDN / reverse proxy**

Faktor-faktor ini dapat mendorong respons `~50ms` yang tak bersalah melampaui
ambang batas `3000ms`, menyebabkan skrip yang naif merekam karakter secara
keliru โ€” **merusak seluruh string yang diekstrak secara diam-diam** tanpa
indikasi bahwa ada yang salah.

```
Alur skrip naif:
  Kirim payload untuk char='a', pos=1
  Waktu respons = 3,2s  โ† lonjakan jaringan, BUKAN hit SLEEP
  Skrip mencatat 'a'    โ† SALAH. Korupsi data diam-diam.
```

Ini bukan kekhawatiran teoretis โ€” dalam praktiknya, bahkan lingkungan localhost
pun menunjukkan jitter yang terukur saat ada beban.

---

## Solusi: Logika Double Verification

PoC mengimplementasikan **mekanisme gating dua tahap** untuk mengeliminasi
kelas false positive ini secara struktural.

```
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚               ALUR DOUBLE VERIFICATION                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                  โ”‚
โ”‚  Kirim REQUEST PRIMER untuk (pos, char)                         โ”‚
โ”‚         โ”‚                                                        โ”‚
โ”‚         โ”œโ”€โ”€ elapsed prepare("SELECT id FROM users WHERE username = :username");
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->execute();
```

**Mengapa ini kebal terhadap SQLi:**

1. `prepare()` mengirimkan template kueri ke engine database untuk dikompilasi
   *sebelum* data pengguna ada dalam gambar. Struktur kueri terkunci.
2. `bindParam()` mengirimkan nilai pengguna sebagai **data scalar bertipe**,
   bukan sebagai teks SQL mentah. Engine DB tidak memiliki fase parsing di mana
   karakter injeksi (`, ', --, )`, `SLEEP()`) dapat memperoleh makna sintaktis.
3. Ini bersifat arsitektural, bukan kosmetik โ€” tidak seperti fungsi *escaping*,
   tidak dapat dilewati dengan trik encoding atau karakter set edge-case.

**Lapisan Defense-in-Depth Tambahan:**

| Lapisan | Kontrol |
|---|---|
| Validasi Input | Buat allowlist format yang diharapkan sebelum mencapai lapisan DB |
| Least Privilege | User DB hanya boleh memiliki SELECT/INSERT pada tabel yang diperlukan |
| Aturan WAF | Rate-limit dan tandai respons dengan pola latensi anomali |
| Penanganan Error | Jangan pernah mengekspos error DB mentah โ€” informasi tersebut membocorkan skema |

---

## Struktur Repositori

```
sqli-research/
โ”œโ”€โ”€ README.md                  โ† Dokumen ini
โ”œโ”€โ”€ time_based_sqli_poc.py     โ† Python PoC teranotasi dengan Double Verification
โ””โ”€โ”€ mitigation_example.php     โ† Perbandingan kode PHP rentan vs. aman
```

---

## Lingkungan & Cara Penggunaan

> โš ๏ธ **Jalankan hanya di dalam lab yang terisolasi. Jangan pernah terhadap target eksternal.**

**Stack lab yang direkomendasikan:**
- [DVWA](https://github.com/digininja/DVWA) atau container Docker kustom
- MySQL 5.7+ (diperlukan untuk dukungan `SLEEP()`)
- Python 3.8+ dengan library `requests`

**Setup:**
```bash
# Instal dependensi
pip install requests

# Jalankan PoC hanya terhadap lab lokal
python3 time_based_sqli_poc.py
```

**Contoh output terminal (dipersingkat):**
```
============================================================
  Time-Based Blind SQLi PoC โ€” sqli-research
  [PENGGUNAAN EDUKASI / LAB TEROTORISASI SAJA]
============================================================

[*] Memulai ekstraksi password via Time-Based Blind SQLi
    Target  : http://target-lab.local/login.php
    Charset : 72 karakter
    Sleep   : 3.0s  |  Threshold : 3.0s
    Maks    : 40 karakter

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
[*] Menyelidiki posisi 01....
  [~] Respons lambat (3.14s) terdeteksi untuk '5' di pos 1. Menjalankan verifikasi... โœ“ TERKONFIRMASI (verify: 3.09s)
[+] Posisi 01 โ†’ '5'  |  Hasil ekstraksi: '5'
...
```

---