Kue Lapis dan com_weblinks Joomla. Peretasan dan add-on Tautan web kotor php


Mari kita mulai melihat komponen dengan melihat bagaimana komponen dasar Weblinks beroperasi di bagian admin situs web. Komponen yang khas untuk bagian situs web ini sangat mirip dengan komponen lain yang dirancang untuk mengelola artikel, pengguna, modul, dll.

File program untuk komponen ini tercantum di bawah. Semua file ini terletak di folder administrator/components/com_weblinks. Sepanjang sisa bab ini, semua nama file komponen Weblinks dirujuk relatif ke folder awal ini kecuali dinyatakan lain. Sebagian besar file disusun menurut pola MVC. Secara khusus, semua file tampilan ada di subfolder tampilan, dan semua file model utama dan pengontrol masing-masing ada di subfolder model dan pengontrol. Mereka juga dilengkapi dengan instalasi, konfigurasi dan file tambahan.

File bagian administratif komponen Weblinks, kecuali file index.html

  • controllers/weblink.php - Pengontrol utama untuk mengedit Pengontrol tautan web tunggal
  • controllers/weblinks.php - Pengontrol utama untuk mengkompilasi Pengontrol dan menampilkan daftar tautan web di layar Weblinks Manager
  • helpers/weblinks.php - Menyediakan berbagai metode yang digunakan dalam pengontrol dan tampilan
  • models/fields/ordering.php - Model JformField menampilkan kolom pemesanan tautan web di layar Manajer Tautan Web
  • models/forms/weblink.xml - File XML yang digunakan di kelas Jform-Model Field untuk menata formulir dengan kolom input dan mengedit tautan web di layar
  • models/weblink.php - Model untuk satu layar membentuk model tautan Web
  • models/weblinks.php - Model untuk formulir layar pengelola Model tautan web
  • sql/install.mysql.utf8.sql - File SQL untuk membuat tabel tautan web selama instalasi
  • sql/uninstall.mysql.ut8.sql - File SQL untuk menghapus tabel weblink selama instalasi
  • tabel/weblink.php - Menyediakan kelas Model
  • views/weblink/tmpl/edit_metadata.php - File tata letak sumber untuk mengedit metadata tautan web

Bagian administratif dari komponen Weblinks

  • views/weblink/tmpl/edit_params.php - File tata letak sumber untuk mengedit opsi pemilihan tautan web tunggal
  • views/weblink/tmpl/edit.php - File tata letak sumber untuk mengedit tautan web
  • views/view.html.php - Kelas tampilan utama untuk menampilkan satu tautan web dalam format HTML File tata letak sumber untuk pengelola tautan web
  • views/weblinks/view.html.php - Kelas tampilan utama untuk menampilkan tautan web dalam format HTML langsung di layar Weblinks Manager
  • access.xml - File XML yang menyediakan daftar tindakan untuk sistem daftar kontrol akses (ACL).
  • config.xml - File XML yang menyediakan daftar opsi untuk memilih konfigurasi komponen
  • controller.php - Kelas pengontrol utama
  • weblinks.php - Titik masuk untuk permintaan
  • weblinks.xml - File XML yang digunakan untuk mengontrol proses instalasi

kue berlapis

Kita akan berbicara tentang komponen com_weblinks dan markup html halaman Joomla. Tentang cara membuat direktori link di website Joomla dengan mudah dan sederhana.

CMS ini dibuat untuk pekerjaan interaktif dengan pengguna terdaftar, tanpa pengkodean langsung. Meskipun tren pengembangan Joomla mengarah pada pengabaian komponen com_weblinks karena sama sekali tidak berguna di situs, dan hanya menambah bobot ekstra (lebih dari 100 kb - 90 file) ke sistem yang sudah “berat”. Namun untuk saat ini komponen ini masih ada di distribusi dan digunakan oleh beberapa programmer.

Halaman situs web Joomla yang terlihat di layar adalah kue lapis, yang konstruksinya melibatkan banyak blok (dan karenanya banyak templat) secara bersamaan. Di sinilah filosofi Joomla berperan - pembuatan situs blok besar. Setiap blok harus memiliki templat markup HTML (tata letak) sendiri.

Blok utama:

Templat halaman utama (site_template/index.php), yang dengan markup htmlnya menentukan posisi modul dan komponen serta menampilkan modul dan komponen tersebut.
- templat halaman
- templat modul
- templat komponen

Masing-masing blok besar ini tersedia untuk diedit (diubah). Artinya, Anda dapat mengedit secara terpisah, misalnya, templat modul atau komponen apa pun, dan templat tersebut akan terlihat baru di halaman. Hal yang sama berlaku untuk templat halaman.

Mungkin sulit bagi programmer pemula untuk memahami bahwa baris pertama di bagian konten halaman ditampilkan sebagai judul halaman dan diedit pada halaman edit item menu yang mengarah ke halaman ini. Bahwa baris kedua berasal dari template komponen com_content atau com_weblinks. Dan string dalam templat biasanya berupa variabel string dan inisialisasi serta pelokalannya dilakukan dalam file bahasa, seperti bahasa\ru-RU\ru-RU.mod_weblinks.ini dan sejenisnya.

Terkadang seorang pemula bingung dengan templat mana yang menghasilkan baris ini atau itu, yang pada halaman layar tampak seperti kelanjutan logis dari narasi yang sama. Ternyata satu baris ada di satu templat, satu baris lagi di templat kedua, dan baris ketiga di templat ketiga. Dan tabel tab di bawah ini adalah output dari template modul mod_tabform.

Terkadang templat modul disebut tata letak. Tapi ini adalah pertanyaan tentang terminologi. Esensinya sama - ini adalah "pakaian" untuk isinya. Akan lebih tepat untuk mengatakan menandai. Jadi, markup satu halaman layar terletak di file direktori Joomla yang berbeda.

Menu

Banyak programmer Joomla baru sering tidak memahami bahwa item menu dapat memiliki tipe yang berbeda-beda. Dengan kata lain, item menu dapat merujuk ke objek Joomla dengan tipe berbeda. Ini bisa berupa objek yang berbeda, seperti: komponen (voting, pencarian, direktori tautan, dll.).

Memilih jenis item menu:

Kontak (com_contact)
Daftar kategori kontak (kategori)
Daftar kontak dari kategori tertentu (kategori)
Kontak
Kontak favorit (unggulan)

Materi (com_content)
Bahan arsip (arsip)
Materi (artikel)
Daftar semua kategori (kategori)
Kategori blog
Daftar kategori bahan (category)
Bahan unggulan
Buat materi

Pencarian cerdas (com_search)
Mencari

Halo Dunia! (com_helloworld)
Pesan (halo dunia)

Umpan berita (com_newsfeeds)
Daftar semua kategori umpan berita (kategori)
Daftar feed berita dalam kategori (category)
Umpan berita

Pencarian (com_search)
Formulir pencarian dan daftar hasil pencarian (search)

Manajer Pengguna (com_users)
Formulir otorisasi (login)
Profil pengguna (profil)
Ubah profil pengguna
Formulir pendaftaran
Pemulihan nama pengguna (ingat)
Mengubah kata sandi (reset)

Pembungkus (com_wrapper)
Pembungkus

Seperti yang Anda lihat, di sini semua jenis menu adalah komponen. Berdasarkan namanya, tipe item menu sebenarnya menunjukkan nama template dari tipe komponennya. Dan templat komponen terletak di direktori views:

joomla\components\com_weblinks\views\categories
joomla\components\com_weblinks\views\category
joomla\components\com_weblinks\views\weblink
joomla\components\com_users\views\login

Seperti yang Anda lihat, nama tipe link di menu dan nama template di direktori vews adalah sama.

Pengembang memiliki kemampuan untuk membuat templat (tata letak) non-standar baru untuk komponen. Tata letak baru ini juga akan tercermin sebagai tipe menu baru di jendela pemilihan tipe menu. Ini adalah topik yang terpisah.

Konten demo distribusi Joomla

Mari kita lihat bagaimana hierarki item Menu "Tentang Joomla" dibangun untuk menampilkan Komponen com_weblinks pada template Joomla konten demo default (Beez2 - Default).

