Lompat ke konten
dokumentasi.id
Commit 89c41b0
v1
Star3,2 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

4.2

Open Redirect dan CORS Misconfiguration

Uji open redirect membaca header Location, sedangkan uji CORS misconfiguration membaca header Access-Control-Allow-Origin. Repository ini menaruh keduanya di antara one-liner berbasis curl, dan keduanya memakai kerangka yang sama seperti uji LFI: kumpulkan URL, saring dengan pola gf, ganti nilai parameter, lalu periksa response. Kerangka gau | gf | qsreplace | xargs | curl | grep pertama muncul pada one-liner LFI di README.md:19-24, dan halaman XSS dan Local File Inclusion membahas pola itu untuk parameter berkas. Daftar placeholder seperti URL, URLS.txt, dan HOST dijelaskan di Placeholder dan Konvensi Penulisan One-liner.

Uji otomatis open redirect dengan gf redirect

One-liner open redirect otomatis ditulis oleh @dwisiswant0 dan hanya terdiri dari satu baris README.md:26-31. Nilai yang diharapkan muncul sebagai tujuan redirect disimpan di variabel LHOST, bukan di salah satu placeholder README.md:10-15, karena LHOST diciptakan sendiri oleh one-liner itu.

TahapPotongan perintahYang terjadi
1export LHOST="URL"Menetapkan URL tujuan yang dicari; export membuat nilainya diwarisi proses sh anak
2gau $1Mengambil URL historis dari argumen posisi pertama skrip, bukan dari placeholder HOST
3gf redirectMenyaring hanya URL yang nama parameternya cocok dengan pola redirect milik gf
4qsreplace "$LHOST"Mengganti nilai setiap parameter query string dengan isi LHOST
5xargs -I % -P 25 sh -cMenjalankan satu sh per URL, maksimal 25 proses paralel
6curl -Is "%"Mengirim request tanpa mengikuti redirect, lalu mencetak header saja
7grep -q "Location: $LHOST"Bila ada header yang memuat LHOST, jalankan echo "VULN! %"
sequenceDiagram
    autonumber
    participant OP as Operator
    participant GAU as gau
    participant GF as gf redirect
    participant QR as qsreplace
    participant SH as sh -c per URL
    participant TG as Target
    OP->>GAU: gau $1
    GAU->>GF: URL hasil arsip
    GF->>QR: URL dengan parameter redirect
    QR->>SH: nilai parameter diganti LHOST
    SH->>TG: curl -Is
    TG-->>SH: response header
    alt Location memuat LHOST
        SH-->>OP: VULN! URL
    else tidak ada header yang cocok
        SH-->>OP: tanpa output karena grep -q
    end
%% fig: Siklus satu URL pada uji open redirect otomatis
%% desc: Satu URL disaring gf redirect, nilai parameternya diganti LHOST, lalu header response diperiksa untuk memutuskan rentan atau tidak.
Fig. 1: Siklus satu URL pada uji open redirect otomatisSatu URL disaring gf redirect, nilai parameternya diganti LHOST, lalu header response diperiksa untuk memutuskan rentan atau tidak.

Ekspansi $LHOST di dalam grep -q "Location: $LHOST" tidak dikerjakan shell pemanggil. Perintah itu dibungkus kutip tunggal sebagai argumen sh -c, sehingga perluasan terjadi di proses sh anak yang mewarisi variabel dari export.

⚠️ grep di one-liner ini dipanggil tanpa -i, sehingga header location: berhuruf kecil tidak akan cocok walaupun server mengirimnya. Pola Location: $LHOST juga pencocokan substring, bukan kesamaan nilai: tujuan seperti https://evil.tld/?next=URL tetap lolos selama string LHOST muncul di baris Location.

Varian manual open redirect lewat proxy

Varian kedua dari @N3T_hunt3r tidak memakai verdict otomatis. Ia menyaring URL dengan pola gf url, menyimpan hasilnya ke url-redirect.txt lewat tee, lalu meneruskan berkas itu ke parallel dan membuang seluruh keluaran curl ke /dev/null README.md:33-36.

