ผู้สอน: มาคุยกันว่าเราจะป้องกันช่องโหว่เหล่านี้ได้อย่างไร
สิ่งแรกคือช่องโหว่เหล่านี้มีอยู่มากมายเนื่องจากฟังก์ชันการทำงานที่มีให้
ตัวอย่างเช่น ปัญหาการอัพโหลดไฟล์ที่เรามี
ทำให้ผู้ใช้สามารถอัพโหลดไฟล์นามสกุลใด ๆ ไฟล์ประเภทใด
ๆ สิ่งนี้ไม่ควรเกิดขึ้น ไม่ควรมีวิธีให้ผู้ใช้อัพโหลดไฟล์ใด ๆ ที่พวกเขาต้องการ
บางทีถ้าคุณต้องการให้พวกเขาอัปโหลดรูปภาพ
ตรวจสอบให้แน่ใจว่าพวกเขากำลังอัปโหลดรูปภาพ
ตรวจสอบประเภทไฟล์
หากคุณต้องการให้พวกเขาอัปโหลดเพลง ไฟล์ MP# ให้ตรวจสอบว่าเป็นไฟล์มีเดีย
ไม่ใช่ PHP หรือโค้ดสั่งการ
โดยปกติ คุณไม่ควรอนุญาตให้ผู้ใช้อัปโหลดโปรแกรมปฏิบัติการใดๆ
คุณสามารถใช้ตัวกรองเพื่อตรวจสอบว่า เพื่อตรวจสอบนามสกุล
และตรวจสอบให้แน่ใจว่าไฟล์ที่กำลังอัปโหลดเป็น
JPEG หรืออะไรก็ตาม
แต่นั่นไม่ใช่วิธีที่ดี
วิธีที่ดีที่สุดคือการตรวจสอบประเภทไฟล์และให้แน่ใจว่าประเภทไฟล์เป็นรูปภาพหรือเป็นไฟล์สื่อ
แทนที่จะตรวจสอบนามสกุลเพราะสามารถข้ามได้เช่นกัน
ช่องโหว่ประเภทที่สองที่เราตรวจสอบคือช่องโหว่การเรียกใช้โค้ด
ในการหาประโยชน์เหล่านี้ เราสามารถเรียกใช้โค้ดใดๆ ที่เราต้องการบนคอมพิวเตอร์เป้าหมายได้
อีกครั้งควรหลีกเลี่ยงฟังก์ชันนี้
คุณควรหลีกเลี่ยงการอนุญาตให้ผู้ใช้เรียกใช้โค้ดใดๆ
บนเซิร์ฟเวอร์ของคุณ
พยายามหลีกเลี่ยงฟังก์ชันเหล่านี้ทั้งหมด
เช่น var pass through และฟังก์ชันทั้งหมดที่อนุญาตให้ผู้ใช้เรียกใช้โค้ดระบบปฏิบัติการบนเซิร์ฟเวอร์
หากคุณจำเป็นต้องใช้บางอย่างเช่นนั้น
ให้ตรวจสอบให้แน่ใจว่าคุณวิเคราะห์อินพุตก่อนที่จะดำเนินการ
ตัวอย่างเช่น ในตัวอย่าง เราเห็นตำแหน่งที่โค้ดทำการ
ping และมันจะทำการ ping ทุกสิ่งที่เราใส่ในกล่องข้อความ
ดังนั้นฉันจึงใส่ที่นี่ /$textbox เพื่อแสดงว่านี่คืออินพุตที่เราใส่ในกล่องข้อความ
นี่คือสิ่งที่โปรแกรมดูเหมือนจริง
ๆ ถ้ามันดูซับซ้อนเกินไป ลืมไปเลย เรากำลังพูดถึงแนวคิดที่นี่
เราจะมาพูดถึงเรื่องนี้กันที่นี่
ตัวอย่างเช่น สมมติว่าคุณใส่สิ่งที่เราทำคือเราใส่
IP ปกติ จากนั้นเราใส่เครื่องหมายอัฒภาค
จากนั้นเราใส่คำสั่งที่เราต้องการจะทำ ตัวอย่างเช่น
ls -la
ปัญหาของสิ่งนี้คือเว็บแอปพลิเคชันที่ใช้ในการดำเนินการในลักษณะนี้
คัดลอก และเรียกใช้ในที่นี่
ซึ่งเมื่อคุณรันคำสั่งนี้ มันจะทำการ
ping ก่อน จากนั้นจะทำ ls -la ซึ่งเป็นคำสั่งที่เราต้องการ
สิ่งที่คุณต้องทำคือ ตัวอย่างเช่น ถ้าคุณต้องทำ
สิ่งที่ฉันแนะนำคือคุณอย่าใช้ฟังก์ชันเหล่านี้
หากคุณต้องใช้ฟังก์ชันแบบนี้ สิ่งที่คุณควรทำคือตรวจสอบว่าอินพุตเป็นสิ่งที่คุณคาดหวัง
เช่น คุณคาดหวังที่อยู่
IP และไม่มีอย่างอื่น ดังนั้นคุณสามารถใช้
regex เพื่อให้แน่ใจว่าตอนนี้ ฉันจะไม่พูดถึง
regex หรือ regex คืออะไร regex นั้นเป็นกฎที่ทำให้แน่ใจว่าอินพุตนั้นอยู่ในรูปแบบต่อไปนี้
ดังนั้นมันจึงใช้ตัวเลข
หลักจุด หลักจุด หลักจุด หลักจุด หลักจุด ซึ่งถ้าฉันใส่อย่างอื่น
เว็บแอปพลิเคชันควรปฏิเสธมัน
คุณยังสามารถตรวจสอบให้แน่ใจว่าไม่มีเครื่องหมายอัฒภาคและไม่มีการเว้นวรรค
ดังนั้นทุกอย่างจึงมารวมกันเป็นหนึ่งเดียวแล้วจึงดำเนินการได้
อีกครั้ง นี่เป็นวิธีทำให้ปลอดภัยยิ่งขึ้น แต่สิ่งที่ดีที่สุดคือการหลีกเลี่ยงฟังก์ชันเหล่านี้
ช่องโหว่ประเภทที่สามที่เราตรวจสอบคือการรวมไฟล์
และเราพิจารณาสองประเภท
การรวมไฟล์ในเครื่องซึ่งทำให้เราสามารถรวมไฟล์ใด
ๆ ในระบบแล้วอ่านไฟล์ซึ่งจะทำให้เกิดช่องโหว่ในการเปิดเผยไฟล์จากนั้นคุณจะสามารถอ่านไฟล์ใด ๆ บนเซิร์ฟเวอร์ได้จากนั้นเราก็ดูที่การรวมไฟล์ระยะไกลซึ่งก็คือ
อันตรายมากซึ่งทำให้เราสามารถรวมไฟล์ใด ๆ จากเว็บเซิร์ฟเวอร์ใด ๆ ดังนั้นเราจึงสามารถรวมเชลล์ PHP แล้วรับการเชื่อมต่อจากคอมพิวเตอร์เป้าหมาย
เพื่อป้องกันสิ่งเหล่านี้ ก่อนอื่น
ตรวจสอบให้แน่ใจว่าคุณได้ป้องกันการรวมไฟล์ระยะไกลแล้ว
ดังนั้น ในกรณีที่มีสิ่งผิดปกติเกิดขึ้น
ผู้คนจะไม่สามารถรวมไฟล์จากภายนอกเซิร์ฟเวอร์ของคุณได้
และคุณสามารถทำได้เช่นเดียวกับที่เราเปิดใช้งานโดยใช้ PHP ini
โดยการปิดใช้งาน allow_url_fopen และ allow_url-include
และถ้าเราไปที่นี่เพื่อ Metasploitable
ฉันจะแสดงให้คุณเห็นอย่างรวดเร็ว
ดังนั้นถ้าเราทำ sudo nano ซึ่งเป็นโปรแกรมแก้ไขข้อความ /etc/PHP/cgi/php
ini
ไฟล์เดียวกับที่เราใช้
นี่คือไฟล์สำหรับการตั้งค่า PHP
หากคุณเปิดไฟล์นั้น
และตอนนี้ ฉันจะทำ Control
+ W และค้นหา allow_url
และคุณต้องการให้แน่ใจว่า Allow_url_fopen
ถูกตั้งค่าเป็น Off และ allow_url_include
ถูกตั้งค่าเป็น Off ด้วย
ควบคุม + X + Y แล้วป้อนเพื่อบันทึกให้คุณ
อีกวิธีหนึ่งในการป้องกันการหาประโยชน์เหล่านี้คือการใช้การรวมไฟล์แบบสแตติก
ดังนั้นแทนที่จะใช้การรวมไฟล์แบบไดนามิกที่เราเคยเห็น
คุณสามารถฮาร์ดโค้ดไฟล์ที่คุณต้องการรวมไว้ในโค้ดและไม่ใช้ GET หรือ POST
ตัวอย่างเช่น สิ่งที่เกิดขึ้นในตัวอย่างที่เราเห็นในตัวอย่างช่องโหว่คือ
เรามีเพจที่เรียกว่าเพจหรือดัชนี
php.php
แล้วดัชนีนี้ php ดึงพารามิเตอร์ที่เรียกว่า
page แล้วจึงนำหน้าอื่น
เช่น news php.php
และรวมถึงข่าวนี้ด้วย php ในโค้ด
ดังนั้นรหัสมีลักษณะอย่างไร?
ในโค้ด PHP คุณจะเห็นบางอย่างเช่นรวม
โดยพื้นฐานแล้วสิ่งนี้จะทำอะไร
และดูเหมือนว่าสิ่งนี้ ฉันเชื่อว่าสิ่งนี้ทำอะไร
มันรวมทุกอย่างที่เกิดขึ้นหลังจากพารามิเตอร์ของเพจ
ดังนั้นโค้ดจะรับสิ่งที่เข้ามาหลังจากพารามิเตอร์ของเพจแบบไดนามิก
และรวมไว้ในเพจปัจจุบัน ดังนั้นสิ่งนี้จะอยู่ในดัชนี
หน้า php.
โอเค มันแย่มากเพราะถึงจะไม่ใช่
GET แต่บางครั้งมีคนใช้ POST และใน POST คุณจะไม่เห็นสิ่งนี้จึงจะโพสต์
แต่คุณสามารถใช้พร็อกซีเช่น Burp proxy ได้และจะมีลักษณะเช่นนั้นแล้ว คุณสามารถแก้ไขและให้มันรวมสิ่งที่คุณต้องการแล้วจึงแสดงบนหน้า
สิ่งที่เราอยากทำจริงๆ คือเราต้องการให้ผู้ใช้ไม่สามารถจัดการกับสิ่งที่จะถูกรวมไว้ได้
ดังนั้นหากคุณต้องการรวมเพจที่เรียกว่า news
php
ให้รวมไว้ในนี้โดยที่ผู้ใช้ไม่สามารถเปลี่ยนแปลงได้
ฉันรู้ว่าคุณจะตั้งโปรแกรมโค้ดของคุณให้มีลักษณะเช่นนี้
แต่ผู้ใช้ เรารู้แล้ว เราเห็นว่าผู้ใช้สามารถเล่นกับสิ่งนี้ได้อย่างไร และเพียงแค่รวมทุกอย่างที่พวกเขาต้องการ
วิธีที่ดีที่สุดคือให้รวมเพจไว้ด้วย
php
ดังนั้นโค้ดของคุณจึงไม่ใช้ตัวแปรใดๆ
ฮาร์ดโค้ดอาจทำให้โค้ดของคุณยาวขึ้นแต่ปลอดภัยกว่ามาก