File Inclusion Vulnerability Exploit
Bài đăng này đã không được cập nhật trong 4 năm
I. Mở đầu
Tiếp theo trong series về khai thác lỗ hổng trong tấn công ứng dụng web , bài viết này mình sẽ hướng dẫn các bạn về 1 cách tấn công phổ biến hơn , đó là File Inclusion trong lập trình PHP
II. Khái niệm
FIle Inclusion cho phép kẻ tấn công có thể xem các tệp trên máy chủ từ xa mà không cần nhìn thấy hoặc có thể thực thi các mã vào 1 mục tiêu bất kì trên trang web .
Điều này xảy ra là do trong code php web , lập trình viên đã sử dụng các lệnh include
, require
, include_once
, require _ once
, các lệnh này cho phép việc file hiện tại có thể gọi ra 1 file khác.
Dấu hiệu để nhận biết rằng trang web có thể tấn công file inclusion là đường link thường có dạng php?page=,hoặc php?file= .... Để biết trang web có bị lỗi này hay không ta chỉ cần thêm 1 dấu ' vào đường link , ví dụ như là php?page='
. Và trên trình duyệt sẽ có thông báo dạng
Warning: Warning: include() [function.include]: Failed opening ''' for inclusion (include_path='.;C:\php5\pear') in C:\wamp\www\FI.php on line 40
Nguyên nhân gây ra lỗi này là khi sử dụng các lệnh trên, lập trình viên lại gọi các file cần mở thông qua biến. Các biến này hoặc chưa được khởi tạo, hoặc do người dùng quyết định.
File Inclusion có thể dẫn đến các cuộc tấn công sau :
- Code execution on the web server
- Cross Site Scripting Attacks (XSS)
- Denial of service (DOS)
- Data Manipulation Attacks
Trong bài viết này , mình sẽ nói về 2 kiểu của FI , đó là Local File Inclusion và Remote File Inclusion
III. Các kiểu tấn công
1. Local File Inclusion
Local file inclustion (LFI) là kĩ thuật đọc file trong hệ thống , lỗi này xảy ra thường sẽ khiến website bị lộ các thông tin nhảy cảm như là passwd
, php.ini
, access_log
,config.php…
Trong bài viết này , mình sẽ đưa ra các ví dụ được làm trên Damn Vulnerable Web App hay còn được gọi là DVWA
Trong một cuộc tấn công LFI cơ bản , chúng ta sẽ sử dụng local file inclusion để thu thập thông tin trên máy chủ từ xa và khai thác nó để có thể chiếm được quyền root shell .
Sau khi set độ khó là low trên DVWA , chúng ta sẽ có giao diện như thế này :
http://192.168.1.111/dvwa/vulnerabilities/fi/?page=file1.php
Ở đây chúng ta thấy ?page=
sẽ trỏ đến 1 file có tồn tại trên máy chủ , và trong bài này là trỏ đến file1.php
Đầu tiên, chúng ta cần phải biết về những thứ có thể tìm thấy trong 1 trang web , tức là các đường dẫn phổ biến , và được công nhận trên toàn thế giới . Ở đây , mình sẽ sử dụng payload có sẵn trên github để miêu tả cuộc tấn công và đó là /etc/passwd
Nhưng trước khi vào được /etc/passwd , chúng ta cần nhập đủ các thư mục trước đó để đưa chúng ta trở lại thư mục gốc . Trong trường hợp này chúng ta sử dụng Path Traversal để truy cập tệp /etc/passwd.
Path Traversal còn được biết đến là tấn công truyền tải đường dẫn nhằm mục đích truy cập các tệp và thư mục được lưu trữ bên ngoài thư mục gốc của trang web . Bằng cách sử dụng biến tham chiếu
../
và các biến thể của nó , hoặc bằng cách sử dụng các đường dẫn tệp tuyệt đối , có thể truy cập các tệp và thư mục được lưu trự trên hệ thống bao gồm mã nguồn ứng dụng hoặc các tệp tin quan trọng
Trong ảnh dưới đây là ví dụ minh hoạ về cây thư mục của linux
Như chúng ta thấy để có thể đến được thư mục etc, chúng ta cần phải sử dụng ../
để đại diện cho các thư mục đằng trước.
Và chúng ta thu được kết quả :
Khi chúng ta thực hiện cuộc tấn công này, thường chúng ta không thực sự biết cách hoạt động thư mục của ứng dụng ,nó thường có thể nằm ở rất sâu trong các thư mục hoặc nằm trong thư mục home của user . Vì vậy để có thể trở lại thư mục gốc , chúng ta cần chắc chắn rằng đường dẫn của chúng ta bao gồm đầy đủ các thư mục ở trước đó , và có lẽ đây là một cuộc tấn công giả tưởng , vì chúng ta cần phải đoán xem nó ở đâu .
../../../../../../../../../../../../../../etc/passwd
Để có thể đến được thư mục root và đến /etc/passwd , mình đã phải quay lại trước đó đến tận 14 thư mục ( điều này là không giống nhau , tuỳ thuộc vào cách bạn cài đặt và sử dụng DVWA)
Và nếu như đã đến được đây , tất nhiên , điều này không giới hạn bạn chỉ đến đường dẫn /etc/passwd mà có thể đến bất cứ thư mục nào khác trên ứng dụng web có tồn tại
Đây là 1 trong các cách cơ bản để tấn công file inclusion , ngoài ra bạn có thể tham khảo các cách tấn công khác cũng trên DVWA ở những mức độ cao hơn :
2. Remote File Inclusion
Remote File Inclusion còn được viết tắt là RFI cho phép kẻ tấn công nhúng một mã độc hại được tuỳ chỉnh trên trang web hoặc máy chủ bằng cách sử dụng các tập lệnh . RFI còn cho phép tải lên một tệp nằm trên máy chủ khác được chuyển đến dưới dạng hàm PHP ( include
, include_once
, require
, or require_once
)
Đây là một lỗ hổng rất phổ biến do việc sử dụng hàm include rất nhiều và cũng là thiết đặt mặc định của server như là set allow_url_include = On
Lỗ hổng này sẽ khiến kẻ tấn công có thể thực thi các lệnh từ xa trên máy chủ web , xoá các phần của web và lấy dữ liệu thông tin của trang web.
Để thực hiện cuộc tấn công này , chúng ta sẽ thử nhúng các url vào trang web có sẵn :
http://localhost/DVWA/vulnerabilities/fi/index.php?page=
Ở đây mình sẽ thử nhúng trang google vào và thu được kết quả :
Vậy là trang web mà mình muốn tấn công cho phép tải lên trang web khác.
Điều này dẫn đến việc mình có thể nhúng các lệnh php mà mình muốn lên trang web và thực thi các lệnh đó
Để làm vậy mình tạo 1 file tên là script.html có nội dung như sau :
<br><br><br><br><br><br><br>
<font color="red">
<center>
<h1> Hack by Viblo </h1>
</center>
</font>
<br><br><br><br><br><br><br>
Sau đó mình nhúng link file này vào trong trang web mình muốn tấn công và thu được kết quả :
Tuy nhiên, thường thì chúng ta sẽ không thể dễ dàng như vậy để khai thác lỗ hổng này trên 1 trang web.
Ở ví dụ tiếp theo này , hàm str_replace() sẽ xoá tất cả các giá trị được gán như là http://
; https://
và các kí tự như ../
; ..\
và thay thế bằng giá trị ""
, và trả lại trang ban đầu cho người dùng
Điều này khiến chúng ta không thể nhập link như thế này được nữa :
http://localhost/DVWA/vulnerabilities/fi/index.php?page=htttp://www.google.com
Vậy để bypass qua hàm str_replace() chúng ta làm thế nào ?
Bời vì hàm này sẽ xoá giá trị http://
và trả lại trang ban đầu , vì thế ta có thể làm như sau :
http://localhost/DVWA/vulnerabilities/fi/?page=htthttp://p://www.google.com
Chúng ta sẽ chèn thêm 1 giá trị http:// vào giữa giá trị http://
, điều này sẽ khiến hàm str_replace() đọc và thay giá trị http:// ở giữa thành giá trị ""
và trả lại trang ban đầu không có giá trị http://
Đây là những cách cơ bản để bạn có thể tiếp cận và khai thác môt trang web , bước tiếp theo tuỳ thuộc vào mục đích cá nhân của bạn và trang web bạn muốn khai thác lỗ hổng này.
IV. Phòng tránh :
- Xác thực đầu vào chặt hơn
- Không bao gồm các trình phân tách thư mục như "/"
- Sử dụng danh sách trắng cho các file extension được cho phép
- Set
allow_url_fopen
vàallow_url_include
thành off để giới hạn việc có thể gọi các tệp tin từ xa - Cập nhập phiên bản PHP mới nhất
- Cấu hình PHP để không sử dụng register_globals
Tài liệu tham khảo :
All rights reserved