AspekVarian otomatis README.md:26-31Varian proxy README.md:33-36
Pola gfgf redirectgf url
Penggantian nilai parameterqsreplace "$LHOST"tidak ada
Eksekutor paralelxargs -I % -P 25parallel -j 10
Perintah curlcurl -Is "%"curl --proxy http://127.0.0.1:8080 -sk
Artefak hasilbaris VULN! % di stdoutriwayat proxy, stdout dibuang ke /dev/null
Penentu verdictgrep -qmanusia yang membaca response di proxy
graph LR
    U["gau $1 atau URLS.txt"]
    R["gf redirect"]
    J["gf url"]
    Q["qsreplace LHOST"]
    X["xargs -P 25"]
    C["curl -Is"]
    G["grep -q Location"]
    T["url-redirect.txt"]
    P["parallel -j 10"]
    C2["curl --proxy 127.0.0.1:8080 -sk"]
    U --> R
    R --> Q
    Q --> X
    X --> C
    C --> G
    U --> J
    J --> T
    T --> P
    P --> C2
    style R fill:#8b5cf6,color:#fff
    style J fill:#8b5cf6,color:#fff
    style T fill:#8b5cf6,color:#fff
    style G fill:#2d7d46,color:#fff
    style C2 fill:#f59e0b,color:#000
%% fig: Dua jalur saringan menuju verdict redirect
%% desc: Jalur gf redirect berakhir pada verdict otomatis grep, jalur gf url berakhir pada inspeksi manual di proxy.
Fig. 2: Dua jalur saringan menuju verdict redirectJalur gf redirect berakhir pada verdict otomatis grep, jalur gf url berakhir pada inspeksi manual di proxy.

Karena tee menulis url-redirect.txt sekaligus meneruskannya ke parallel, daftar kandidat tetap tersimpan setelah pengujian selesai dan bisa diputar ulang ke proxy lain tanpa mengulang gau.

CORS misconfiguration dengan Origin palsu

One-liner CORS dari @manas_hunter mengirim header Origin: https://evil.com ke setiap URL hasil gau, lalu mencari string yang sama di response README.md:351-356.

sequenceDiagram
    autonumber
    participant OP as Operator
    participant GAU as gau
    participant CU as curl
    participant TG as Target
    participant GR as grep
    OP->>GAU: gau "$site"
    GAU->>OP: daftar URL
    OP->>CU: curl -sIH "Origin: https://evil.com" -X GET
    CU->>TG: request dengan Origin palsu
    TG-->>CU: response header
    CU->>GR: stdout header disalurkan lewat pipe
    alt header memuat https://evil.com
        GR-->>OP: echo $url
    else tidak memuat
        GR-->>OP: Nothing on "$url"
    end
%% fig: Siklus satu URL pada uji CORS misconfiguration
%% desc: Origin palsu dikirim per URL, header response yang memantulkan nilai itu ditandai sebagai kandidat temuan.
Fig. 3: Siklus satu URL pada uji CORS misconfigurationOrigin palsu dikirim per URL, header response yang memantulkan nilai itu ditandai sebagai kandidat temuan.

Status baris itu di README berbeda dari niatnya. Beberapa bagian tidak dapat dieksekusi apa adanya:

BagianIsi di README.md:351-356Akibat
target=$(curl ...)Header response ditangkap ke variabel target$target tidak pernah dibaca di sisa baris
... ) | if grep ...Keluaran pipeline disalurkan ke ifif bukan perintah sederhana, sehingga bash gagal memparse baris ini
[Potentional CORS Found]Kurung siku tanpa pasangan, sebelum echoDibaca sebagai nama perintah [Potentional, bukan sebagai pesan
grep 'https://evil.com'Tanpa -i dan tanpa batas headerCocok pada header mana pun yang memuat string tersebut, bukan hanya Access-Control-Allow-Origin

⚠️ One-liner ini tidak pernah menyebut Access-Control-Allow-Credentials. Verdict-nya hanya menandai Origin yang dipantulkan di response, bukan membuktikan bahwa response bisa dibaca lintas-origin. Anggap keluarannya sebagai daftar kandidat, bukan bukti.

Batas verdict dari kedua one-liner

Kedua uji berhenti pada satu header. Uji redirect hanya melihat Location pada response pertama, dan curl tidak dipanggil dengan -L sehingga rantai redirect setelahnya tidak diperiksa. Uji CORS hanya melihat pantulan Origin tanpa memeriksa header izin lain di response yang sama README.md:351-356. Untuk menyusun kedua uji ini bersama toolchain lain dalam satu alur, lihat Alur Pipeline dan Toolchain.