pautan web php pendapatan. Kek Lapis dan com_weblinks Joomla. Fail lain yang digunakan dalam komponen

Kek lapis

Kami akan bercakap tentang komponen com_weblinks dan penanda html halaman Joomla. Mengenai cara mudah dan ringkas membuat direktori pautan pada tapak web Joomla.

CMS ini dicipta untuk kerja interaktif dengan pengguna berdaftar, tanpa pengekodan langsung. Walaupun trend pembangunan Joomla membawa kepada pengabaian komponen com_weblinks sebagai tidak berguna sama sekali di tapak, dan hanya menambah berat tambahan (lebih daripada 100 kb - 90 fail) kepada sistem yang sudah "berat". Tetapi buat masa ini komponen ini masih terdapat dalam pengedaran dan digunakan oleh beberapa pengaturcara.

Halaman laman web Joomla yang boleh dilihat pada skrin ialah kek lapis, dalam pembinaannya banyak blok (dan oleh itu banyak templat) terlibat secara serentak. Di sinilah falsafah Joomla berperanan - pembinaan tapak blok besar. Setiap blok mesti mempunyai templat penanda HTML sendiri (reka letak).

Blok utama:

Templat halaman utama (site_template/index.php), yang dengan penanda htmlnya mentakrifkan kedudukan untuk modul dan komponen serta memaparkan modul dan komponen ini.
- templat halaman
- templat modul
- templat komponen

Setiap blok besar ini tersedia untuk diedit (perubahan). Iaitu, anda boleh mengedit secara berasingan, sebagai contoh, templat mana-mana modul atau komponen, dan ia akan kelihatan baharu pada halaman. Begitu juga dengan templat halaman.

Mungkin sukar bagi pengaturcara baru untuk memahami bahawa baris pertama dalam bahagian kandungan halaman dipaparkan sebagai tajuk halaman dan diedit pada halaman edit item menu yang menghala ke halaman ini. Bahawa baris kedua diperoleh daripada templat komponen com_content atau com_weblinks. Dan rentetan dalam templat biasanya merupakan pembolehubah rentetan dan pemulaan dan penyetempatan mereka dijalankan dalam fail bahasa, seperti language\ru-RU\ru-RU.mod_weblinks.ini dan seumpamanya.

Kadangkala seorang pemula bingung dengan templat yang menghasilkan baris ini atau itu, yang pada halaman skrin kelihatan seperti kesinambungan logik naratif yang sama. Ternyata satu baris berada dalam satu templat, satu lagi dalam templat kedua, dan satu baris ketiga dalam templat. Dan jadual tab di bawah adalah output daripada templat modul mod_tabform.

Kadangkala templat modul dipanggil susun atur. Tetapi ini adalah persoalan istilah. Intinya adalah sama - ia adalah "pakaian" untuk kandungannya. Adalah lebih tepat untuk mengatakan menandai. Jadi, penanda satu halaman skrin terletak dalam fail direktori Joomla yang berbeza.

Menu

Ramai pengaturcara Joomla baru sering tidak memahami bahawa item menu boleh mempunyai jenis yang berbeza. Dalam erti kata lain, item menu boleh merujuk kepada objek Joomla daripada jenis yang berbeza. Ini boleh menjadi objek yang berbeza, seperti: komponen (mengundi, carian, direktori pautan, dll.).

Memilih jenis item menu:

Kenalan (com_contact)
Senarai kategori kenalan (kategori)
Senarai kenalan bagi kategori tertentu (kategori)
Kenalan
Kenalan kegemaran (ditampilkan)

Bahan (com_content)
Bahan arkib (arkib)
Bahan (artikel)
Senarai semua kategori (kategori)
Kategori blog
Senarai kategori bahan (kategori)
Bahan pilihan
Buat bahan

Carian pintar (com_search)
Cari

Hai dunia! (com_helloworld)
Mesej (helloworld)

Suapan berita (com_newsfeeds)
Senarai semua kategori suapan berita (kategori)
Senarai suapan berita dalam kategori (kategori)
suapan berita

Cari (com_search)
Borang carian dan senarai hasil carian (carian)

Pengurus Pengguna (com_users)
Borang kebenaran (log masuk)
Profil pengguna (profil)
Tukar profil pengguna
Borang pendaftaran
Pemulihan nama pengguna (peringatan)
Menukar kata laluan (set semula)

