Personal blog Muhamad Irfan logo

Bongkar dan Rakit Ulang Payload web-ikepri

2 September 2026
5 min waktu baca
Bongkar dan Rakit Ulang Payload web-ikepri

terakhir saya melakukan pengujian web-ikepri yaitu tahun 2025, sekarang web-ikepri sudah berbenah dan sistem sudah semakin kuat untuk tidak mengijinkan ebook diunduh

berbagai lapisan sudah diterapkan, bahkan metode lama yang pernah saya tulis sudah tidak lagi relevan untuk digunakan

karena ketertarikan ini saya mencoba melakukan reverse sekali lagi, kali ini bukan mengunduh melalui bytes melainkan bongkar pasang payload yang sepenuhnya ter-enkripsi

apa saja tantangan yang saya temukan berikut akan saya bahas

Ebook yang dimuat perhalaman

saat mengecek lalu lintas jaringan, ebook yang terlihat tidak lagi diload secara keseluruhan

artinya ebook dibuat menjadi chunk (bagian) perhalaman, lalu dimuat secara satu persatu

hal ini tentu membuat pengunduhan menjadi sangat terbatas, karena akses untuk keseluruhan ebook sudah dikunci rapat

Payload Request yang dienkripsi

dilanjut dengan mengecek request yang memuat halamannya, mungkin ada celah lain yang bisa saya temukan

ternyata setelah dilihat payloadnya ter-enkripsi, jadi saya tidak tau payload apa yang dikirim

semua request payload di-enkripsi disisi client side dengan isi payload {’d’: ’enkripsi’, iv: ‘vektor’}

Cara yang masih bisa dilakukan

setelah mengetahui ebook yang dimuat secara terpisah, lalu dienkripsinya request payload, pengunduhan menjadi semakin kecil dilakukan

bukan berarti tidak bisa diunduh, hanya saja caranya akan lebih rumit untuk dilakukan

ide yang terpikirkan saat itu adalah dengan membuat monkey patching untuk menangkap data blob yang dibuat setelah data berhasil di-dekripsi

namun alih-alih menggunakan cara mudah, dan saya penasaran bagaimana cara kerja enkripsi payload request tersebut dibuat

maka saya mencoba untuk mereversenya

Mencari Script pembuat payload

langkah pertama yang saya lakukan adalah, mendebug kode javascriptnya untuk mencari script yang berfungsi untuk pembuatan payload

setelah ditelusuri dan menemukan scriptnya, ternyata enkripsi menggunakan AES-GCM

Membuat Script Enkripsi dan Dekripsi Payload

sayapun langsung menyalin script tersebut untuk dianalisa ai apakah bisa dibuatkan kebahasa pemrograman lain, ternyata bisa

pertama saya mencoba untuk membuat script decryptnya terlebih dahulu, untuk mengetahui isi payloadnya

disini saya membutuhkan key_hex untuk dapat mendekripsinya,

ternyata key_hex tersebut dimuat secara dinamis, saya menemukan key_hex tersebut berubah-ubah setiap beberapa waktu

setelah payload berhasil di dekripsi, ternyata pertahanan masih berlapis lagi

didalamnya terdapat payload dengan nama _pop yang isinya adalah data device serta perlindungan request agar tidak bisa dibajak menggunakan signature (tanda tangan yang sah)

Mencari Cara mendapatkan Private Key Signature

karena payload yang berisi pop tersebut merupakan kunci agar request terbaca sah diserver

disini saya harus mencari private key signaturenya terlebih dahulu yang nantinya digunakan untuk script enkripsi pembuatan payloadnya

dengan mendebug javascript, saya mencari script pembuat private keynya dengan awalan subtle.generateKey

setelah dilihat ternyata parameter extractable-nya diset false, artinya key tidak bisa ter-ekspos dan tidak bisa dilihat

cara mengatasinya adalah dengan monkey patching, disini saya menggunakan Tampermonkey (ektensi chrome) untuk melakukannya

dengan bantuan AI, script monkey patching berhasil dibuat.

fungsi script ini yaitu untuk mengoveride (menimpa) script window.crypto.subtle.generateKey agar extractable bisa diset menjadi true

setelah berhasil melakukan monkey patching sayapun bisa mengunduh private keynya dan memasukannya kescript enkripsi pembuat payload

Merakit Ulang Payload

setelah berhasil membuat script enkripsi, dekripsi. lalu mendapatkan private key dari signature yang akan digunakan untuk membuat payload yang valid.

saya langsung mencoba melakukan request dengan payload yang dirakit ulang dan ternyata requestnya gagal

saya mencoba mencari solusi dengan memahami lebih jauh isi payloadnya,

{
  'borrow_id': '',
  'device_id': '',
  '_pop': {
    'X-Device-Public-Key': '',
    'X-Device-Signature': '',
    'X-Timestamp': '',
    'X-Nonce': '',
    'X-Signature-JTI': '',
    'X-Body-SHA256': ''
  }
}

selain payload _pop ternyata ada 1 parameter lagi yang belum sinkron yaitu device_id, disini saya langsung menyamakan device_idnya dan…

request valid dan server merespon payload dengan benar

Terkena Rate Limiting

disini saya langsung merakit membuat script pengunduhan, dengan tehnik mengunduh halaman perhalaman, lalu ketika selesai diunduh semua menggabungkannya menjadi 1 file pdf

namun sayangnya ketika dipertengahan jalan saat melakukan pengunduhan ternyata ada keamanan yang tidak bisa dibantah yaitu rate-limit

belum 1 jam saya sudah mengunduh 170 halaman, rate-limiting aktif dengan keterangan dibatasi perjamnya

petualangan reverse berakhir disini, saya merasa puas karena bisa melakukan enkripsi dan dekripsi payload client side dibawa keluar dari browser

Apa saja yang saya pelajari

Request Encryption & Payload Wrapping

mengenkripsi data payload request agar tidak mudah terbaca inspektor biasa

Proof of Possession [PoP] & Request Signin

menandatangani (signature) request menggunakan kunci kriptografi (ECDSA/RSA) untuk membuktikan request benar-benar dilakukan secara sah

Device Binding

mengikat device_id agar request tidak bisa dilakukan secara sembarangan tanpa id yang valid

Dynamic key_hex Generator

kunci enkripsi dibuat secara dinamis agar setiap sesi tidak terikat pada kunci yang sama

artinya setiap payload pada sesi tersebut memiliki kunci yang berbeda dengan payload dengan sesi yang lain

Rate Limiting

jumlah request dibatasi sewajarnya, jika ada request yang terlalu cepat dalam satu waktu maka rate-limiting akan aktif

disini harus menunggu terlepas dari sesi rate-limit untuk bisa mengakses request lagi

Cara Saya Melakukan Pengunduhan

berikut bagaimana cara saya melakukan pengunduhan, semua script saya simpan didalam file zip

0
0
0
0