Mari pergi ke panel admin untuk mengedit komponen com_weblinks: Komponen->Links. Kami melihat bahwa dalam konten demo yang disertakan dengan distribusi, lima kategori telah dibuat untuk komponen com_weblinks. Artinya tautan tersebut akan didistribusikan ke dalam lima kategori. Semua kategori yang dibuat akan disimpan dalam tabel database #_categories. Kategori untuk komponen lainnya juga disimpan dalam tabel yang sama.

Contoh Data-Weblink
|-Tautan Taman
|-Joomla! Tautan Khusus
|-|-Sumber Daya Lainnya
Tidak dikategorikan

Di menu Tentang Joomla (di editor menu), hierarki item menu telah dibuat sesuai:

Hirarki item menu:

Menggunakan Joomla! (jenis: bahan)
|-Menggunakan Ekstensi (ketik: daftar semua kategori) :: daftar kategori dalam materi
|-|-Komponen (ketik: kategori blog) :: kategori dalam materi
|-|-|-Komponen Tautan Web (jenis: bahan)
|-|-|-|-Kirim Weblink (ketik: buat tautan) :: pada komponen Links
|-|-|-|-Weblinks Single Category (ketik: daftar link dalam suatu kategori) :: pada komponen Links
|-|-|-|-Kategori Tautan Web (ketik: daftar kategori tautan) :: di komponen Tautan

Kita melihat bahwa beberapa item menu memiliki tipe: daftar kategori, daftar tautan dalam suatu kategori, dan buat tautan.
"Daftar Kategori Tautan" menentukan kategori teratas dari mana hierarki akan ditampilkan.
"Daftar link dalam kategori" menentukan kategori yang linknya akan ditampilkan.
Di item “Buat tautan”, formulir akan ditampilkan yang harus diisi oleh pengguna terdaftar.
Omong-omong, seperti inilah tampilan tautan ke formulir ini di editor (tampilannya akan berubah di bilah alamat):

indeks.php?option=com_weblinks&view=form&layout=edit

Beberapa item menu hanya dapat ditampilkan kepada pengguna terdaftar! Misalnya, item menu dengan jenis "Buat tautan" hanya akan terlihat oleh pengguna terdaftar. Fitur ini dibuat khusus agar pengguna terdaftar dapat membuat link yang akan diposting pada halaman tersebut.

Dengan demikian, komponen com_weblinks menyediakan cara yang baik untuk mengisi halaman secara interaktif dengan link yang menarik. Selain itu, semua tautan yang akan ditempatkan pada halaman tersebut memiliki pengalihan, artinya tidak akan diindeks sebagai eksternal. Anda mungkin pernah melihat tautan seperti itu di forum. Saat Anda mengarahkan mouse ke tautan tersebut, Anda akan melihat alamat situs Anda, dan hanya setelah mengkliknya Anda akan diarahkan ke alamat yang Anda tentukan.

Kemampuan pengguna untuk menambahkan tautan ke situs eksternal adalah keuntungan dan makna utama komponen com_weblinks, begitu pula kemampuan pengguna untuk menambahkan konten baru - artikel, gambar, file video, dll.

Mengizinkan pengguna terdaftar yang memiliki hak untuk mengisi situs dengan konten tanpa pengkodean langsung adalah filosofi dasar CMS Joomla.

Tidak dikategorikan
Contoh Data-Artikel
|- Joomla!
|-|- Ekstensi
|-|-|- Komponen
|-|-|- Modul
|-|-|-|- Modul Konten
|-|-|-|- Modul Pengguna
|-|-|-|- Modul Tampilan
|-|-|-|- Modul Utilitas
|-|-|-|- Modul Navigasi
|-|-|- Templat
|-|-|-|- Atom
|-|-|-|- Bagus 20
|-|-|-|- Bagus 5
|-|-|- Bahasa
|-|-|- Plugin
|- Situs Taman
|-|- Blog Taman
|-|- Galeri Foto
|-|-|- Hewan
|-|-|- Pemandangan
|- Situs Toko Buah
|-|- Petani
|-|- Resep

Tampaknya tidak terlalu banyak kategori untuk konten!
Anda juga bisa melihat hierarki kategori dalam bahan menggunakan kueri ke tabel kategori di database:

PILIH * DARI `#_categories` DI MANA `ekstensi` = "com_content"

Bulan ini, penggali bug tidak ingin memanjakan kita dengan eksploitasi baru yang terkenal di aplikasi populer. Tentu saja, banyak nasihat telah diterbitkan pada produk-produk perusahaan terkenal, tetapi sangat sedikit di antaranya yang berisi kode PoC yang dapat dibaca. Dalam ulasan kami, saya mencoba mengumpulkan kerentanan paling signifikan dan lengkap yang dijelaskan baru-baru ini, jadi duduk santai dan nikmati membaca.

Kerentanan PHP saat memproses permintaan HTTP Head Singkat

Pada tanggal 3 Maret, Adam Ivanyuk menemukan fitur menarik di penerjemah PHP, yang tidak memproses permintaan HEAD dengan benar. Peneliti menyebut kerentanan ini sebagai “trik metode HTTP HEAD dalam skrip php.”

Banyak pembuat kode mendesain skrip PHP mereka dengan harapan bahwa semua instruksi yang tertulis di dalamnya akan berhasil dijalankan tanpa terputus di tengah-tengahnya (terutama dalam skrip pendek). Inilah yang terjadi jika skrip diminta oleh pengguna akhir menggunakan metode GET, POST, PUT.

Namun Anda harus tahu bahwa ada metode HTTP lain - misalnya, HEAD. Justru ketika memproses metode ini di PHP, celah keamanan mungkin muncul.

Mari kita lihat salah satu sumber penerjemah: ./main/SAPI.c, baris 315:

jika (SG(request_info).request_method &&
!strcmp(SG(request_info).request_method, "HEAD"))
{
SG(request_info).headers_only = 1;
...

Ketika ada data yang masuk, fungsi php_ub_body_write dijalankan. Selanjutnya lihat main/output.c, baris 699:

jika (SG(request_info).headers_only) (
jika(SG(header_terkirim))
{
kembali 0;
}
php_header(TSRMLS_C);
zend_bailout();
}

Di sini Anda dapat melihat bahwa pertama kali dicetak ke layar dan saat menggunakan metode HEAD, fungsi zend_bailout merusak skrip.

Mengeksploitasi

Sekarang mari kita akses skrip ini menggunakan metode HEAD:

Seperti yang Anda harapkan, buku tamu kami akan menghentikan eksekusinya pada baris “echo $data;”, sehingga file book.txt akan direset ke nol.
Contoh ini sifatnya agak merusak. Pada contoh kedua, kita dapat melewati otorisasi di panel admin primitif:

Dalam skrip ini, saat masuk menggunakan metode biasa, variabel administratif diatur dalam sesi. Kemudian, jika pengguna memasukkan kata sandi yang salah, variabel ini akan disetel ulang dan pengguna tidak menjadi admin.

Jika kita mengakses panel admin melalui HEAD, eksekusinya akan terganggu pada potongan kode dengan "echo", sehingga variabel administratif tidak akan disetel ulang, dan kita dapat dengan aman menjelajahi bagian aplikasi yang tertutup. Hal yang perlu diingat di sini adalah sebagian besar server web memiliki nilai buffering keluaran yang disetel ke 4096 byte, jadi dalam contoh kerja kita mungkin memerlukan string 'String panjang berisi sekitar 4090 karakter'.

Mengeksploitasi
  • PHP

    Di sini array $check berisi data POST kita, dan variabel $locked adalah string serial yang dikaburkan menggunakan fungsi str_rot13(), yang sepenuhnya berada di bawah kendali kita.

    Pada titik ini ada baiknya membuat penyimpangan kecil bagi mereka yang belum membaca artikel terkait di ] [, dan berbicara secara singkat tentang bug yang muncul dalam metode ajaib PHP. Maka pada PHP versi 5 muncul konsep dasar pemrograman OOP: konstruktor dan destruktor. Konstruktor diimplementasikan menggunakan metode "__construct" dan destruktor diimplementasikan menggunakan metode "__destruct". Setelah menyelesaikan pekerjaannya dan ketika dipanggil melalui fungsi unserialize(), setiap objek mengeksekusi metode __ destructnya sendiri, jika itu tertulis dalam kode.

    Sekarang mari kembali ke kerangka kerja kita dan lihat destruktor kelas Aplikasi dari file ./libs/configure.php:

    fungsi __menghancurkan()
    {
    jika ($ini->__cache)
    {
    $core = Aplikasi::core("kue");
    tidak disetel($ini->__jalur);
    Cache::write("dir_map", array_fi filter($ini->__paths),
    "kue_inti");
    Cache::write("fi le_map", array_fi filter($ini->__map),
    "kue_inti");
    Cache::write("object_map", $ini->__objects,
    "kue_inti");
    }
    }

    Dari kode di atas, Anda dapat melihat bahwa metode ini dapat disusupi dengan menulis nilai arbitrer ke objek Cache. Kunci yang paling menarik untuk dipecahkan adalah 'file_map'. Ia mengelola koneksi antar kelas dan file PHP terkait, dan juga digunakan untuk memuat kelas tambahan selama eksekusi skrip.

    Kode sebenarnya untuk memuat kelas sedikit lebih rumit, tetapi semuanya bermuara pada kode berikut dari metode __load di dalam kelas App:

    Bingo! Dengan mengganti variabel $file, kita dapat memasukkan kode PHP kita sendiri! Selain itu, ini akan menjadi bug Inklusi File Jarak Jauh yang sebenarnya - jadi, kita tidak memerlukan trik tambahan apa pun untuk mengunggah file lokal ke server. Namun, pembuat kerentanan yang ditemukan menawarkan opsi LFI untuk mengeksploitasi lubang ini, karena CakePHP menggunakan cache lokal berbasis file, yang terletak dalam bentuk serial di direktori yang diketahui penyerang.

    Mengeksploitasi

    Sebagai PoC kecil untuk menghasilkan string serial beracun, felix menawarkan kode berikut:

    Tentunya Anda harus menyertakan terlebih dahulu kelas-kelas yang diperlukan dari CakePHP. Ada juga eksploitasi Python yang berfungsi penuh, yang dapat Anda temukan di malloc.im/burnedcake.py.

    Eksploitasi ini seharusnya bekerja di setiap aplikasi yang dibangun di CakePHP, menggunakan formulir POST dengan token keamanan, dan lokasi standar file cache tidak diubah. Secara default, eksploitasi menampilkan konfigurasi database; fitur berguna lainnya dapat dengan mudah ditambahkan dengan mengubah payload PHP bawaan.

    Target
    • CakePHP getState("fi filter_order_dir");
      $fi filter_order = JFilterInput::clean($fi filter_order, "cmd");
      $fi filter_order_dir =
      JFilterInput::clean($fi filter_order_dir, "kata");
      // Kita perlu mendapatkan daftar semuanya
      // tautan web dalam kategori tertentu
      $query = "PILIH *" .
      "DARI #__tautan web" .
      "DIMANA kucing = ". (int) $ini->_id.
      "DAN diterbitkan = 1" .
      "DAN diarsipkan = 0".
      "DIPESAN OLEH". $fi filter_order "".
      $fi filter_order_dir .", memesan";
      kembalikan $permintaan;
      }

      Di sini Anda dapat melihat bahwa variabel $filter_order dan $filter_order_dir tidak diperiksa kepatuhannya terhadap pernyataan SQL; pemeriksaan hanya dilakukan dengan menggunakan metode bersih standar dari kelas JFilterInput:

      Kami menempelkan kode ini di mana saja di situs, yang menampilkan 5 tautan acak dari database dan jangkar acak. Lebih baik mencairkan jangkar daripada menulis hanya 1 pada tautan. Dengan penautan yang tepat di situs web Anda, Anda akan segera melihat peningkatan lalu lintas dan peningkatan indikator situs web lainnya.

      Saya menantikan pertanyaan Anda di komentar posting ini.

      Tanggal terbit: 03 Maret 2014
        Ulasan dan komentar:

        Dmitry :
        Terima kasih untuk skripnya, saya akan menerapkannya. Tidak mungkin menyalin kode sumber dari situs; hanya disalin sebagian kecil; akan lebih nyaman jika keseluruhannya.

        Cyril :
        Terima kasih atas catatan tentang penyalinan, saya baru melihatnya sekarang, saya akan segera mencoba memperbaikinya.

        Alexei Pavlov:
        Kesalahan pada baris $tex = meledak(":",$sendlist[$count] Anda memerlukan titik koma, bukan titik dua. Saya mengubah sedikit kode agar lebih jelas: