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-241, 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-312. Nilai yang diharapkan muncul sebagai tujuan redirect disimpan di variabel LHOST, bukan di salah satu placeholder README.md:10-153, karena LHOST diciptakan sendiri oleh one-liner itu.
| Tahap | Potongan perintah | Yang terjadi |
|---|---|---|
| 1 | export LHOST="URL" | Menetapkan URL tujuan yang dicari; export membuat nilainya diwarisi proses sh anak |
| 2 | gau $1 | Mengambil URL historis dari argumen posisi pertama skrip, bukan dari placeholder HOST |
| 3 | gf redirect | Menyaring hanya URL yang nama parameternya cocok dengan pola redirect milik gf |
| 4 | qsreplace "$LHOST" | Mengganti nilai setiap parameter query string dengan isi LHOST |
| 5 | xargs -I % -P 25 sh -c | Menjalankan satu sh per URL, maksimal 25 proses paralel |
| 6 | curl -Is "%" | Mengirim request tanpa mengikuti redirect, lalu mencetak header saja |
| 7 | grep -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.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.
⚠️
grepdi one-liner ini dipanggil tanpa-i, sehingga headerlocation:berhuruf kecil tidak akan cocok walaupun server mengirimnya. PolaLocation: $LHOSTjuga pencocokan substring, bukan kesamaan nilai: tujuan sepertihttps://evil.tld/?next=URLtetap lolos selama stringLHOSTmuncul di barisLocation.
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-364.
| Aspek | Varian otomatis README.md:26-31 | Varian proxy README.md:33-36 |
|---|---|---|
Pola gf | gf redirect | gf url |
| Penggantian nilai parameter | qsreplace "$LHOST" | tidak ada |
| Eksekutor paralel | xargs -I % -P 25 | parallel -j 10 |
Perintah curl | curl -Is "%" | curl --proxy http://127.0.0.1:8080 -sk |
| Artefak hasil | baris VULN! % di stdout | riwayat proxy, stdout dibuang ke /dev/null |
| Penentu verdict | grep -q | manusia 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.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-3565.
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.Status baris itu di README berbeda dari niatnya. Beberapa bagian tidak dapat dieksekusi apa adanya:
| Bagian | Isi di README.md:351-356 | Akibat |
|---|---|---|
target=$(curl ...) | Header response ditangkap ke variabel target | $target tidak pernah dibaca di sisa baris |
... ) | if grep ... | Keluaran pipeline disalurkan ke if | if bukan perintah sederhana, sehingga bash gagal memparse baris ini |
[Potentional CORS Found] | Kurung siku tanpa pasangan, sebelum echo | Dibaca sebagai nama perintah [Potentional, bukan sebagai pesan |
grep 'https://evil.com' | Tanpa -i dan tanpa batas header | Cocok 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-3565. Untuk menyusun kedua uji ini bersama toolchain lain dalam satu alur, lihat Alur Pipeline dan Toolchain.