Pembungkus (com_wrapper)
Pembalut

Seperti yang anda lihat, di sini semua jenis menu adalah komponen. Dengan namanya, jenis item menu sebenarnya menunjukkan nama templat jenis komponennya. Dan templat komponen terletak dalam direktori pandangan:

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 jenis pautan dalam menu dan nama templat dalam direktori vews adalah sama.

Pembangun mempunyai keupayaan untuk mencipta templat bukan standard baharu (susun atur) untuk komponen. Reka letak baharu ini juga akan ditunjukkan sebagai jenis menu baharu dalam tetingkap pemilihan jenis menu. Ini adalah topik yang berasingan.

Kandungan demo pengedaran Joomla

Mari lihat bagaimana hierarki item Menu "Perihal Joomla" dibina untuk memaparkan Komponen com_weblinks pada kandungan demo lalai (Beez2 - Lalai) templat Joomla.

Mari pergi ke panel pentadbir untuk mengedit komponen com_weblinks: Komponen->Pautan. Kami melihat bahawa dalam kandungan demo yang disertakan dengan pengedaran, lima kategori telah dibuat untuk komponen com_weblinks. Ini bermakna pautan akan diedarkan kepada lima kategori. Semua kategori yang dibuat akan disimpan dalam jadual pangkalan data #_categories. Kategori untuk komponen lain juga disimpan dalam jadual yang sama.

Contoh Data-Pautan Web
|-Pautan Taman
|-Joomla! Pautan Khusus
|-|-Sumber Lain
Tidak dikategorikan

Dalam menu Perihal Joomla (dalam editor menu), hierarki item menu telah dibuat dengan sewajarnya:

Hierarki item menu:

Menggunakan Joomla! (jenis: bahan)
|-Menggunakan Sambungan (jenis: senarai semua kategori) :: senarai kategori dalam bahan
|-|-Komponen (jenis: blog kategori) :: kategori dalam bahan
|-|-|-Komponen Pautan Web (jenis: bahan)
|-|-|-|-Serahkan pautan Web (taip: buat pautan) :: dalam komponen Pautan
|-|-|-|-Kategori Tunggal Pautan Web (jenis: senarai pautan dalam kategori) :: dalam komponen Pautan
|-|-|-|-Kategori Pautan Web (jenis: senarai kategori pautan) :: dalam komponen Pautan

Kami melihat bahawa beberapa item menu mempunyai jenis: senarai kategori, senarai pautan dalam kategori dan buat pautan.
"Senarai Kategori Pautan" menentukan kategori teratas yang mana hierarki akan ditunjukkan.
"Senarai pautan dalam kategori" menentukan kategori yang pautannya akan dipaparkan.
Dalam item "Buat pautan", borang akan dipaparkan yang perlu diisi oleh pengguna berdaftar.
Dengan cara ini, ini adalah rupa pautan ke borang ini dalam editor (penampilannya akan berubah dalam bar alamat):

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

Beberapa item menu hanya boleh ditunjukkan kepada pengguna berdaftar! Sebagai contoh, item menu dengan jenis "Buat pautan" akan kelihatan hanya kepada pengguna berdaftar. Ciri ini dicipta khusus supaya pengguna berdaftar boleh membuat pautan yang akan disiarkan pada halaman.

Oleh itu, komponen com_weblinks menyediakan cara yang baik untuk mengisi halaman secara interaktif dengan pautan yang menarik. Selain itu, semua pautan yang akan diletakkan pada halaman sedemikian mempunyai ubah hala, iaitu, ia tidak akan diindeks sebagai luaran. Anda mungkin pernah melihat pautan sedemikian di forum. Apabila anda mengarahkan tetikus anda pada pautan sedemikian, anda akan melihat alamat tapak anda, dan hanya selepas mengklik padanya anda akan diubah hala ke alamat yang anda tentukan.

Keupayaan untuk pengguna menambah pautan ke tapak luar adalah kelebihan dan makna utama komponen com_weblinks, begitu juga dengan keupayaan untuk pengguna menambah kandungan baharu - artikel, imej, fail video, dsb.

Membenarkan pengguna berdaftar dengan hak untuk mengisi tapak dengan kandungan tanpa pengekodan langsung adalah falsafah asas CMS Joomla.

Tidak dikategorikan
Contoh Data-Artikel
|- Joomla!
|-|- Sambungan
|-|-|- Komponen
|-|-|- Modul
|-|-|-|- Modul Kandungan
|-|-|-|- Modul Pengguna
|-|-|-|- Modul Paparan
|-|-|-|- Modul Utiliti
|-|-|-|- Modul Navigasi
|-|-|- Templat
|-|-|-|- Atom
|-|-|-|- Beez 20
|-|-|-|- Beez 5
|-|-|- Bahasa
|-|-|- Pemalam
|- Tapak Taman
|-|- Blog Taman
|-|- Galeri Foto
|-|-|- Haiwan
|-|-|- Pemandangan
|- Tapak Kedai Buah-buahan
|-|- Penanam
|-|- Resipi

Nampaknya tidak terlalu banyak kategori untuk kandungan!
Anda juga boleh melihat hierarki kategori dalam bahan menggunakan pertanyaan kepada jadual kategori dalam pangkalan data:

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

Terdapat cadangan dalam fail /includes/joomla.php dalam fungsi cleanText untuk menggantikan baris

$teks = strip_tags($teks); $teks = strip_tags ($ teks , " " ) ;

Godam ini hanya bertujuan untuk gambar yang disisipkan sebagai imej biasa. Untuk imej yang disisipkan oleh mambot (mosimage), hack ini tidak akan berfungsi.

Cara membuat pautan terus muncul dalam komponen com_weblinks

Dalam weblinks.html.php anda perlu menggantikan baris:

$link = sefRelToAbs( "index.php?option=com_weblinks&task=view&catid=" . $catid ."&id=" . $row ->id ); $link = $row ->url ; Bagaimana untuk menjadikan Joomla berfungsi pada dua hos (domain) pada masa yang sama. Itu. sebagai contoh, pada rangkaian tempatan pada 10.0.0.15 dan dari tapak Internet-firmy.ru. Walaupun fakta bahawa kedua-dua alamat diberikan kepada mesin yang sama.

Pertama, keseluruhan masalahnya ialah Joomla memaparkan semua imej dan fail CSS (laluan mereka dalam templat) berbanding pembolehubah $mosConfig_live_site - alamat asas tapak yang dimasukkan semasa pemasangan. Dan jika seseorang cuba mengaksesnya dengan alamat yang berbeza, maka tiada apa-apa dalam logik operasinya berubah - alamat asas diambil dari fail konfigurasi. Sebagai contoh, jika konfigurasi menyatakan bahawa Joomla terletak pada localhost, kemudian mengakses dari rangkaian tempatan, walaupun kepada Apache yang dikonfigurasikan dengan betul mendengar alamat 192.168.0.1, tidak akan mengubah apa-apa di dalamnya - src imej masih akan bermula dengan "localhost", yang untuk mesin lain sudah pun mempunyai localhost sendiri. Fokus penyelesaian untuk kes sedemikian adalah untuk menggantikan pembolehubah $mosConfig_live_site untuk hos yang diminta, supaya semua fungsi boleh mengeluarkan pautan yang betul dan sudah membawa pengguna ke sama ada satu atau tapak maya yang lain (berikan laluan asas yang betul kepada gambar dan laluan asas ke alamat). Terdapat mambot tapak langsung Auto yang boleh mengautomasikannya. Jika ia tidak sesuai dengan anda dalam beberapa cara, maka pada dasarnya ia boleh diulang , untuk ini dalam configuration.php sebagai ganti definisi $mosConfig_live_site anda perlu menulis kod anda Sesuatu seperti:

jika ($_SERVER [ "HTTP_HOST" ] =="host1.ru") $mosConfig_live_site = "host1.ru" ; else $mosConfig_live_site = "host2.ru" ;

Perlu diberi perhatian bahawa jika anda menggunakan cache, anda juga mesti mempunyai dua direktori caching yang berbeza untuk dua hos, kerana pautan ke hos yang berbeza mungkin bersilang dalam cache, dan kemudian pengguna dari rangkaian yang salah tidak akan sampai ke mana-mana. . Pembolehubah $mosConfig_cachepath bertanggungjawab untuk cache.

Bagaimana untuk membuat dua komponen muncul serentak pada satu halaman

Saya akan memberitahu anda dengan segera - tidak semuanya begitu mudah. Lagipun ia bukan modul. Oleh itu, pertama sekali, ia patut mencari alternatif, i.e. Pastinya komponen popular datang dengan modul yang boleh meniru fungsinya. Jika tidak ada yang seperti itu maka ini adalah pilihan. Ia boleh dibuat sebagai modul, atau, secara teori, ia boleh dimasukkan ke dalam templat. Ideanya ialah ini - memanggil komponen melalui index2.php (apa dan mengapa - baca keseluruhan fakta). Itu. anda boleh membuat iframe dengan src="index2.php?option=com_component&no_html=1" pada titik sisipan yang diingini untuk komponen kedua. Dan ia akan dipaparkan di sana. Perkara lain ialah tidak mungkin untuk memastikan kefungsian sepenuhnya. Namun begitu, ini adalah jalan keluar.

Atau gunakan pembinaan: mosLoadComponent("com_mycomp" );

Tetapi, jika komponen itu dilaksanakan dengan cara ini, maka anda perlu memahami bahawa ia tidak tahu tentang manipulasi anda dan akan berfungsi mengikut $option dan $tasknya.

Bagaimana untuk menambah panjang tajuk dalam artikel

Anda perlu menjalankan dua arahan berikut dalam phpMyAdmin (terdapat halaman khas untuk melaksanakan pertanyaan SQL), cuma gantikan ###_ dengan awalan jadual sebenar anda. Nombor maksimum yang mungkin ialah 255. Dalam contoh, 200 digunakan.

ALTER JADUAL `###_content` TUKAR `title_alias` `title_alias` VARCHAR(200) NOT NULL; ALTER JADUAL `###_content` TUKAR `tajuk` `tajuk` VARCHAR(200) BUKAN NULL;

Cara memasukkan teks berita penuh dalam suapan RSS anda, bukan hanya tajuk berita mereka

Untuk melakukan ini, dalam fail /components/com_rss/rss.php, anda perlu menggantikannya

$item_description = $row ->introtext ; $item_description = $row ->fulltext ; Bagaimanakah saya boleh membuat dua tapak Joomla menggunakan pangkalan data yang sama atau menggunakan fail yang sama?

Bagi menggunakan satu pangkalan data, anda perlu menulis satu pangkalan data dalam konfigurasi.php untuk dua enjin, tetapi anda perlu memahami apa yang anda lakukan. Kerana mengekalkan sesi untuk pengguna dalam kes ini akan menjadi sangat bermasalah, kerana domain adalah berbeza. Itu. entri log masuk dalam jadual #__sessions akan (mungkin) bertindih.

Jika anda ingin menggunakan fail yang sama tanpa menyalin pengedaran yang besar, maka pada dasarnya anda boleh menggunakan arahan "ln -s" di Linux untuk membuat pautan simbolik ke fail sedia ada dan tidak menyalinnya untuk tapak baharu.

Cara membuat halaman maya yang boleh diakses pada alamat tertentu dalam reka bentuk Joomla umum (http://site.ru/super_page)
  • Cara pertama ialah menggunakan beberapa jenis komponen SEF, di mana anda menentukan laluan maya yang diingini untuk halaman statik. Terdapat tolak di sini - komponen ini akan mula membuat semula semua pautan lain (dan secara amnya komponen ini sangat haus kuasa dan memerlukan banyak sumber untuk berfungsi).
  • Cipta alias untuk halaman sedemikian menggunakan mod_rewrite dan .htaccess. Untuk melakukan ini anda perlukan:
    • Buat halaman statik dengan teks yang anda perlukan, ketahui ID dan alamatnya (tidak perlu membuat halaman sedemikian, ia mungkin sudah wujud dan secara amnya ia hanyalah sebarang komponen, tidak semestinya com_content)
    • Buat alias, jadikan ia "super_puper"
    • Buka .htaccess dan sebelum baris "RewriteCond %(REQUEST_FILENAME) !-f" tulis:
RewriteRule ^(super_puper) index.php?option=com_content&task=view&id=12 RewriteCond %(REQUEST_FILENAME) !-f
    • Dan sekarang, dengan syarat Joomla terletak di site.ru, apabila anda membuka pautan http:/ /site.ru/super_puper halaman statik yang diperlukan dengan maklumat anda akan dibuka. Pautan itu sendiri "index.php?option=com_content&task=view&id=12" boleh menjadi apa sahaja yang anda perlukan, perkara utama ialah pautan itu tidak mutlak (iaitu dengan http:/ /...) tetapi relatif (mesti bermula dengan indeks .php?...)
Bagaimana untuk melumpuhkan caching untuk artikel tertentu

Ini mungkin perlu jika anda menggunakan mambot rd_addphp untuk memasukkan sebarang skrip yang sepatutnya menghasilkan nombor rawak atau teks rawak setiap kali, tanpa mengira sistem caching Joomla. Untuk melumpuhkan caching item tertentu, anda perlu mengetahui IDnya (dalam panel pentadbir, apabila mengedit, lihat pada bar alamat, ia akan mengatakan sesuatu seperti "...&id=123..."). Jadi 123 akan menjadi ID artikel kami. Ia adalah perlu untuk menggantikan dalam fail /components/com_content/content.php lebih kurang pada baris 1600

$cache ->call ( "HTML_content::show" , $row , $params , $access , $page ); if ($row ->id !="123" ) $cache ->call ( "HTML_content::show" , $row , $params , $access , $page ); else HTML_content::show ($row, $params, $access, $page) ;

Di mana 123 ialah ID artikel yang anda perlukan.

Saya memasang banyak komponen, tetapi senarai komponen dalam menu pentadbir menunjukkan bilangan yang berkurangan, dan kemudian ia berkata "Lebih banyak komponen ...". Bagaimana untuk memaparkan semua komponen.

Anda memerlukan baris dalam fail /administrator/modules/mod_fullmenu.php

$topLevelLimit = 19 ;

digantikan oleh

$topLevelLimit = 199 ; Cara memasang salinan komponen

Ia mesti dikatakan bahawa tugas itu amat sukar. Jika anda tidak faham bagaimana komponen itu berfungsi, maka anda tidak sepatutnya mencuba. Bagi mereka yang masih ingin mengambil perhatian perkara utama:

  • Dalam fail XML, namakan semula nama komponen dalam tag nama
  • Seterusnya, anda perlu menamakan semula jadual yang digunakan (pertama dalam fail XML, dan kedua dalam semua fail komponen, di mana sahaja objek pangkalan data $database dan kaedah setQuery digunakan)
  • Namakan semula semua laluan dalam komponen juga. Laluan boleh digunakan dalam rujukan kepada dirinya sendiri atau dalam nama fail yang disertakan. Selalunya perkara ini datang untuk mencari subrentetan com_componentname dan menggantikannya dengan yang baharu.

Tetapi kaedah ini tidak menjamin apa-apa. Dengan yang mudah, ini mungkin dan akan berlalu, tetapi dengan yang kompleks, tiada siapa yang boleh menjamin.

Bagaimana untuk membuat satu kedudukan secara rawak menunjukkan salah satu modul yang diberikan kepadanya
  • Pilihan 1 - menggodam fungsi mosLoadModules. Dalam templat, di tempat yang perlu untuk memaparkan salah satu modul N, kami menulis (perhatikan hujah ketiga):
mosLoadModules("kedudukan", display_setup,true);

Dan kami sedikit membetulkan fungsi di atas itu sendiri:

fungsi mosLoadModules( $position ="left" , $style =0 , $show_random = false ) ( ... $allModules =& initModules() ; if (isset ($GLOBALS [ "_MOS_MODULES" ] [ $position ] ) ) ( $modules = $GLOBALS [ "_MOS_MODULES" ] [ $position ] ; ) else ( $modules = array () ; ) //tambah di sini jika ($show_random && sizeof ($modules) >0 ) ( $tmp = $modules [ rand (0 ,sizeof ($modules) -1 ) ] ; $modules = array ($tmp); ) //akhir pernyataan if (count ( $modules )< 1 ) { $style = 0 ; }

Kami menambah hujah ketiga kepadanya (yang digunakan dalam templat, di mana kami menulis benar) dan mengubah suai kod.

  • Pilihan dua lebih tidak menyakitkan, kami hanya mengubah suai templat. Tetapi lebih intensif buruh - kita perlu mencipta beberapa jawatan. Mula-mula, kami mencipta beberapa kedudukan modul baharu, contohnya new1 ... new10. Jimat. Di tempat yang betul dalam templat, sebelum memanggil fungsi mosLoadModules, tambahkan kod yang diperlukan:
$rand_num = rand (1 ,10 ) ;//dari 1 hingga 10 - seperti dalam nama kedudukan mosLoadModules ( "new" .$rand_num , display_settings) ; Saya percaya bahawa dengan menamakan semula folder /pentadbir/ saya akan menjadikan tapak saya lebih selamat

Pilihan ini tidak disediakan sebagai standard. Tetapi sebenarnya, adalah mungkin, dengan mengatur carian dalam fail Joomla, untuk menggantikan sebarang kejadian perkataan sedemikian dengan anda - rahsia. Kadangkala, kemudian, ralat tentang ketidakupayaan untuk mengakses fail mungkin muncul, tetapi mengetahui fail dan nombor baris, ia boleh diperbetulkan. Oleh itu, masalahnya, pada dasarnya, boleh diselesaikan.

Bulan ini, penggali pepijat tidak mahu memanjakan kami dengan eksploitasi berprofil tinggi baharu dalam aplikasi popular. Sudah tentu, banyak nasihat telah diterbitkan dalam produk syarikat terkenal, tetapi sangat sedikit daripada mereka mengandungi kod PoC yang boleh dibaca. Dalam ulasan kami, saya cuba mengumpul kelemahan paling ketara dan lengkap yang diterangkan baru-baru ini, jadi duduk dan nikmati membaca.

Kerentanan PHP semasa memproses permintaan Kepala HTTP Ringkas

Pada 3 Mac, Adam Ivanyuk tertentu menemui ciri menarik dalam penterjemah PHP, yang tidak memproses permintaan HEAD dengan betul. Penyelidik memanggil kerentanan ini "Helah kaedah HTTP HEAD dalam skrip php."

Ramai pengekod mereka bentuk skrip PHP mereka dengan harapan bahawa semua arahan yang ditulis di dalamnya akan dilaksanakan dengan jayanya tanpa terputus di suatu tempat di tengah (terutama dalam skrip pendek). Inilah yang berlaku jika skrip diminta oleh pengguna akhir menggunakan kaedah GET, POST, PUT.

Tetapi anda harus tahu bahawa terdapat kaedah HTTP lain - contohnya, HEAD. Ia adalah tepat apabila memproses kaedah ini dalam PHP bahawa lubang keselamatan mungkin timbul.

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

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

Apabila sebarang data tiba, fungsi php_ub_body_write dilaksanakan. Seterusnya, lihat main/output.c, baris 699:

jika (SG(request_info).headers_only) (
jika(SG(headers_sent))
{
pulangan 0;
}
php_header(TSRMLS_C);
zend_bailout();
}

Di sini anda boleh melihat bahawa kali pertama ia dicetak ke skrin dan apabila menggunakan kaedah HEAD, fungsi zend_bailout memecahkan skrip.

mengeksploitasi

Sekarang mari kita akses skrip ini menggunakan kaedah HEAD:

Seperti yang anda jangkakan, buku tetamu kami akan menghentikan pelaksanaannya pada baris "echo $data;", jadi fail book.txt hanya akan ditetapkan semula kepada sifar.
Contoh ini agak merosakkan sifatnya. Dalam contoh kedua, kita boleh memintas kebenaran dalam panel pentadbir primitif:

Dalam skrip ini, apabila log masuk menggunakan kaedah biasa, pembolehubah pentadbiran ditetapkan dalam sesi. Kemudian, jika pengguna memasukkan kata laluan yang salah, pembolehubah ini ditetapkan semula dan pengguna tidak menjadi pentadbir.

Jika kami mengakses panel pentadbir melalui HEAD, pelaksanaannya akan terganggu pada sekeping kod dengan "gema", jadi pembolehubah pentadbiran tidak akan ditetapkan semula dan kami boleh mengembara di sekitar bahagian tertutup aplikasi dengan selamat. Perkara yang perlu diingat di sini ialah kebanyakan pelayan web mempunyai nilai penimbalan output yang ditetapkan kepada 4096 bait, jadi dalam contoh yang berfungsi kita mungkin memerlukan rentetan "Rentetan panjang mengandungi kira-kira 4090 aksara".

mengeksploitasi
  • PHP

    Di sini tatasusunan $check mengandungi data POST kami dan pembolehubah $locked ialah rentetan bersiri yang dikelirukan menggunakan fungsi str_rot13(), yang berada di bawah kawalan kami sepenuhnya.

    Pada ketika ini adalah wajar membuat penyimpangan kecil bagi mereka yang belum membaca artikel yang sepadan dalam ][, dan bercakap secara ringkas tentang pepijat yang menjelma sendiri dalam kaedah ajaib PHP. Jadi, dalam PHP versi 5, konsep asas pengaturcaraan OOP muncul: pembina dan pemusnah. Pembina dilaksanakan menggunakan kaedah "__construct" dan pemusnah dilaksanakan menggunakan kaedah "__destruct". Setelah selesai kerjanya dan apabila dipanggil melalui fungsi unserialize(), setiap objek melaksanakan kaedah __ destructnya sendiri, jika ia ditulis dalam kod.

    Sekarang mari kita kembali ke rangka kerja kami dan lihat pemusnah kelas App daripada fail ./libs/configure.php:

    fungsi __destruct()
    {
    jika ($ini->__cache)
    {
    $core = App::core("kek");
    unset($this->__paths);
    Cache::write("dir_map", array_fi lter($this->__paths),
    "inti kek");
    Cache::write("fi le_map", array_fi lter($this->__map),
    "inti kek");
    Cache::write("object_map", $this->__objects,
    "inti kek");
    }
    }

    Daripada kod di atas, anda dapat melihat bahawa kaedah ini boleh dikompromi dengan menulis nilai sewenang-wenangnya ke objek Cache. Kunci yang paling menarik untuk dipecahkan ialah 'file_map'. Ia menguruskan sambungan antara kelas dan fail PHP yang sepadan, dan juga digunakan untuk memuatkan kelas tambahan semasa pelaksanaan skrip.

    Kod sebenar untuk memuatkan kelas adalah sedikit lebih kompleks, tetapi semuanya bermuara kepada kod berikut daripada kaedah __load di dalam kelas App:

    Bingo! Dengan menggantikan pembolehubah $file, kami boleh memasukkan kod PHP kami sendiri! Selain itu, ini akan menjadi pepijat Kemasukan Fail Jauh yang sebenar - oleh itu, kami tidak memerlukan sebarang helah tambahan untuk memuat naik fail tempatan ke pelayan. Walau bagaimanapun, pengarang kelemahan yang ditemui menawarkan pilihan LFI untuk mengeksploitasi lubang ini, kerana CakePHP menggunakan cache tempatan berasaskan fail, yang terletak dalam bentuk bersiri dalam direktori yang diketahui oleh penyerang.

    mengeksploitasi

    Sebagai PoC kecil untuk menghasilkan rentetan bersiri beracun, felix menawarkan kod berikut:

    Sudah tentu, anda mesti terlebih dahulu memasukkan kelas yang diperlukan dari CakePHP. Terdapat juga eksploitasi Python yang berfungsi sepenuhnya, yang boleh anda temui di malloc.im/burnedcake.py.

    Eksploitasi ini harus berfungsi dalam setiap aplikasi yang dibina pada CakePHP, menggunakan borang POST dengan token keselamatan, dan di mana lokasi standard fail cache tidak diubah. Secara lalai, eksploit memaparkan konfigurasi pangkalan data; ciri berguna lain boleh ditambah dengan mudah dengan menukar muatan PHP terbina dalam.

    Sasaran
    • CakePHP getState("fi lter_order_dir");
      $fi lter_order = JFilterInput::clean($fi lter_order, "cmd");
      $fi lter_order_dir =
      JFilterInput::clean($fi lter_order_dir, "word");
      // Kita perlu mendapatkan senarai semua
      // pautan web dalam kategori yang diberikan
      $query = "PILIH *" .
      "DARI #__pautan web" .
      "WHERE catid = ". (int) $this->_id.
      "DAN diterbitkan = 1" .
      "DAN diarkibkan = 0".
      "PERINTAH OLEH". $fi lter_order "".
      $fi lter_order_dir .", memesan";
      pulangkan $query;
      }

      Di sini anda boleh melihat bahawa pembolehubah $filter_order dan $filter_order_dir tidak disemak untuk pematuhan ketat dengan pernyataan SQL; semakan hanya dilakukan dengan menggunakan kaedah bersih standard dari kelas JFilterInput: