เว็บลิงค์ php ตัวตน เลเยอร์เค้กและ com_weblinks Joomla วิธีรวมข้อความข่าวฉบับสมบูรณ์ในฟีด RSS ของคุณ ไม่ใช่แค่พาดหัวข่าว

มีข้อเสนอแนะในไฟล์ /includes/joomla.php ในฟังก์ชัน cleanText เพื่อแทนที่บรรทัด

$text = strip_tags($ข้อความ); " ) ;

$text = strip_tags ( $text , "

แฮ็คนี้มีไว้สำหรับรูปภาพที่แทรกเป็นรูปภาพปกติเท่านั้น สำหรับรูปภาพที่แทรกโดยแมมบอต (mosimage) การแฮ็กนี้จะไม่ทำงาน

วิธีทำให้ลิงก์ตรงปรากฏในคอมโพเนนต์ com_weblinks

ใน weblinks.html.php คุณต้องแทนที่บรรทัด:

$link = sefRelToAbs( "index.php?option=com_weblinks&task=view&catid=" . $catid "&id=" . $row ->id ) ;

ถ้า ($_SERVER [ "HTTP_HOST" ] =="host1.ru" ) $mosConfig_live_site = "host1.ru" ;

อย่างอื่น $mosConfig_live_site = "host2.ru" ;

จำเป็นต้องให้ความสนใจว่าหากคุณใช้แคชคุณจะต้องมีไดเร็กทอรีแคชที่แตกต่างกันสองแห่งสำหรับสองโฮสต์เนื่องจากลิงก์ไปยังโฮสต์ที่ต่างกันอาจตัดกันในแคชจากนั้นผู้ใช้จากเครือข่ายที่ไม่ถูกต้องจะไม่ได้รับที่ใดก็ได้เลย . ตัวแปร $mosConfig_cachepath รับผิดชอบแคช

วิธีทำให้สององค์ประกอบปรากฏพร้อมกันในหน้าเดียว

ฉันจะบอกคุณทันที - ไม่ใช่ทุกอย่างจะง่ายนัก มันไม่ใช่โมดูลเลย ดังนั้นประการแรกจึงควรมองหาทางเลือกอื่นเช่น แน่นอนว่าส่วนประกอบยอดนิยมมาพร้อมกับโมดูลที่สามารถจำลองฟังก์ชันการทำงานได้ ถ้าไม่มีอะไรแบบนั้นก็เป็นทางเลือก สามารถสร้างเป็นโมดูลหรือตามทฤษฎีแล้วสามารถแทรกลงในเทมเพลตได้ แนวคิดก็คือ - การเรียกส่วนประกอบผ่าน index2.php (อะไรและทำไม - อ่านข้อเท็จจริงทั้งหมด) เหล่านั้น. คุณสามารถสร้าง iframe ด้วย src="index2.php?option=com_component&no_html=1" ที่จุดแทรกที่ต้องการสำหรับองค์ประกอบที่สอง และมันจะแสดงอยู่ที่นั่น อีกประการหนึ่งคือไม่น่าเป็นไปได้ที่จะรับประกันการใช้งานได้อย่างเต็มที่ แต่อย่างไรก็ตาม นี่เป็นทางออก

หรือใช้โครงสร้าง: mosLoadComponent("com_mycomp" ) ;

แต่ถ้าคอมโพเนนต์ถูกดำเนินการในลักษณะนี้ คุณจะต้องเข้าใจว่าคอมโพเนนต์ไม่ทราบเกี่ยวกับการปรับแต่งของคุณ และจะทำงานตาม $option และ $task

วิธีเพิ่มความยาวของชื่อเรื่องในบทความ

คุณต้องรันสองคำสั่งต่อไปนี้ใน phpMyAdmin (มีหน้าพิเศษสำหรับดำเนินการสืบค้น SQL) เพียงแทนที่ ###_ ด้วยคำนำหน้าตารางจริงของคุณ จำนวนสูงสุดที่เป็นไปได้คือ 255 ในตัวอย่าง จะใช้ 200

แก้ไขตาราง `###_content` เปลี่ยน `title_alias` `title_alias` VARCHAR (200) ไม่เป็นโมฆะ; แก้ไขตาราง `###_content` เปลี่ยน `title` `title` VARCHAR(200) ไม่เป็นโมฆะ;

วิธีรวมข้อความข่าวฉบับสมบูรณ์ในฟีด RSS ของคุณ ไม่ใช่แค่พาดหัวข่าว

ในการดำเนินการนี้ คุณต้องแทนที่ในไฟล์ /components/com_rss/rss.php

$item_description = $row ->ข้อความนำ ;

หากคุณต้องการใช้ไฟล์เดียวกันโดยไม่ต้องคัดลอกการแจกจ่ายจำนวนมาก โดยหลักการแล้ว คุณสามารถใช้คำสั่ง "ln -s" ใน Linux เพื่อสร้างลิงก์สัญลักษณ์ไปยังไฟล์ที่มีอยู่ และไม่คัดลอกลิงก์เหล่านั้นสำหรับไซต์ใหม่

วิธีสร้างเพจเสมือนที่สามารถเข้าถึงได้ตามที่อยู่เฉพาะในการออกแบบ Joomla ทั่วไป (http:// /site.ru/super_page)
  • วิธีแรกคือการใช้ส่วนประกอบ SEF บางชนิดซึ่งคุณระบุเส้นทางเสมือนที่ต้องการสำหรับเพจแบบคงที่ มีข้อเสียอยู่ตรงนี้ - ส่วนประกอบนี้จะเริ่มสร้างลิงก์อื่น ๆ ทั้งหมดใหม่ (และโดยทั่วไปส่วนประกอบเหล่านี้ใช้พลังงานมากและต้องใช้ทรัพยากรจำนวนมากในการทำงาน)
  • สร้างนามแฝงสำหรับเพจดังกล่าวโดยใช้ mod_rewrite และ .htaccess ในการทำเช่นนี้คุณต้องมี:
    • สร้างเพจแบบคงที่พร้อมข้อความที่คุณต้องการ ค้นหา ID และที่อยู่ (ไม่จำเป็นต้องสร้างเพจดังกล่าว อาจมีอยู่แล้วและโดยทั่วไปเป็นเพียงส่วนประกอบใด ๆ ไม่จำเป็นต้อง com_content)
    • ตั้งนามแฝงให้เป็น "super_puper"
    • เปิด .htaccess และก่อนบรรทัด "RewriteCond %(REQUEST_FILENAME) !-f" ให้เขียน:
RewriteRule ^(super_puper) index.php?option=com_content&task=view&id=12 RewriteCond %(REQUEST_FILENAME) !-f
    • และตอนนี้ โดยมีเงื่อนไขว่า Joomla จะอยู่ที่ site.ru เมื่อคุณเปิดลิงก์ http:// /site.ru/super_puper หน้าคงที่ที่จำเป็นพร้อมข้อมูลของคุณจะเปิดขึ้น ลิงก์ "index.php?option=com_content&task=view&id=12" เองสามารถเป็นอะไรก็ได้ที่คุณต้องการ สิ่งสำคัญคือลิงก์นั้นไม่สมบูรณ์ (เช่น ด้วย http:/ /...) แต่สัมพันธ์กัน (ต้องขึ้นต้นด้วยดัชนี .php?...)
วิธีปิดการใช้งานแคชสำหรับบทความใดบทความหนึ่ง

นี่อาจจำเป็นหากคุณใช้แมมบอต rd_addphp เพื่อแทรกสคริปต์ใดๆ ที่ควรสร้างตัวเลขสุ่มหรือข้อความสุ่มทุกครั้ง โดยไม่คำนึงถึงระบบแคชของ Joomla หากต้องการปิดใช้งานการแคชของบางรายการ คุณต้องค้นหา ID ของมัน (ในแผงผู้ดูแลระบบ เมื่อทำการแก้ไข ให้ดูที่แถบที่อยู่ มันจะพูดประมาณว่า "...&id=123...") ดังนั้น 123 จะเป็นรหัสบทความของเรา จำเป็นต้องแทนที่ในไฟล์ /components/com_content/content.php ประมาณบรรทัดที่ 1600

$แคช ->โทร ( "HTML_content::show" , $row , $params , $access , $page ) ;

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

ฉันติดตั้งส่วนประกอบจำนวนมาก แต่รายการส่วนประกอบในเมนูผู้ดูแลระบบแสดงจำนวนส่วนประกอบที่ลดลง และจากนั้นจะมีข้อความว่า "ส่วนประกอบเพิ่มเติม..." วิธีแสดงส่วนประกอบทั้งหมด

คุณต้องมีบรรทัดในไฟล์ /administrator/modules/mod_fullmenu.php

$topLevelLimit = 19 ;

แทนที่ด้วย

$topLevelLimit = 199 ; วิธีติดตั้งสำเนาของส่วนประกอบ

ต้องบอกว่างานนี้ยากมาก หากคุณไม่เข้าใจวิธีการทำงานของส่วนประกอบ คุณไม่ควรลองด้วยซ้ำ สำหรับผู้ที่ยังต้องการทราบประเด็นหลัก:

  • ในไฟล์ XML ให้เปลี่ยนชื่อส่วนประกอบในแท็กชื่อ
  • ถัดไป คุณต้องเปลี่ยนชื่อตารางที่ใช้ (ประการแรกในไฟล์ XML และประการที่สองในไฟล์ส่วนประกอบทั้งหมด ไม่ว่าจะใช้ออบเจ็กต์ฐานข้อมูล $database และวิธีการ setQuery ก็ตาม)
  • เปลี่ยนชื่อเส้นทางทั้งหมดในส่วนประกอบด้วย สามารถใช้เส้นทางในการอ้างอิงถึงตัวมันเองหรือในชื่อของไฟล์ที่รวมไว้ บ่อยครั้งสิ่งนี้เกิดขึ้นจากการค้นหาชื่อสตริงย่อย com_component และแทนที่ด้วยชื่อใหม่

แต่วิธีนี้ไม่ได้รับประกันอะไรเลย ด้วยวิธีที่เรียบง่ายสิ่งนี้เป็นไปได้และจะใช้ได้ แต่ไม่มีใครรับประกันได้หากมีความซับซ้อน

วิธีทำให้ตำแหน่งหนึ่งสุ่มแสดงหนึ่งในโมดูลที่ได้รับมอบหมาย
  • ตัวเลือกที่ 1 - แฮ็กฟังก์ชัน mosLoadModules ในเทมเพลตในตำแหน่งที่จำเป็นในการแสดงหนึ่งในโมดูล N เราเขียน (ให้ความสนใจกับอาร์กิวเมนต์ที่สาม):
mosLoadModules("ตำแหน่ง", display_setup,true);

และเราแก้ไขฟังก์ชันข้างต้นเล็กน้อย:

ฟังก์ชั่น mosLoadModules( $position ="left" , $style =0 , $show_random = false ) ( ... $allModules =& initModules() ; if (isset ( $GLOBALS [ "_MOS_MODULES" ] [ $position ] ) ) ( $modules = $GLOBALS [ "_MOS_MODULES" ] [ $position ] ) else ( $modules = array () ; ) // เพิ่มที่นี่ถ้า ($show_random && sizeof ($modules ) >0 ) ( $tmp = $modules [ rand (0 ,ขนาดของ ($modules ) -1 ) ] ; $modules = array ($tmp ) ; // สิ้นสุดคำสั่ง if ( count ( $modules )< 1 ) { $style = 0 ; }

เราได้เพิ่มอาร์กิวเมนต์ที่สามลงไป (ซึ่งใช้ในเทมเพลตโดยที่เราเขียนว่าเป็นจริง) และแก้ไขโค้ด

  • ตัวเลือกที่สองนั้นไม่ยุ่งยากกว่า เราแก้ไขเทมเพลตเท่านั้น แต่ต้องใช้แรงงานมากขึ้น - เราจำเป็นต้องสร้างหลายตำแหน่ง ขั้นแรก เราสร้างตำแหน่งโมดูลใหม่หลายตำแหน่ง เช่น new1 ... new10 บันทึก. ในตำแหน่งที่ถูกต้องในเทมเพลต ก่อนที่จะเรียกใช้ฟังก์ชัน mosLoadModules ให้เพิ่มโค้ดที่จำเป็น:
$rand_num = rand (1 ,10 ) ;//จาก 1 ถึง 10 - เช่นเดียวกับในชื่อตำแหน่ง mosLoadModules ( "new" .$rand_num , display_settings) ; ฉันเชื่อว่าการเปลี่ยนชื่อโฟลเดอร์ /adminisrator/ ฉันจะทำให้ไซต์ของฉันปลอดภัยยิ่งขึ้น

ตัวเลือกนี้ไม่ได้จัดเตรียมไว้เป็นมาตรฐาน แต่ในความเป็นจริง เป็นไปได้โดยการจัดระเบียบการค้นหาในไฟล์ Joomla เพื่อแทนที่คำดังกล่าวด้วยคำของคุณ - ความลับ บางครั้งข้อผิดพลาดเกี่ยวกับการไม่สามารถเข้าถึงไฟล์อาจปรากฏขึ้นในภายหลัง แต่เมื่อทราบไฟล์และหมายเลขบรรทัดก็สามารถแก้ไขได้ ดังนั้นโดยหลักการแล้วปัญหาคือแก้ไขได้

จุดเริ่มต้นสู่ Joomla! ส่วนประกอบจะคล้ายกันสำหรับส่วนประกอบส่วนใหญ่ สำหรับตัวอย่างนี้ เราจะใช้หนึ่งในองค์ประกอบหลักของ Joomla - เว็บลิงค์ ไฟล์แรกที่จะดำเนินการในส่วนหน้า: …/components/com_weblinks/weblinks.php

อันดับแรก เราจะเห็นการตรวจสอบความปลอดภัยที่ออกแบบมาเพื่อให้แน่ใจว่าไม่มีใครสามารถโทรหาเพจนี้ได้โดยตรง นี่คือมาตรฐานที่ควรใช้ในไฟล์ php ทั้งหมดของคุณ (แม้ว่าจะมีข้อยกเว้นบางประการ):

เราตรวจสอบสตริงการสืบค้นเพื่อดูว่ามีการส่งชื่อคอนโทรลเลอร์เฉพาะหรือไม่ หากเป็นเช่นนั้น เราต้องแน่ใจว่าเราสามารถโหลดไฟล์ที่ต้องการในไดเร็กทอรีคอนโทรลเลอร์ได้:

// จำเป็นต้องมีคอนโทรลเลอร์เฉพาะหากมีการร้องขอ if ($controller = JRequest:: getWord("controller" ) ) ( $path = JPATH_COMPONENT. DS. "controllers" . DS. $controller . ".php" ; if (file_exists ($path) ) ) ( need_once $path ; ) อื่น ๆ ( $controller = "" ; ) )

ตอนนี้เราสร้างอินสแตนซ์คลาสคอนโทรลเลอร์ของเราโดยใช้ชื่อที่เรากำหนดไว้ด้านบน:

ทันทีที่งานเสร็จสิ้น เราจะดำเนินการเปลี่ยนเส้นทาง หากจำเป็น:

// เปลี่ยนเส้นทางหากตั้งค่าโดยคอนโทรลเลอร์ $controller -> เปลี่ยนเส้นทาง () ;
คลาสคอนโทรลเลอร์

ตัวควบคุมทั่วไป (เฉพาะ) สำหรับส่วนประกอบลิงก์อยู่ที่นี่: .../components/com_weblinks/controller.php
คลาสทั้งหมดนี้กำหนดวิธีการแสดงผล ซึ่งเป็นวิธีการเริ่มต้นที่ใช้ เว้นแต่ผู้ใช้จะระบุงานอื่น

กำหนด ("_JEXEC" ) หรือ die ( "การเข้าถึงแบบจำกัด" ) ;

นำเข้า("joomla.application.component.controller" );
/** * Weblinks Component Controller * * @package Joomla * @subpackage Weblinks * @since 1.5 */ class WeblinksController ขยาย JController ( /** * วิธีการแสดงมุมมองเว็บลิงก์ * * @access public * @since 1.5 */ function display () ( // ตั้งค่ามุมมองเริ่มต้นหากไม่มีถ้า ( ! JRequest:: getCmd ( "view") ) ( JRequest:: setVar ( "view" , "categories" ) ; ) // อัปเดตจำนวนการเข้าชมสำหรับเว็บลิงก์ if (JRequest:: getCmd ("view" ) == "weblink" ) ( $model =& $this -> getModel ("weblink" ) ; $model -> hit () ; ) // ดูตรรกะแคช -- แบบง่าย ... เราเข้าสู่ระบบแล้วหรือยัง? $user = & JFactory:: getUser () ; $view = JRequest:: getVar ( "view" ) ; if ($user -> get ("id" ) ||. ($view == "category" && $viewcache == 0 ) ) ( parent:: display (false) ; ) else ( parent :: display (true) ; ) )
ในวิธีนี้ เราตั้งค่ามุมมองเริ่มต้นให้แสดงหมวดหมู่ เว้นแต่จะส่งผ่านมุมมองอื่นเป็นพารามิเตอร์สตริงการสืบค้น หากมุมมองที่ต้องการคือเว็บลิงก์ เราจะเพิ่มตัวนับการดูลิงก์ จากนั้นเราตั้งค่าของตัวแปร view และเรียกเมธอด diplay ของคลาส JController หลักของเรา
ควรให้ความสนใจเป็นพิเศษกับการเรียกเมธอด getModel โดยจะโหลดโมเดลที่จำเป็นสำหรับส่วนประกอบ ในตัวอย่างนี้ เมธอดนี้จะโหลดโมเดลเว็บลิงก์ซึ่งอยู่ที่นี่: .../components/com_weblinks/models/weblink.php

ที่นี่เราจะยอมรับว่าเราไม่ได้ขอมุมมองที่เฉพาะเจาะจง ดังนั้นมุมมองของเราจะถูกกำหนดเป็นหมวดหมู่

ต่อไปเราจะเปิดคลาสมุมมอง

// ตรวจสอบให้แน่ใจว่าไฟล์นี้รวมอยู่ใน Joomla!< count ($categories ) ; $i ++ ) { $category =& $categories [ $i ] ; $category ->กำหนด("_JEXEC") หรือ die ("จำกัดการเข้าถึง");

ขอย้ำอีกครั้งว่านี่เป็นคลาสที่ง่ายมากพร้อมวิธีแสดงผลวิธีเดียว ตรรกะส่วนใหญ่ที่นี่เฉพาะกับส่วนประกอบของลิงก์ แต่ถ้าคุณมองอย่างใกล้ชิด คุณจะพบฟังก์ชันที่ใช้ในคลาสมุมมองส่วนประกอบส่วนใหญ่ ในตอนท้ายของวิธีการแสดงผล คลาสนี้จะเรียกวิธีการแสดงผลหลัก (JView) โดยส่งชื่อของเทมเพลตที่จะแสดง หากไม่ส่งชื่อของเทมเพลตการแสดงผล ระบบจะใช้เทมเพลต "เริ่มต้น"
และสุดท้าย เราเปิดคลาสเทมเพลต

คลาสเทมเพลต

เราตกลงกันไว้ว่าไม่ได้ส่งชื่อเทมเพลตเฉพาะ ดังนั้นจะใช้เทมเพลตเริ่มต้น ในกรณีนี้ ไฟล์ต่อไปนี้จะได้รับการพิจารณา: .../components/com_weblinks/views/categories/tmpl/default.php
-> หลบหนี ($ นี้ -> พารามิเตอร์ -> รับ ("page_title" ) ) ;

  • ( )

-

ตรรกะส่วนใหญ่ที่นี่มีความเฉพาะเจาะจงกับส่วนประกอบที่กำลังดำเนินการ คุณยังสามารถดูได้จากโค้ดว่าไฟล์นี้มี HTML ทั้งหมดที่ผสมกับ PHP ซึ่งเป็นคุณสมบัติและวัตถุประสงค์ของไฟล์

ไฟล์อื่นๆ ที่ใช้ในส่วนประกอบ

  • ไฟล์ประเภทอื่นๆ หลายประเภทที่คุณอาจพบในส่วนประกอบ:
  • Helpers - ส่วนประกอบมักใช้ไฟล์ helper.php หรือไดเร็กทอรี helpers ที่มีไฟล์จำนวนมาก โดยทั่วไปไฟล์เหล่านี้จะมีเฉพาะฟังก์ชันการทำงานทั่วไปสำหรับส่วนประกอบเท่านั้น
  • ดูเหมือนว่าเนื้อหาจะเป็นโฟลเดอร์ที่รับทั้งหมดสำหรับไฟล์อื่นๆ ที่รวมอยู่ในคอมโพเนนต์
  • router.php - ไฟล์นี้ถูกใช้เมื่อเปิดใช้งานการตั้งค่า SEF URL เพื่อแปล URL ในทั้งสองทิศทาง (เป็นไฟล์ที่มนุษย์อ่านได้พร้อมนามแฝงและเป็นมุมมองระบบ Joomla พร้อมพารามิเตอร์)
  • ไฟล์ xml - โดยปกติแล้วจะกำหนดพารามิเตอร์และข้อมูลอื่นๆ เกี่ยวกับส่วนประกอบและภาพรวม พวกมันถูกใช้เมื่อสร้างรายการเมนูส่วนประกอบ
  • index.html - ควรมีไฟล์ index.html ว่างๆ ไว้ในไดเร็กทอรีทั้งหมดของคุณ นี่เป็นมาตรการรักษาความปลอดภัยแบบพาสซีฟ

css/images/js - โฟลเดอร์ที่มีไฟล์ต่างๆ เพื่อใช้การออกแบบและฟังก์ชันการทำงานในฝั่งไคลเอ็นต์ (ในเบราว์เซอร์)

ในเดือนนี้ ผู้ขุดแมลงไม่ต้องการทำลายเราด้วยการหาประโยชน์ใหม่ๆ ที่โด่งดังในแอปพลิเคชันยอดนิยม แน่นอนว่ามีการเผยแพร่คำแนะนำจำนวนมากในผลิตภัณฑ์ของบริษัทที่มีชื่อเสียง แต่มีเพียงไม่กี่รายการเท่านั้นที่มีรหัส PoC ที่อ่านได้ ในการตรวจสอบของเรา ฉันพยายามรวบรวมช่องโหว่ที่สำคัญและครบถ้วนที่สุดที่อธิบายไว้เมื่อเร็ว ๆ นี้ ดังนั้นโปรดนั่งและสนุกกับการอ่าน

เมื่อวันที่ 3 มีนาคม Adam Ivanyuk คนหนึ่งค้นพบคุณลักษณะที่น่าสนใจในล่าม PHP ซึ่งประมวลผลคำขอ HEAD ได้ไม่ถูกต้องนัก นักวิจัยเรียกช่องโหว่นี้ว่า “เคล็ดลับวิธี HTTP HEAD ในสคริปต์ php”

ผู้เขียนโค้ดจำนวนมากออกแบบสคริปต์ PHP โดยหวังว่าคำสั่งทั้งหมดที่เขียนในสคริปต์จะดำเนินการได้สำเร็จโดยไม่ขาดตรงกลาง (โดยเฉพาะในสคริปต์สั้น) นี่คือสิ่งที่เกิดขึ้นหากผู้ใช้ร้องขอสคริปต์โดยใช้วิธี GET, POST, PUT

แต่คุณควรรู้ว่ามีวิธี HTTP อื่นๆ เช่น HEAD เมื่อประมวลผลวิธีนี้ใน PHP อาจมีช่องโหว่ด้านความปลอดภัยเกิดขึ้น

ลองดูที่แหล่งล่ามแหล่งใดแหล่งหนึ่ง: ./main/SAPI.c บรรทัด 315:

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

เมื่อมีข้อมูลมาถึง ฟังก์ชัน php_ub_body_write จะถูกดำเนินการ ถัดไป ดูที่ main/output.c บรรทัด 699:

ถ้า (SG(request_info).headers_only) (
ถ้า(SG(headers_sent))
{
กลับ 0;
}
php_header(TSRMLS_C);
zend_bailout();
}

ที่นี่คุณจะเห็นว่าในครั้งแรกที่พิมพ์ลงบนหน้าจอ และเมื่อใช้วิธี HEAD ฟังก์ชัน zend_bailout จะแบ่งสคริปต์

หาประโยชน์

ตอนนี้เรามาเข้าถึงสคริปต์นี้โดยใช้วิธี HEAD:

ตามที่คุณคาดหวัง สมุดเยี่ยมชมของเราจะหยุดการดำเนินการที่บรรทัด “echo $data;” ดังนั้นไฟล์ book.txt จะถูกรีเซ็ตเป็นศูนย์
ตัวอย่างนี้ค่อนข้างจะเป็นอันตราย ในตัวอย่างที่สอง เราสามารถข้ามการอนุญาตในแผงการดูแลระบบแบบพื้นฐานได้:

ในสคริปต์นี้ เมื่อเข้าสู่ระบบโดยใช้วิธีปกติ ตัวแปรผู้ดูแลระบบจะถูกตั้งค่าในเซสชัน จากนั้น หากผู้ใช้ป้อนรหัสผ่านไม่ถูกต้อง ตัวแปรนี้จะถูกรีเซ็ตและผู้ใช้จะไม่กลายเป็นผู้ดูแลระบบ

หากเราเข้าถึงแผงผู้ดูแลระบบผ่านทาง HEAD การดำเนินการจะถูกขัดจังหวะด้วยโค้ดที่มีคำว่า "echo" ดังนั้นตัวแปรผู้ดูแลระบบจะไม่ถูกรีเซ็ต และเราสามารถเดินไปรอบๆ ส่วนที่ปิดของแอปพลิเคชันได้อย่างปลอดภัย สิ่งที่ต้องจำไว้คือ เว็บเซิร์ฟเวอร์ส่วนใหญ่มีค่าบัฟเฟอร์เอาต์พุตตั้งไว้ที่ 4096 ไบต์ ดังนั้นในตัวอย่างการทำงาน เราอาจต้องใช้สตริง "A long string contains about 4090 character"

หาประโยชน์
  • PHP

    ในที่นี้ $check array มีข้อมูล POST ของเรา และตัวแปร $locked นั้นเป็นสตริงแบบซีเรียลไลซ์ที่สร้างความสับสนโดยใช้ฟังก์ชัน str_rot13() ซึ่งอยู่ภายใต้การควบคุมของเราโดยสมบูรณ์

    ณ จุดนี้ มันคุ้มค่าที่จะพูดนอกเรื่องเล็กน้อยสำหรับผู้ที่ยังไม่ได้อ่านบทความที่เกี่ยวข้องใน ][ และพูดคุยสั้น ๆ เกี่ยวกับข้อผิดพลาดที่ปรากฏในวิธีการมหัศจรรย์ของ PHP ดังนั้นใน PHP เวอร์ชัน 5 แนวคิดพื้นฐานของการเขียนโปรแกรม OOP จึงปรากฏขึ้น: ตัวสร้างและตัวทำลาย ตัวสร้างถูกนำมาใช้โดยใช้วิธี "__construct" และตัวทำลายถูกนำมาใช้โดยใช้วิธี "__destruct" เมื่อทำงานเสร็จแล้วและเมื่อถูกเรียกผ่านฟังก์ชัน unserialize() แต่ละอ็อบเจ็กต์จะดำเนินการเมธอด __ destruct ของตัวเอง ถ้ามันเขียนด้วยโค้ด

    ตอนนี้กลับไปที่เฟรมเวิร์กของเราแล้วดูตัวทำลายคลาส App จากไฟล์ ./libs/configure.php:

    ฟังก์ชั่น __ ทำลาย ()
    {
    ถ้า ($ นี่ -> __ แคช)
    {
    $core = App::core("เค้ก");
    ไม่ได้ตั้งค่า($this->__paths);
    แคช::write("dir_map", array_fi lter($this->__paths)
    "เค้ก_คอร์");
    แคช::write("fi le_map", array_fi lter($this->__map)
    "เค้ก_คอร์");
    แคช::write("object_map", $this->__objects,
    "เค้ก_คอร์");
    }
    }

    จากโค้ดด้านบนจะเห็นว่าวิธีนี้สามารถถูกโจมตีได้โดยการเขียนค่าที่กำหนดเองลงใน Cache object คีย์ที่น่าสนใจที่สุดในการถอดรหัสคือ 'file_map' โดยจะจัดการการเชื่อมต่อระหว่างคลาสและไฟล์ PHP ที่เกี่ยวข้อง และยังใช้เพื่อโหลดคลาสเพิ่มเติมระหว่างการเรียกใช้สคริปต์อีกด้วย

    โค้ดจริงสำหรับการโหลดคลาสนั้นซับซ้อนกว่าเล็กน้อย แต่ทั้งหมดนั้นมาจากโค้ดต่อไปนี้จากวิธี __load ภายในคลาส App:

    บิงโก! ด้วยการแทนที่ตัวแปร $file เราก็สามารถรวมโค้ด PHP ของเราเองได้! ยิ่งไปกว่านั้น นี่จะเป็นข้อบกพร่องของการรวมไฟล์ระยะไกลจริง ๆ ดังนั้นเราจึงไม่จำเป็นต้องใช้เทคนิคเพิ่มเติมในการอัปโหลดไฟล์ในเครื่องไปยังเซิร์ฟเวอร์ อย่างไรก็ตาม ผู้เขียนช่องโหว่ที่พบเสนอตัวเลือก LFI สำหรับการใช้ประโยชน์จากช่องโหว่นี้ เนื่องจาก CakePHP ใช้แคชในเครื่องตามไฟล์ ซึ่งอยู่ในรูปแบบซีเรียลไลซ์ในไดเร็กทอรีที่ผู้โจมตีรู้จัก

    หาประโยชน์

    เนื่องจากเป็น PoC ขนาดเล็กสำหรับสร้างสตริงซีเรียลไลซ์ที่เป็นพิษ felix จึงเสนอโค้ดต่อไปนี้:

    แน่นอนว่าคุณต้องรวมคลาสที่จำเป็นจาก CakePHP ก่อน นอกจากนี้ยังมีการหาประโยชน์จาก Python ที่ทำงานได้อย่างสมบูรณ์ ซึ่งคุณสามารถพบได้ที่ malloc.im/burnedcake.py

    ช่องโหว่นี้ควรใช้ได้กับทุกแอปพลิเคชันที่สร้างบน CakePHP โดยใช้แบบฟอร์ม POST พร้อมโทเค็นความปลอดภัย และไม่มีการเปลี่ยนแปลงตำแหน่งมาตรฐานของไฟล์แคช ตามค่าเริ่มต้น การใช้ประโยชน์จะแสดงการกำหนดค่าฐานข้อมูล คุณสามารถเพิ่มคุณสมบัติที่มีประโยชน์อื่น ๆ ได้อย่างง่ายดายโดยการเปลี่ยนเพย์โหลด PHP ในตัว

    เป้าหมาย
    • 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, "คำ");
      // เราจำเป็นต้องได้รับรายชื่อทั้งหมด
      // เว็บลิงค์ในหมวดหมู่ที่กำหนด
      $query = "เลือก *" .
      "จาก #__เว็บลิงก์"
      "อยู่ที่ไหน catid = ". (int) $นี่->_id.
      "และเผยแพร่ = 1"
      "และเก็บถาวร = 0"
      "สั่งซื้อโดย" $fi lter_order ""
      $fi lter_order_dir ”, กำลังสั่งซื้อ”;
      ส่งคืน $ แบบสอบถาม;
      }

      ที่นี่คุณจะเห็นว่าตัวแปร $filter_order และ $filter_order_dir ไม่ได้ถูกตรวจสอบการปฏิบัติตามคำสั่ง SQL อย่างเข้มงวด การตรวจสอบจะดำเนินการโดยใช้เมธอด clean มาตรฐานจากคลาส JFilterInput เท่านั้น:

      เราวางโค้ดนี้ไว้ที่ใดก็ได้บนเว็บไซต์ ซึ่งจะแสดงลิงก์แบบสุ่ม 5 ลิงก์จากฐานข้อมูลและจุดยึดแบบสุ่ม เป็นการดีกว่าที่จะเจือจางพุกแทนที่จะเขียนเพียง 1 ลงในลิงก์ ด้วยการเชื่อมโยงที่เหมาะสมบนเว็บไซต์ของคุณ คุณจะเห็นปริมาณการเข้าชมที่เพิ่มขึ้นและการปรับปรุงตัวบ่งชี้เว็บไซต์อื่น ๆ ทันที

      ฉันหวังว่าจะมีคำถามของคุณในความคิดเห็นในโพสต์นี้

      วันที่เผยแพร่: 3 มีนาคม 2014
        บทวิจารณ์และความคิดเห็น:

        มิทรี:
        ขอบคุณสำหรับสคริปต์ ฉันจะนำไปใช้ เป็นไปไม่ได้ที่จะคัดลอกซอร์สโค้ดจากไซต์ แต่จะคัดลอกเป็นส่วนเล็ก ๆ เท่านั้นซึ่งจะสะดวกกว่าอย่างครบถ้วน

        คิริลล์:
        ขอบคุณสำหรับหมายเหตุเกี่ยวกับการคัดลอก ฉันเพิ่งเห็นมันแล้ว ฉันจะพยายามแก้ไขโดยเร็วที่สุด

        อเล็กเซย์ พาฟลอฟ:
        เกิดข้อผิดพลาดในบรรทัด $tex = explode(///,$sendlist[$count] คุณต้องมีอัฒภาค ไม่ใช่โคลอน ฉันเปลี่ยนโค้ดเล็กน้อยเพื่อให้ชัดเจนยิ่งขึ้น:

มีคำถามอะไรไหม?

แจ้งการพิมพ์ผิด

ข้อความที่จะส่งถึงบรรณาธิการของเรา: