Mask
VIP Members
-
03/07/2013
-
33
-
25 bài viết
Web5: SQL injection - Một số kỹ thuật vượt qua cơ chế lọc
Web5: SQL injection - Một số kỹ thuật vượt qua cơ chế lọc
Các chuyên đề nhỏ cùng chủ đề:
Web1: SQL injection - Con đường khai thác phổ biến : qua “user input”
Web2: SQL injection - Các con đường khai thác khác
Web3: SQL injection - Kỹ thuật khai thác: Các hướng khai thác
Web4: SQL injection - Kỹ thuật khai thác: Các bước khai thác
Web5: SQL injection - Kỹ thuật khai thác: Một số kỹ thuật vượt qua cơ chế lọc
Web6: SQL injection - Một số tools khai thác
Web7: SQL injection - Các cách phòng chống & Kết luận.
============================================
1. Cắt bớt nội dung câu truy vấn
Trong trường hợp muốn lờ đi những đoạn script trong câu truy vấn. Ví dụ đối với đoạn xử lý dưới đây, trong câu truy vấn đòi hỏi điều kiện active=1 nhưng chúng ta có thể comment (--, -- -, -+, #, /*, /**/, //, ;%00…) và lờ nó đi. Khi khai thác chúng ta thường không biết nội dung còn lại của câu truy vấn làm công việc gì nên sử dụng comment trong trường hợp này rất hiệu quả.
a. Inline Comment
Inline comment được sử dụng rất hiệu quả trong việc bypass lọc các khoảng trắng. Có thể sử dụng các kí tự sau để bypass lọc khoảng trắng: /**/, %20, %09, %0a, %0b, %0c, %0d, %a0). Ví dụ:
Khi khai thác SQL injection chúng ta thường sử dụng những từ khóa như: union, select, information_schema... Nhiều trường hợp người lập trình chỉ đơn giản là thay thế những từ khóa đó đi:
Lúc này thay vì sử dụng từ khóa:
HTML:
select, union…
HTML:
SeLEcT, UniOn…
Trong một số trường hợp, ứng dụng web sẽ lọc bỏ toàn bộ hay một phần từ khóa nào đó (union, select…). Ta sẽ bypass như sau:
HTML:
id=1+uniunionon+SeLselectecT+1,2,3-- -
HTML:
id=1+union+SeLecT+1,2,3-- -
c. Character encoding
Chúng ta có thể bypass khi WAF (Web Application Firewall) chặn các từ khóa bằng cách encode chúng. Rất nhiều ứng dụng WAF sẽ chỉ decode truy vấn một lần và lọc bỏ các từ khóa trong blacklist, khi đó chúng ta hãy encode 2 lần request như vậy có thể bypass được trong trường hợp này.
- Chúng ta hãy xét một ví dụ trước khi tìm hiểu cụ thể cách bypass này.
Những lập trình viên php đều đã rất quen thuộc với hàm addslashes(). Hàm addslashes() có tác dụng thêm vào trước những ký tự đặc biệt như nháy đơn ('), nháy kép ("), backslash (\), NUL (null byte) ký tự "\" giúp hệ quản trị cơ sở dữ liệu không gặp khó khăn và nhầm lẫn khi xử lý chuỗi chứa các ký tự đó. Như vậy, khi chúng ta muốn inject vào câu truy vấn theo như kịch bản: name='someName' or '1'='1'-- thì kết quả không còn đúng như chúng ta mong đợi nữa.
Tuy vậy, đã có kỹ thuật giúp bypass hàm addslashes() để inject ký tự nháy đơn ('). Kỹ thuật này đã được public từ khá lâu, và để thực hiện kỹ thuật này cũng khá khó khăn vì nó bị ràng buộc với kiểu mã hóa áp dụng cho website. Các bạn có thể tìm hiểu thêm về kỹ thuật này qua một số bài viết sau:
http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string
4. Bypass lỗi "illegal mix of collation for operation UNION"
Trong một số hệ quản trị (thường thấy trong MySql), các database, các table khi đã được set collation thì khi sử dụng từ khóa UNION sẽ bị báo lỗi "illegal mix of collation for operation UNION". Việc thiết lập collation (đối chiếu font mã hóa) có thể do chủ định của người thiết kế cơ sở dữ liệu hoặc do được thiết lập mặc định của MySql. Trong trường hợp dùng union, chúng ta phải đảm bảo điều kiện giá trị select ở từng trường phải có kiểu mã tương ứng đã được định nghĩa. Theo mình đánh giá, lỗi này là khá phổ biến, đặc biệt đối với các CMS chạy Apache MySql. Mọi người có thể tìm hiểu thêm tại địa chỉ: http://bugs.mysql.com/bug.php?id=57926.
Trong trường hợp này chúng ta có thể sử dụng các cách convert thành kiểu mã hóa phù hợp.
Ví dụ trong trường hợp sau:
Các bạn quan tâm có thể theo dõi chuyên đề tiếp theo - “W6: SQL injection – Một số tool khai thác”
Chỉnh sửa lần cuối bởi người điều hành: