Bạn đọc tham khảo Union và DIOS tại: Here và Here
Không nhất thiết phải inject qua url (search box,...)
Trong các website, có thể có các filter (bộ lọc) và có một số cách
bypass cơ bản:
- Có thể thay thế các khoảng trống (space) bằng các inline comment
(/**/). Ví dụ như UNION SELECT sẽ thay bằng UNION/**/SELECT
- Do SQL không phân biệt chữ hoa thường nên thay vì sử dụng
select và union có thể thay bằng SeLecT và uNiOn, tương tự với các lệnh
khác nhằm bypass một số web chặn command string chúng ta nhập
- Thay vì đưa chuỗi 'text' vào chẳng hạn bạn có thể thay
bằng mã hex 0x277465787427 hoặc thay bằng CHAR(116,101,120,116)
- Nếu web server có sử dụng proxy caching thì bypass bằng
cách thêm một loạt kí tự đặc biệt sau payload, ví dụ payload#abcdef
(proxy caching là cache và cũng gần tương tự như phía client, khác ở chỗ
cache này thiết lập cho phía server, bạn đọc có thể đọc thêm tại
Here)
User Agent là một thông số có trong các packet, có dạng như:
Mozilla/5.0 (compatible; MSIE 11.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Nghe có vẻ lạ nhưng ở một số nơi họ có thể thu thập thông tin UA để phân tích đánh giá lưu lượng truy cập chẳng hạn. Do đó chúng ta có thể lợi dụng điều này
Ví dụ, chúng ta có 1 page visit.php như sau:
<?php $link = new mysqli('localhost', 'root', 'root', 'analytics'); $query = sprintf("INSERT INTO visits (ua, dt) VALUES ('%s', '%s')", $_SERVER["HTTP_USER_AGENT"], date("Y-m-d h:i:s")); $link->query($query); ?>
Do website chỉ thu thập dữ liệu chứ không hiển thị gì từ database nên chúng ta có thể dùng phương pháp Error Based Injection hoặc Blind SQL Injection. Ví dụ mình sử dụng Blind SQL Injection trong trường hợp xấu hơn:
Cookie cũng có thể tiềm ẩn những nguy cơ SQLi, lí do là vì có thể website muốn lưu lại thông tin gì đó vào database, hoặc trong cookie có chứa thông tin, command về query SQL. Bạn đọc có thể tham khảo 1 case dưới đây, đã bao gồm chi tiết các bước khai thác: Here
Đối với các form upload XML file, thường thì đầu tiên chúng ta sẽ cố gắng khai thác theo hướng như XXE chẳng hạn. Tuy nhiên, nó cũng có thể tiềm ẩn lỗ hổng SQLi nếu server có lưu trữ thông tin hoặc có liên hệ với file XML này. Với case này, bạn đọc có thể xem qua 1 vụ bug bounty với reward 4000$ trong hệ thống Starbucks tại: Here
Thông thường, chúng ta thường bypass và inject ở dạng:
worldend.com/store.php?id=1') blah blah
Tuy nhiên đối với phương pháp này, bypass sẽ có dạng:
worldend.com/store.php?id[inject_here][]...=foo
Dấu 3 chấm ở đây có nghĩa có thể inject số lượng chiều tuỳ ý cho mảng. Để hiểu thêm, các bạn đọc 2 cases tại: Here và Here
Mình sẽ giải thich sơ lược lối khai thác trong case thứ 2 ở hackerone. URL được craft có dạng:
worldend.com/profile/deleteInvitation?invitationID[1%3dbenchmark(40000000,sha(1))+and+1]=balisong
Khi đó, website sẽ gán key của mảng vào $subField và giá trị tương ứng vào $subValue. Sau đấy 2 biến này sẽ được đưa vào query SQL sau khi đi qua một số function. Cuối cùng query SQL sẽ có dạng:
delete from GDN_Invitation where 1=benchmark(40000000,sha(1)) and 1 = 'balisong'
Hàm benchmark(count,expr) sẽ thực thi count lần expr. Mục đích của hàm này là để test tốc độ xử lí của database, tuy nhiên ta có thể sử dụng nó như một cách để Blind SQL Injection
Một số tools phổ biến với đa dạng phương thức tấn công cũng như nhiều lựa chọn để craft query như: SQLMap, BBQSQL (Blind SQLi), NoSQLMap,...
Bên cạnh các tool tự động, với phương pháp truyền thống chúng ta có extension giúp tiết kiệm thời gian như HackBar. Lợi ích khi sử dụng extension này là có thể thêm các kí tự vào URL mà không bị HTML encode/decode cũng như reload trang không cần khởi động lại HackBar,...
- Không bao giờ được tin tưởng những input người dùng nhập vào: Dữ
liệu luôn phải được xác thực trước khi sử dụng trong các câu lệnh SQL
thông qua các filter
- Các thủ tục được lưu trữ (Stored
Procedure): Những thủ tục này có thể trừu tượng hóa các lệnh SQL và xem
xét toàn bộ input như các tham số. Nhờ đó, nó không thể gây ảnh hưởng
đến cú pháp lệnh SQL (không sử dụng các câu lệnh SQL trực tiếp). Đối với
ASP.NET, có cách ngăn chặn đơn giản là sử dụng các Parameters khi làm
việc với object SqlCommand (hoặc OleDbCommand), khi truyền data vào
Parameters sẽ tự động validate kiểu dữ liệu
- Thông báo lỗi
hợp lý: Thông báo lỗi phải tuyệt đối tránh tiết lộ những thông tin/chi
tiết nhạy cảm và vị trí xảy ra lỗi trên thông báo lỗi
- Giới
hạn quyền truy cập của người dùng đối với cơ sở dữ liệu
-
Xóa các stored procedure trong database master mà không dùng như:
xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask
-
Thay đổi "Startup and run SQL Server" dùng mức low privilege user trong
tab SQL Server Security