Chương 2 SQL Injection và các cách tấn công phổ biến
2.2. Các phương pháp tấn công phổ biến
2.2.5. Một số phương pháp qua mặt bộ lọc của tường lửa Web
Các phương pháp được đề cập chia làm hai nhóm:
o Qua mặt các phương pháp chuẩn hóa (normalization)
o Một số phương pháp khai thác điểm yếu web mới (HTTP Parameter Pollution, HTTP Parameter Fragmentation, null-byte replacement,..)
a. Qua mặt các phương pháp chuẩn hóa
Khai thác điểm yếu trong các thao tác chuẩn hóa các đối tượng request của ứng dụng WAF. Chúng ta xét ứng dụng WAF cụ thể, ví dụ ModSecurity(v2.5). Trong ứng dụng này đã triển khai các luật trong gói core rules đi kèm được lấy từ trang chủ của ứng dụng (www.modsecurity.org).
SQL Injection – Tấn cơng và cách phịng tránh
46
Hình 2.20 – from sử dụng GET
Các luật lọc được trang bị trên ModSecurity gồm có các luật được chứa trong các file sau:
Hình 2.21 – các file cấu hình modsecurity – core rule
File có tên custom_rule.conf chính là file được sử dụng để chúng ta tự định nghĩa các luật minh họa. Nội dung trong đó gồm có các luật sau:
SecRule ARGS|REQUEST_HEADERS|REQUEST_URI “@pm select update insert alter drop union” “deny,status:400,t:lowercase”
Luật trên sẽ chặn các request có chứa các từ khóa select, update, insert, alter, drop, union trong giá trị các tham số, trên URL hoặc trong giá trị các trường header của thông điệp (trường hợp này là GET).
Trường hợp các tham số đầu vào từ người dùng là hợp lệ (chú ý tới giá trị tham số và URL):
Hình 2.22 – tham số hợp lệ
Như đã trình bày về luật lọc ở trên, ứng dụng WAF của chúng ta sẽ chặn URL có dạng ?level=select&name=insert&….
SQL Injection – Tấn cơng và cách phịng tránh
48
Phương pháp qua mặt phương pháp chuẩn hóa của WAF đó là sử dụng các dấu comment khối /**/ để tách các từ khóa dễ gây chú ý như SELECT, INSERT, UNION, …
Hình 2.23 – sử dụng comment khối qua mặt ModSecurity
Như vậy, chúng ta đã thành công bước đầu khi vượt qua được WAF. Tuy nhiên, ModSecurity cung cấp một action có tên replaceComments, cho phép xóa các chuỗi comment /**/ và ngay cả /* mà khơng cần có */ trong request, ngồi ra là một số các hàm biến đổi khác như removeWhitespace, removeNull,... Chúng ta cải tiến luật lọc ban đầu như sau:
SecRule ARGS|REQUEST_HEADERS|REQUEST_URI “@pm select update insert alter drop union”
“deny,status:400,t:lowercase,t:replaceComments,t:removeWhite space,t:removeNulls”
Lúc này, request sẽ được thao tác cắt bỏ các cụm comment, các dấu cách thừa, các ký tự NULL (%00). Lúc này, các URL dạng như:
?level=se/**/lect&name=drop+table+users&gender=m%00&ag e=1+or+1=1/*
Hình 2.24 – tham số đầu vào bị lọc bởi ModSecurity
Cách thức sử dụng các chuỗi ký tự đặc biệt để cắt nhỏ các từ khóa nhằm hợp lệ hóa chúng xuất phát từ lý do một số WAF thực hiện xóa bỏ các cụm ký tự đó khỏi request. Điều cần lưu ý ở ModSecurity đó là module này không thao tác trực tiếp với request mà thực hiện thao tác trên một bản sao của nó. Do đó, tuy người dùng có thể sử dụng các chuỗi ký tự đặc biệt bất kỳ để cắt nhỏ từ khóa nhằm vượt qua WAF, ví dụ, ModSecurity sẽ khơng lọc được một request có URL như sau:
?level=opt1&name=dr#op+table+users&gender=m&age=32
Nhưng khi giá trị tham số name được chuyển tới ứng dụng web thì ở dạng “dr#op table users” nó cũng khơng thể gây hại được.
b. Sử dụng phương pháp HTTP Parameter Pollution
Mơ hình qua mặt ứng dụng WAF theo kiểu đầu độc tham số HTTP (HTTP Parameter Pollution - HPP) là cách gọi chung của một nhóm các phương pháp thao tác với tham số trong query string sao cho về mặt hình thức nó vẫn hợp lệ với các luật của ứng dụng WAF nhưng khi được chuyển cho ứng dụng Web các tham số này lại có khả năng gây hại.
Cách thức thứ nhất đó là sử dụng URL encode, hoặc một số phương pháp tương tự để thay đổi giá trị tham số, ví dụ ta có đoạn mã xử lý tham số đầu vào như sau:
$sql = “UPDATE tbl_employees SET salary = (salary - 1000) WHERE employee_id = ” + $_GET[‘id’];
Khi đó nếu giá trị tham số id trên URL được sửa thành dạng
SQL Injection – Tấn cơng và cách phịng tránh
50
“employee_id=0231 or 1=1” và rõ ràng đây là một câu lệnh
không phải ai cũng muốn thực thi.
Cách thức thứ hai, tiêu biểu hơn cả, đó là việc sử dụng nhiều lần một tham số với cùng tên, ứng với các giá trị khác nhau. Ví dụ xét query string: ?var1=val1&var1=val2; trường hợp này, ứng với mỗi mơ hình xử lý HTTP khác nhau sẽ có những hệ quả khác nhau. Bảng sau liệt kê một số kết quả trên các môi trường khác nhau:
Mơi trường Kết quả tổng qt Ví dụ kết quả
ASP.NET/IIS Tham số nhận tất cả giá
trị
var1= val1,val2
ASP/IIS Tham số nhận tất cả giá
trị
var1= val1,val2
PHP/Apache Tham số nhận giá trị
cuối cùng
var1 = val2
PHP/Zeus Tham số nhận giá trị
cuối cùng
var1 = val2
JSP,Servlet/Apache Tomcat
Tham số nhận giá trị đầu tiên
var1 = val1
Như vậy, với một truy vấn dạng như sau:
/index.aspx?page=select+1,2,3+from+table+where+id=1
Truy vấn trên có thể bị phát hiện dễ dàng, tuy nhiên truy vấn sau thì khơng:
/index.aspx?page=select+1&page=2,3+from+table+where+id= 1
Truy vấn thứ hai có thể vượt qua các phép lọc tương tự như của ModSecurity chúng ta đã xây dựng ở phần trước, và kết quả trả về của truy vấn thứ hai hồn tồn giống như mục đích của truy vấn thứ nhất.