bảo mật trong việc cho phép upload file!!! 2007-07-28 04:50:06

Mình cho phép user upload hình đại diện lên trang web. User lợi dụng lỗi bảo mật để upload file php có đuôi là gif. Trong file php đó có mã code shell để chiếm đoạt quyền quản lý file (có thể thêm/xóa/sửa file. Xin chỉ mình cách khắc phục gấp nha các bạn.

Tra loi 34 comment(s) pigbig_vn 2007-07-28 04:50:06

m4trix_v2:http://www.muabanvechai.com 2007-07-28 08:49:12

cái này là do bạn không kiểm tra kỹ kiểu của file upload lên..mình nghĩ là chắc bạn chỉ kiểm tra đuôi file (...jpg , .gif ) mà thôi nên người ta lợi dụng sơ hở này..để upload file php , người ta chỉ cần đặt tên file php như thế này : abc.php#test.jpg ...
bạn có thể vào đây để xem cách sử dụng file upload . File này rất hay..File type không phải là image thì nó sẽ tự động chuyển thành txt..bạn có thể tham khảo tại www.verot.net

Tra loi

TG 2007-07-28 11:29:30

bạn có thể tạm thời dùng .htaccess để chống truy cập và file .php, tham khảo http://phpbasic.com/137.html

Tra loi

pigbig_vn 2007-07-29 11:18:35

Xin cám ơn những chỉ dẫn của các bạn.

Tra loi

pigbig_vn 2007-07-29 12:33:15

TG :Underline
Ko đc TG ơi. Do file PHP đã bị đổi đuôi lại thành đuôi .gif nên file .htaccess ko tác dụng. Help me !!!!

m4trix_v2Underline
m4trix_v2 ơi, bạn chỉ mình cụ thề địa chỉ hơn đi. Mình kiếm hoài trên địa chỉ http://www.verot.net/ mà vẫn ko thấy. hu hu.Giúp mình với.

ah, làm sao minh upload file đính kèm lên để cho các bạn xem thử file đó bi giờ??

Tra loi

BinhPham 2007-07-29 01:49:54

kết hợp kiểm tra file extension, mime type

Tra loi

pigbig_vn 2007-07-29 07:50:05

Bạn BinhPham oi, bạn nói rõ hơn dùm mình đi. Mình là dân amater nên chẳng bít gì đâu. hic hic

Tra loi

m4trix_v2:http://www.muabanvechai.com 2007-07-29 08:28:54

thi ban vao trang do ..thay dong chu nay khong : class.upload.php v0.24
has been released.
Neu thay thi click vào đó...đó là cái class.upload đó bạn à.
Thân

Tra loi

e-learning 2007-07-30 02:31:12

Theo mình thì bạn cho kiểm tra thêm kiểu file được upload lên nữa là ok thôi mà. Kiểm tra phần đuôi + kiểm tra kiểu là good à

Tra loi

pigbig_vn 2007-07-30 09:14:32

Kiểm tra kiểu file là sao hả bạn e-learning?? bạn nói rõ hơn chút đi. Thanks

Tra loi

TG 2007-07-31 09:03:42


chỉ có 1 cách, hơi mất thời gian nhưng đảm bảo nhất là bạn cứ cho upload file lên host, sau đó dùng hàm filetype($file) để kiểm tra định dạng, hàm filetype không kiểm tra dựa vào cấu trúc file do đó cho dù bạn đổi phần mở rộng
<?php
//upload $file lên 1 thư mục ẩn
$type = filetype($file);
if(
substr($type,0,5)!='image') { print "không phải image";
@
unlink($file); //xóa file đó di
}
?>

Tra loi

e-learning 2007-07-31 09:32:59

Cách của TG cũng được nhưng tại sao ta không kiểm tra ngay bước upload luôn, không cần phải chờ upload xong rồi ta mới xóa đi.

@pigbig_vn: bạn dùng hàm $_FILE['userfile']['type'] để lấy kiểu của file. Xong rồi thì kiểm tra với cái mảng kiểu file mà bạn cho phép upload lên.

Tra loi

TG 2007-07-31 11:24:25

@e-learning: $_FILE['userfile']['type'] sẽ không phân biệt được trường hợp file .php bị đổi thành file .gif rồi upload lên, nên dùng cái này không đảm bảo lắm

Tra loi

e-learning 2007-07-31 11:28:57

Kiểm tra kiểu MIME mà TG

Tra loi

Quan Tran Anh 2007-07-31 01:44:58

$_FILE['userfile']['type']: Dùng cái này là đúng rồi, vì nó trả về MIME type mà, sẽ có dạng : "image/jpeg", "image/pjpeg", "image/gif", "image/png", "application/msword" , "application/pdf"... dựa vào đó kiểm tra sẽ chính xác hơn... :)

Tra loi

BinhPham 2007-07-31 03:04:23

[php]
$fileInfo = $_FILES['upload'];
$allowMime = array('image/jpeg', 'image/gif');

/**
* Check mime type
*/
if(!in_array($fileInfo['type'], $allowMime)){
    die('Tập tin này không được chấp nhận');
}

// upload code here
[/php]

đây là check mime type

Tra loi

toiyeuphp 2007-07-31 03:06:47

MIME type hay gì cũng vô ích. Cách tốt nhất là dùng Apache 2.x, kô cho thực thi trong thư mục lưu file

Tra loi

TG 2007-07-31 03:20:24

@e-learning: đúng là cái này là MIME type, tuy nhiên nếu file .php mà được đổi kiểu thành .gif thì nó cũng sẽ hiểu là image/gif luôn :(, theo TG thì có vài cách sau:
- dùng htaccess
- cho upload len trước sau đó dùng filetype (đọc các thảo luận trong bài này)
- không cho người dùng link đường dẫn đến file image, mà dùng 1 file .php để hiển thị hình ảnh, nghĩa là hinh ảnh khi hiển thị sẽ có dạng: image.php?id=<id> như vậy thì mình sẽ control được các file upload lên.
- tạo file .zip, nghĩa là sẽ zip mọi tập tin được upload (và chỉ cho download)

Tra loi

e-learning 2007-07-31 03:55:25

@TG: không biết TG gặp trường hợp này khi nào? Mình đã test code của mình nhưng không thấy bug này :( Cũng đổi đuôi php thành gif đó

Tra loi

TG 2007-07-31 05:19:01


TG thư trong trường hợp đơn giản nhất ấy chứ:
<?php
if($_POST) {
print_r($_FILES);exit();
}
?>
<form id="form1" name="form1" enctype="multipart/form-data" method="post" action="">
<input type="file" name="fileField" id="fileField" />
</form>


sau đó đổi 1 file .php nào đó thành .gif, submit nó cũng ra kết quả MIME type là image/gif :(

Tra loi

ahpdesigner@yahoo.com 2007-10-18 12:03:47

hix !
Mình đã test thử cái này với Class.php
việc dùng MimeType mình nghĩ là okie
Ko hiểu TG test kiểu gì chứ mình test thì hoàn toàn
"Kiểu file ko chop phep";

Tra loi

cb_dethuong 2007-11-16 01:17:26

Theo mình thì các bạn cứ kiểm tra kiểu MIME (bằng [file][type] cũng được là tốt nhất
Việc còn lạo thì phó thác cho quản trị server thôi
Vì nếu config đúng thì cho dù đổi đuôi cũng ko dùng được gì
http://mýite.com/phpinfo.gif
Sẽ xẽ xuất hiện
The image “http://mysite.com/phpinfo.gif” cannot be displayed, because it contains errors.

Cho dù trong khi upload ta có đổi thành phpinfo.php#hdfhd.gif thì nó vẫn bị đổi thành file gif
Còn 1 việc nữa khá đơn giản là bạn đổi tên file sau khi upload, như thế là an toàn

Tra loi

minhbu 2007-11-18 08:57:00

thế bạn sao ko chụi đổi tên sau khi người dùng đưa tập tin lên trang của bạn tên khó đoán đó

Tra loi

Quan Tran Anh 2007-11-19 09:20:50

Như này. Nó tạo 1 file ảnh (.jpg,.gif,.png...) trong đó có nội dung ảnh(tức là lúc view = 1 trình đọc ảnh bất kì đều xem được ảnh), nhưng ngoài ra , còn có cả mã shell nữa.
Do đó, kiểm tra đuôi file, MIME type đều ko ăn thua.
Nhưng đoạn mã đấy chỉ thực hiện được trên server linux thì phải (nếu tớ ko nhầm), vì check với windows thấy ko ăn thua. Do đó, bạn chỉ cần chmod hợp lý thư mục chứa file upload là được (làm ơn, search google về vấn đề phân quyền thư mục trên linux đi).
Dạo gần đây chuyển qua xài Linux, thấy thích quá. Các bạn cũng chuyển qua Linux đê

Tra loi

babyblue 2007-12-08 02:50:32

Cho dù bạn có kiểm tra header đi nữa thì vẫn vô dụng, lỗi này gọi là remote include file(đối với file truyền từ host bên ngoài) hay trong include file(bạn có thể xem trên milw0rm có rất nhiều video hack về lỗi này), shell đính trong hình chỉ thực thi được khi có lệnh như require('image.png'), include('image.png') chẳng hạn , ngay cả file .txt cũng như vậy.
Cách tốt nhất là bạn tránh include file qua biến lấy qua $_POST hoặc $_GET. Mình đã gặp rất nhiều trang dính cái này, nhất là ở  những trang dùng multi templates hoặc multi languages.
Vì thực chất khi chạy file ảnh hoặc .txt đơn thuần thì mã PHP không thực thi được.

Tra loi

babyblue 2007-12-08 02:54:17

thế bạn sao ko chụi đổi tên sau khi người dùng đưa tập tin lên trang của bạn tên khó đoán đó
Bạn minhbu nói vậy là sai rồi, mình hỏi bạn khi bạn upload hình lên thì bạn có phải hiển thị nó không? hay up lên rồi cũng không biết nó nằm đâu.
Việc đổi tên file không khó, chỉ là để tránh trùng tên gây nên việc chéo đè file mới lên file cũ thôi.
ví dụ đổi tên như thế này có khó đoán không
$name=md5(time()*1984);
Nhưng có ai đi đoánc ái này bao giờ, nó sờ sờ ra trước mắt đoán làm gì :D

Tra loi

babyblue 2007-12-08 02:58:28

Theo mình thì các bạn cứ kiểm tra kiểu MIME (bằng [file][type] cũng được là tốt nhất
Việc còn lạo thì phó thác cho quản trị server thôi
Vì nếu config đúng thì cho dù đổi đuôi cũng ko dùng được gì
http://mýite.com/phpinfo.gif
Sẽ xẽ xuất hiện
The image “http://mysite.com/phpinfo.gif” cannot be displayed, because it contains errors.


Cho dù trong khi upload ta có đổi thành phpinfo.php#hdfhd.gif thì nó vẫn bị đổi thành file gif
Còn 1 việc nữa khá đơn giản là bạn đổi tên file sau khi upload, như thế là an toàn

Nếu thêm cái này trước
header('Content-Type: image/jpeg');
phpinfo();
thì sao bạn, thậm chí view ảnh vẫn thấy hình bình thường, hacker có thể dễ dàng tạo ra một file ảnh bằng mã PHP mà, mà cứ gì hacker các bạn vẫn làm tốt đó thôi

Tra loi

~Fyodor 2007-12-28 04:17:52

Theo mình việc kiểm tra MIME Type vẫn chưa hoàn toàn ổn, vẫn có thể chèn mã PHP vào 1 file ảnh. Mình vừa test thử , chạy đc c99 bằng 1 file có MIME type là image/gif

Tra loi

cocbay 2007-12-28 08:33:17

Chỉ tui cách chèn 1 đoạn code php vào file ảnh...?

Tra loi

bosspro 2008-01-05 10:15:42

mình chơi 1 cách đơn giản là tạo ký tự ngẩu ngiên rồi đổi tên nó thành dãy ký tự đó là nhanh nhất!

Tra loi

MusicRum 2008-01-28 02:16:48

Dùng file .htaccess, nội dung bên trong như sau:

Options -execCGI

Tra loi

mime_content_type (string $filename ) 2009-11-18 10:56:49


mime_content_type (string $filename ) hàm này tìm được trong php.net sao mình xài ko dc nhỉ? echo chẳng thấy gì cả. Trong khi examples của họ là:
<?php
echo mime_content_type('php.gif') . "\n";
echo
mime_content_type('test.php');
?>
output:
image/gif
text/plain
Vậy là do server (localhost) của mình thiếu gì ah?

Tra loi

kenphan.info 2009-11-18 11:44:59

đọc kỷ trong manual
Returns the content type in MIME format, like text/plain or application/octet-stream.

Tra loi

123456 2009-11-19 11:14:41

@kenphan.info: nói vậy thì nói làm gì. đọc hiểu được manual thì cần gì vào phpbs

Tra loi

choncon 2009-11-19 12:05:49

dow  load mot cai source phpbb3.x ve ma hoc hoi , team developer ho code cai bao mat nay chuan khong can chinh :)

Tra loi

Y kien