Comment2Shell (CVE-2026-93485) — Kolom Komentar WordPress Jadi Pintu Masuk RCE

Comment2shell (CVE-2026-93485) — Kolom Komentar WordPress Jadi Pintu Masuk RCE

CVE-2026-93485 · CVSS 7.1 · Patched: WordPress 7.1.1 (17 September 2026) · Disclosed: 21 September 2026. Unauthenticated stored XSS via kolom komentar — payload diubah dari HTML jinak menjadi live JavaScript event handler melalui 4-tahap cascading transformation di filter rendering WordPress. Jika administrator membuka halaman tersebut, serangan dapat berlanjut ke PHP code execution. Ditemukan oleh Rafie Muhammad (Awesome Motive / IDNSEC).

Siapa pun — termasuk pengunjung anonim yang tidak memiliki akun — bisa meninggalkan komentar di WordPress. Itu adalah fitur inti yang sudah ada sejak awal. Comment2Shell mengeksploitasi cara WordPress memproses ulang komentar sebelum ditampilkan: empat filter rendering yang masing-masing benar secara individual, tapi ketika dieksekusi berurutan, mengubah HTML jinak menjadi live JavaScript event handler tanpa satu pun modifikasi pada input asli. Jika komentar itu dibuka oleh administrator yang sedang login, rantai serangan bisa berlanjut sampai shell di server.

 Action item: Update WordPress ke versi berikut sesuai branch yang digunakan:• WordPress 7.1 → 7.1.1
• WordPress 7.0 → 7.0.5
• WordPress 6.9 → 6.9.8
• Branch 4.7 ke atas → install versi patch untuk branch masing-masing (hingga 4.7.36)

Belum bisa update? Nonaktifkan kolom komentar sementara, atau tambah WAF rule untuk memblokir payload Comment2Shell.


1. Overview — CVE di Satu Pandang

[CVE-2026-93485 — QUICK FACTS]

CVE ID: CVE-2026-93485

Nama:  Comment2XShell/Comment2XSS

CVSS Score: 7.1 (High) — ditetapkan oleh Patchstack

Tipe: Unauthenticated Stored XSS → PHP Code Execution

Entry point: Kolom komentar publik (wp-comments-post.php)

Auth required: Tidak — siapa pun bisa submit komentar berbahaya

Versi terdampak: WordPress 4.7 hingga 7.1

Versi aman: 7.1.1 / 7.0.5 / 6.9.8 / patch per branch hingga 4.7.36

Theme yang terdampak: Semua block theme (default sejak Twenty Twenty-Two) + classic theme tertentu (Twenty Twenty-One)

Discovered by: Rafie Muhammad (Awesome Motive Inc. / IDNSEC) via WordPress HackerOne bug bounty

Reported: 8 September 2026 → Patched: 17 September 2026 → Disclosed: 21 September 2026

KEV / Aktif dieksploitasi: Tidak ada konfirmasi per tanggal disclosure

Aspek Detail
XSS trigger Zero-click — event handler terpicu otomatis saat halaman dimuat, tanpa interaksi pengunjung
XSS impact Kode berjalan di browser siapapun yang membuka halaman — dengan level akses orang tersebut
RCE precondition Administrator yang sedang login harus membuka halaman berisi komentar berbahaya
Approval bypass Ada minimal 3 jalur bypass moderasi komentar — moderation bukan security control
Patch Satu baris regex di wpautop() — quote-aware subpattern yang menutup seluruh celah
💡 Konteks dalam seri kerentanan WordPress 2026: Comment2Shell adalah kerentanan WordPress Core ketiga yang serius dalam tahun ini. Sebelumnya: wp2shell (Juli 2026) — zero-interaction unauthenticated RCE, sudah masuk daftar CISA KEV. XSS2Shell (Agustus 2026) — pre-auth reflected XSS di wp-login.php. Ketiganya adalah bug terpisah dengan jalur berbeda — tapi semua berujung ke eksekusi kode di server.

2. Root Cause — 4-Tahap Cascading Transformation

Kerentanan ini hidup di celah antara dua momen: saat komentar disimpan dan saat komentar ditampilkan. WordPress mensanitasi input menggunakan KSES saat penyimpanan, lalu memformatnya ulang melalui rantai filter comment_text saat rendering. Keempat filter ini — yang masing-masing benar secara individual — ketika dieksekusi berurutan menghasilkan transformasi yang tidak diinginkan.

[FILTER CHAIN — comment_text]

wptexturize → convert_chars → make_clickable → force_balance_tags → convert_smilies → wpautop

Setiap filter memodifikasi HTML. Kombinasinya menciptakan transformasi berbahaya.

Tahap demi tahap — dari komentar jinak ke event handler aktif:

Tahap Filter Yang Terjadi
1. Input KSES (saat save) <blockquote cite="a\nb"><code>x" onfocus=alert() autofocus</code></blockquote> lolos karena blockquote[cite] diizinkan dan newline (\n) tidak di-encode KSES.
2. Newline → comment wpautop() Setiap newline di dalam tag diubah menjadi <!-- wpnl -->. Attribute cite sekarang berisi komentar HTML yang memiliki > sendiri.
3. Tag injeksi wpautop() Regex [^>]* berhenti di > pertama — yang ada di dalam <!-- wpnl -->. Tag <p> diinjeksikan di tengah nilai attribute cite, bukan setelah tag blockquote.
4. Quote encoding wptexturize() <p> yang terinjeksi dianggap batas tag. Quote (") di luar <code> di-encode menjadi ” (typographic). Quote di dalam <code> tetap lurus — dan menjadi penutup attribute yang membawa event handler keluar sebagai attribute aktif.
5. Hasil akhir Browser blockquote memiliki onfocus, autofocus, dan tabindex sebagai attribute nyata. autofocus memicu onfocus saat halaman dimuat — tanpa klik apapun.

Payload komentar — dikirim anonim tanpa cookie atau nonce:

# Payload dikirim ke wp-comments-post.php
curl -si -X POST “https://target.com/wp-comments-post.php” \
–data-urlencode $’comment=

x" onfocus=alert(document.domain) autofocus tabindex=0

‘ \
-d ‘comment_post_ID=1’ \
-d ‘author=anon’ \
-d ’email=anon@example.com’ \
-d ‘comment_parent=0’

# HTML yang tersimpan di database (tampak jinak):
<blockquote cite=”a\nb”><code>x” onfocus=alert(document.domain) autofocus tabindex=0</code></blockquote>

# HTML setelah dirender oleh filter chain (sudah berbahaya):
<blockquote cite=”a
<p> b”><code>x” onfocus=alert(document.domain) autofocus tabindex=0</code></p></blockquote>

# Browser memparsing: blockquote sekarang punya onfocus + autofocus
# Event handler terpicu otomatis saat halaman dimuat — tanpa interaksi

💡 Mengapa ini bukan bug KSES: KSES melakukan tugasnya dengan benar — input di-sanitasi dan hanya HTML yang diizinkan yang tersimpan. Bug-nya ada di wpautop() yang memodifikasi HTML tersebut menjadi bentuk yang tidak aman saat rendering. Stored value di database tidak berbahaya; yang berbahaya adalah apa yang keluar setelah filter chain dieksekusi.

3. Approval Bypass — Moderasi Bukan Security Control

WordPress menyebut kerentanan ini “subject to comment approval” — seolah moderasi adalah perlindungan. Rafie Muhammad dan Patchstack menjelaskan dengan tegas: moderasi komentar bukan security control. Ada minimal tiga jalur di mana komentar berbahaya bisa muncul di halaman tanpa persetujuan moderator.

  • 1. Gunakan identitas commenter default WordPress
    Instalasi WordPress baru selalu memiliki satu komentar bawaan dari A WordPress Commenter (wapuu@wordpress.example). Komentar yang dikirim dengan nama dan email yang sama langsung disetujui otomatis oleh check_comment() — tanpa memerlukan moderasi.
  • 2. Setting moderasi dimatikan
    Opsi “Comment author must have a previously approved comment” yang ada di Settings → Discussion bisa dinonaktifkan. Dalam kondisi ini, komentar dari identitas baru langsung disetujui.
  • 3. Akses komentar yang masih pending
    Komentar yang belum dimoderasi tetap terrender untuk pengguna yang memiliki cookie comment_author_ — yaitu siapa pun yang pernah berkomentar di situs tersebut. Attacker bisa berbagi link ?unapproved=<id>&moderation-hash=<hash> yang bisa diakses siapa saja, termasuk administrator.
⚠️ Implikasi: Mengandalkan moderasi komentar sebagai mitigasi Comment2Shell adalah pendekatan yang salah. Satu-satunya mitigasi yang reliable adalah update ke versi yang sudah di-patch, atau menonaktifkan kolom komentar sepenuhnya sambil menunggu update.

4. Dari XSS ke RCE — Rantai Eksploitasi Lengkap

JavaScript yang berjalan di browser administrator membuka akses ke plugin installer WordPress. Upload plugin adalah jalur yang sudah dikenal dari XSS dengan administrator-context ke eksekusi kode di server.

[EXPLOIT CHAIN — XSS TO SHELL]

Step 1: Attacker (anonim) kirim komentar dengan payload ke post manapun.

Step 2: Komentar muncul di halaman (via salah satu jalur bypass approval di atas).

Step 3: Administrator yang sedang login membuka halaman tersebut.

Step 4: Event handler terpicu otomatis — JavaScript berjalan di session administrator.

Step 5: Script membaca upload nonce dari plugin installer form (/wp-admin/plugin-install.php?tab=upload).

Step 6: Script membangun file ZIP berisi PHP webshell di memory, lalu upload via /wp-admin/update.php?action=upload-plugin.

Step 7: Plugin tidak perlu diaktifkan — file PHP langsung bisa diakses dan menjalankan command sebagai web server user.

# Setelah webshell ter-upload, command bisa dieksekusi langsung:
curl “https://target.com/wp-content/plugins/x/x.php?c=id”
# Output: uid=33(www-data) gid=33(www-data) groups=33(www-data)# Command apapun berjalan sebagai web server user
# Tanpa aktivasi plugin, tanpa FTP, tanpa file editor

⚠️ Penting: Update WordPress tidak menghapus webshell atau perubahan yang mungkin sudah dibuat attacker sebelum patch diterapkan. Situs yang dicurigai sudah dikompromikan harus dilakukan audit menyeluruh — periksa plugin yang tidak dikenal, file yang tidak biasa di direktori /wp-content/, dan akun administrator yang tidak dikenal.

5. Patch — Satu Baris Regex yang Menutup Segalanya

Fix yang diterapkan di WordPress 7.1.1 adalah satu perubahan di wpautop() — mengganti regex yang tidak bisa melewati quoted attribute value dengan subpattern yang quote-aware.

# wp-includes/formatting.php:563# Sebelum (WordPress 7.1 ke bawah) — rentan:
$text = preg_replace( ‘|<p><blockquote([^>]*)>|i’, ‘<blockquote$1><p>’, $text );
# [^>]* berhenti di > pertama yang ditemukan — termasuk > di dalam

# Sesudah (WordPress 7.1.1) — aman:
$text = preg_replace( ‘!<p><blockquote((?:[^>”\'”]|”[^”]*”|\'[^\’]*\’)*)>!i’, ‘<blockquote$1><p>’, $text );
# Subpattern quote-aware: melewati seluruh nilai attribute yang dikutip
# Capture berjalan sampai akhir cited value yang sebenarnya
# <p> diinjeksi setelah > yang benar-benar menutup tag blockquote

Satu baris ini sudah cukup karena wpautop() adalah satu-satunya tempat di mana sesuatu diinjeksikan di dalam tag. Dengan subpattern baru, capture berjalan melewati seluruh nilai attribute cite="a <!-- wpnl --> b", dan <p> baru diinjeksikan setelah > yang benar-benar menutup tag — bukan di tengah attribute value.


6. Mitigasi — Langkah yang Harus Dilakukan

  • 1. Update WordPress — prioritas utama
    Update ke versi patch sesuai branch. Gunakan WP-CLI untuk proses yang lebih cepat dan terkontrol.
  • 2. Jika belum bisa update — nonaktifkan komentar
    Settings → Discussion → matikan “Allow people to submit comments on new posts”. Ini menutup entry point utama sementara patch belum bisa diterapkan.
  • 3. Terapkan WAF rule
    Web Application Firewall atau security plugin dapat memblokir payload Comment2Shell di level request. Ini mitigasi berlapis — bukan pengganti update.
  • 4. Audit situs yang dicurigai sudah dikompromikan
    Periksa plugin tidak dikenal di /wp-content/plugins/, file PHP baru di direktori yang tidak biasa, dan akun administrator yang tidak pernah dibuat. Update tidak membersihkan backdoor yang mungkin sudah ditanam.
  • 5. Aktifkan auto-update WordPress core
    WordPress mendukung background auto-update untuk security release. Aktifkan fitur ini agar patch keamanan diterima otomatis tanpa intervensi manual.
# Update via WP-CLI
wp core update# Verifikasi versi setelah update
wp core version
# Output yang aman: 7.1.1

# Cek plugin yang tidak dikenal
wp plugin list

# Cek file PHP yang baru dibuat (dalam 7 hari terakhir)
find /var/www/html/wp-content/ -name “*.php” -mtime -7 -type f

# Cek akun administrator yang tidak dikenal
wp user list –role=administrator


TL;DR

  • Comment2Shell = unauthenticated stored XSS di kolom komentar WordPress → PHP code execution
  • Versi terdampak: WordPress 4.7 hingga 7.1 dengan block theme atau classic theme tertentu
  • XSS terpicu zero-click — autofocus event handler aktif saat halaman dimuat
  • RCE butuh administrator yang sedang login membuka halaman berisi komentar berbahaya
  • Moderasi komentar bukan security control — ada 3 jalur bypass yang terdokumentasi
  • Root cause: regex [^>]* di wpautop() tidak bisa melewati quoted attribute value
  • Patch: satu baris regex quote-aware di wpautop() — backport ke semua branch hingga 4.7
  • Update ke 7.1.1 / 7.0.5 / 6.9.8 sesuai branch. Audit situs jika dicurigai sudah dikompromikan.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *