Hướng dẫn php file inclusion

Local File Inclusion là một lỗ hổng cực kì nguy hiểm giúp hacker có thể đọc các file nhạy cảm trên server.

Đặc biệt, nếu biết cách khai thác, hacker có thể RCE (Remote Code Execution) dễ dàng thông qua một vài phương pháp phổ biến.

Khoan đã, trong bài viết này mình sẽ hướng dẫn bạn khai thác LFI (Local File Inclusion) ở mức cơ bản và bypass một số cơ chế bảo vệ.

Tất nhiên phần RCE mình sẽ để ở một bài viết khác, nói chung phải vững cơ bản t rước khi học nâng cao nhé!

Nào, còn chần chừ gì nữa, bạn đang rất nóng lòng nhỉ?? Let’s go!

NOTE: Nếu hình ảnh quá nhỏ để xem, hãy nhấp chuột phải vào ảnh -> Open image in new tab 🙂

# Chuẩn bị những gì?

Tất nhiên là phần này là cần thiết rồi, chúng ta cần phải chuẩn bị một số vật liệu cần thiết trước khi bắt tay vào hack chứ nhỉ?

Dưới đây là những thứ cần thiết trong bài học của ngày hôm nay:

  • Phần mềm ảo hóa: Bài lab này mình sẽ dùng Virtualbox, bạn có thể download nó tại đây.
  • Máy Hacker (Kali Linux): Hacking mà thiếu Kali Linux thì quả là không thể tin được. Download tại đâynhé!
  • DVWA: Chúng ta sẽ cài DVWA trên máy Kali luôn cho nhẹ và dễ thực hành. Làm theo Video cài đặt bên dưới.

Ok, bấy nhiêu là đủ cho bài học của ngày hôm nay rồi đấy. Các bạn tải về rồi tiến hành cài đặt nhé, nó cũng không quá khó đâu.

Nói thì có vẻ hơi khó hiểu một chút, các bạn quan sát hình ảnh bên dưới nhé!

Hướng dẫn php file inclusion

Ví dụ, bên trên là một URL khi bạn muốn xem một file ảnh có tên là cat.jpg. Với người bình thường thì nhìn rất normal, nhưng với hacker chúng ta thì không.

Vậy nếu mình không muốn xem ảnh mà muốn xem file khác thì sao? Đơn giản chỉ cần thay cat.jpg bằng đường dẫn của file cần xem là xong, quá dễ nhỉ??

Nếu chúng ta có thể xem file mà chúng ta muốn thì Website dính lỗi File Inclusion, haha. Bạn đã hiểu chưa????

Lỗi này xảy ra đó là vấn đề dữ liệu đầu vào của người dùng không được lọc kĩ lưỡng, gây ra ảnh hưởng rất lớn đến Server.

Các hàm PHP thường xảy ra lỗi này là include, require, include_once, require_once.

Một ví dụ đơn giản như sau về code PHP dính LFI (Local File Inclusion)

Hướng dẫn php file inclusion

Hàm include() lấy tất cả text trong file đã chỉ định và show chúng ra trên Website. Còn các hàm khác thì bạn tự tìm hiểu nhé!

Và ngoài việc đọc các file nhạy cảm trên Server, chúng ta còn có thể dùng lỗi LFI để RCE (Thực thi mã từ xa – Remote Code Execution).

# Path Traversal

Đây là phần cực kì quan trọng, bạn cần phải hiểu nó để có thể khai thác Local File Inclusion hiệu quả. Nói chung thì nó không quá khó đâu. Dùng Kali Linux để thực hành luôn cho dễ nhé!

Hướng dẫn php file inclusion
Vầy cho dễ nhớ:

  • ../ là lùi lại một thư mục
  • ../../ là lùi lại hai thư mục
  • ../../../ là lùi lại ba thư mục

Đừng lo nếu không hiểu thì đến phần thực hành mình sẽ giải thích rất dễ hiểu.

#1 Bắt đầu với Low

Chúng ta sẽ bắt đầu khai thác File Inclusion ở mức độ dễ trước (Low) rồi từ từ nâng cấp độ lên cho dễ hiểu các bạn nhé!

Chọn DVWA Security -> chọn Low Submit là xong. Sau đó chọn phần File Inclusion để bắt đầu thực hành nào.

Hướng dẫn php file inclusion

Trước khi chúng ta bắt đầu khai thác File Inclusion, hãy đọc source code trước, mình sẽ giải thích cho các bạn nguyên nhân xảy ra lỗi này là gì.

Chọn File Inclusion  -> View Source

Hướng dẫn php file inclusion

Chọn xong thì nó sẽ hiện ra phần source dẫn đến lỗi File Inclusion, code PHP này cũng dễ dàng để hiểu thôi.

Hướng dẫn php file inclusion

Để mình giải thích cho các bạn đoạn code PHP này. 

Server sẽ lấy dữ liệu từ người dùng ($_GET) thông qua biến page. Nhìn URL bên dưới bạn sẽ hiểu.

Hướng dẫn php file inclusion

Bạn có thể thấy biến page lấy dữ liệu từ người dùng (ở đây là file file1.php), sau đó nó sẽ thực thi file này, quá đơn giản haha. 

Lỗi xảy ra khi chúng ta có thể tận dụng biến page để đọc các file nhạy cảm trên Server. 

Server hiện tại đang dùng là Linux, dưới đây là list file nhạy cảm bạn có thể đọc:

  • /etc/passwd: Thông tin các user trên Server
  • /etc/shadow: Thông tin về password của các user trên Server
  • /proc/version: Thông tin về Version của Linux Kernel
  • /root/.ssh/id_rsa: Thông tin private SSH keys của root (dùng để truy kết nối SSH không cần password)
  • /var/log/apache2/access.log: Thông tin các request trên Apache Server (có thể dùng để Reverse Shell)

Ok, giờ chúng ta sẽ tận dụng lỗi này để bắt đầu đọc file /etc/passwd xem coi có hiệu quả không? Let’s go!

Hướng dẫn php file inclusion

Wow, chúng ta đã đọc được file /etc/passwd trên Server nhưng có vẻ hơi khó nhìn một chút, một thủ thuật nhỏ dành cho bạn là hãy xem Source code để nhìn dễ hơn.

Hướng dẫn php file inclusion

Chúng ta có thể dùng Path Traversal để đọc /etc/passwd nữa nhé, nhìn bên dưới sẽ hiểu.

Hướng dẫn php file inclusion

Mình sẽ giải thích tại sao chúng ta lại dùng ../../../../../../etc/passwd

Hướng dẫn php file inclusion

Ok, giờ thì dễ nhìn hơn rất nhiều rồi nhỉ, kết quả của việc khai thác là chúng ta có thể đọc được file trên Server. Bạn có thể áp dụng để đọc một số file khác mà mình đã note bên trên.

Thực hành đọc thử rồi bạn sẽ biết nhé! Đôi lúc sẽ có một số file chúng ta không đọc được vì Permission Denied (Không có quyền truy cập).

Điển hình là khi ta đọc file /etc/shadow

Hướng dẫn php file inclusion

Ok, giờ bạn có thể tận dụng lỗi này để bắt đầu đọc một số file khác trong quyền hạn cho phép 🙂 Thực hành đọc thử là biết ngay mà hihi.

# Remote File Inclusion

Local file Inclusion có thể giúp chúng ta đọc file trên Server, đây chỉ là một dạng lỗi File Inclusion. Còn một dạng khác gọi là Remote File Inclusion.

Điều kiện để xả ra lỗi RFI là allow_url_fopen = On

Nhìn hình bên dưới bạn sẽ hiểu.

Hướng dẫn php file inclusion
Mở Google Search luôn mới ghê

Hướng dẫn php file inclusion

Qua 2 ví dụ bên trên chắc bạn cũng hiểu về Remote File Inclusion rồi nhỉ?? Điều gì xảy khi lỗi bị tận dụng đọc file trên Server của Hacker, cũng khá thú vị nhỉ????

#2 Tiếp tục với Medium

Theo kinh nghiệm ngâm cú của mình thì các bạn cứ học từ từ, không việc gì phải gấp cả, chúng ta học từ basic, nắm vững thì học những cái cao hơn sễ đơn giản rất nhiều.

Thôi, giờ hãy chỉnh DVWA Security lên mức Medium và bắt đầu đọc Source code của File Inclusion nhé!

Hướng dẫn php file inclusion

Đoạn code ở level Medium có về không dễ dàng cho lắm nhỉ haha??? Giờ thì cùng mình phân tích nào:

  • Dòng đầu vẫn là lấy dữ liệu từ người dùng ($_GET) thông qua biến page
  • 2 hàm str_replace() sẽ thay thế http://, https://, ../, ..\\ thành “” (mất tiêu) trong chuỗi mà chúng ta nhập vào

Nghĩa là 

  • http://google.com thành google.com
  • https://google.com thành google.com
  • ../etc/passwd thành etc/passwd
  • ..\\etc/passwd thành etc/passwd

Thử một cái là hiểu ngay!

Hướng dẫn php file inclusion

Hướng dẫn php file inclusion

Nếu dùng cách khai thác cũ thì chúng ta sẽ bị bắt ngay. Ở mức Medium Server đã dùng một số cơ chế lọc mà mình vừa phân tích ở trên.

Do đó, phần này, chúng cần phải dùng một số kĩ thuật để bypass.

Hướng dẫn php file inclusion

Nếu nó xóa https://, http:// của chúng ta thì chúng ta chỉ cần đổi một kí tự thành in hoa là xong. Ví dụ Https://, htTps://, httP://,…

Hướng dẫn php file inclusion

Bạn có thể thấy mình dùng ..././..././..././..././..././..././etc/passwd

Server sẽ xóa chuỗi của chúng ta (máy cái tô đỏ sẽ bị xóa), nó sẽ thành ../../../../../../etc/passwd. Vậy là đọc được file /etc/passwd rồi 🙂

Hướng dẫn php file inclusion

Vận dụng đầu óc một chút để suy nghĩ ra những cách bypasss khác nhé!

Ok, giờ thì chúng ta có thể bypass level Medium để đọc file rồi đây, thú vị không????

#3 Level High

Chỉnh level lên High rồi bắt đầu thực hành nào các bạn. Bắt đầu xem Source Code đầu tiên để xem nó dùng cái gì để defend nào.

Hướng dẫn php file inclusion

Nhìn source cũng hơi cay cay đấy các bạn. Cùng mình phân tích nào:

– Dòng đầu tiên vẫn là lấy tham số thông qua biến page từ người dùng

– Hàm if có 2 điều kiện:

  • chuỗi ta nhập vào không được bắt đầu bằng từ “file” (hàm fnmatch())
  • không bao gồm “include.php

Nếu 2 điều kiện đó thõa mãn thì ta sẽ nhận được một thông báo ERROR: File not found!

Hướng dẫn php file inclusion

Hướng dẫn php file inclusion

Thực tế, dùng bypass ở level Medium sẽ không có tác dụng trong trường hợp này. Và để bypass thì chỉ cần dùng thủ thuật đơn giản thôi.

Hướng dẫn php file inclusion

Đó là một số cách bypass các level trong DVWA khi ta gặp lỗi Local File Inclusion. Nhưng thực tế, khá ít Server dùng các cơ chế lọc như vậy.

Phân này, chúng ta đã biết cơ bản lỗi Local File Inclusion nói riêng hay File Inclusion nói chung, phần dưới, mình sẽ hướng dẫn thêm các cách bypass thực tế nhất.

# Đọc data file .php 🙂

Quay lại và tùy chỉnh DVWA ở mức Medium, chúng ta sẽ bắt đầu thực hành.

PHP Filter

Thông thường khi khai thác LFI, chúng ta không thể đọc được các file .php vì đơn giản nó sẽ thực thi thay vì cho chúng ta đọc.

Điều đó sẽ được khắc phục với PHP Filter, thông qua các hàm này, chúng ta có thể đọc nội dung của các file .php trên Server.

Nhưng một chú ý là chúng ta chỉ có thể đọc các file này dưới dạng Base64 hoặc ROT13.

# Base64

Mình sẽ tiến hành đọc file include.php thông qua PHP Filter dưới dạng base64 cho bạn dễ hình dung.

Payload của chúng ta có dạng: http://127.0.0.1/DVWA/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=include.php

Hướng dẫn php file inclusion

Sau khi tiến hành decode base64, chúng ta sẽ nhận được đoạn code của file include.php

Hướng dẫn php file inclusion

# ROT13

Ok, giờ mình sẽ đọc code của file include.php dưới dạng ROT13 nhé!

Payload của chúng ta có dạng: http://127.0.0.1/DVWA/vulnerabilities/fi/?page=php://filter/read=string.rot13/resource=include.php

Hướng dẫn php file inclusion

Hướng dẫn php file inclusion
Decode ROT13 ra code include.php

Giờ bạn hoàn toàn có thể dùng thủ thuật đó để đọc các file .php thông qua lỗi Local File Inclusion, cảm nghĩ của bạn lúc này thế nào????

Ok, bên trên là những gì mà bạn cần phải biết về lỗi Local File Inclusion, hi vọng bài viết sẽ gúp bạn nâng cao level.

  • Có thể bạn thích bài viết: Khai thác LFI để Reverse Shell bằng Log Poisoning