Beruflich Dokumente
Kultur Dokumente
Net ::
http://xforce.enhack.net/
PHP Underground Security - SQL Injection
http://xforce.enhack.net/viewtopic.php?f=7&t=320
SQL Injection không còn xa lạ với chúng ta trong những năm trở lại đây, thậm chí nó đã
trở nên phổ biến và được rất nhiều người lợi dụng. Thế nhưng SQL Injection là gì ? Tìm lỗi,
lợi dụng, vá lỗi như thế nào thì lại là một vấn đề khác, vấn đề mà tôi sẽ đề cập trong chủ
đề này.
I. SQL Injection là gì ?
Injection nghĩa là tiêm, nhiễm và với SQL Injection ta có thể chèn (tiêm) thêm truy vấn
SQL vào câu truy vấn dựa vào lỗi của ứng dụng web.
Và sau đây là các ứng dụng lợi dụng lỗi SQL Injection:
Ta thấy rằng nếu truy vấn không trả về bảng ghi nào tồn tại trong CSDL thì lập tức người
dùng sẽ được đưa trở về trang index.html, ngược lại sẽ đăng nhập thành công.
Lưu ý: Ở đây tôi dùng "bản ghi" (record) thay cho "kết quả" cho đúng với bản chất.
Code trên tuy đơn giản nhưng ta thấy rằng chỉ cần làm cho truy vấn có bản ghi trả về thì
ta sẽ đăng nhập thành công mà không cần biết Nick hay Pass.
Phần này đòi hỏi người đọc phải biết một tí về câu lệnh Select và điều kiện của mệnh đề
Where, kết quả của phép toán OR.
Nếu ta đăng nhập với nick và pass không khớp với một bản ghi trong CSDL thì tất nhiên
không có bản ghi nào thoả mãn để được trả về.
Vậy với điều kiện là một hằng đúng thì mọi bản ghi đều thoả rồi, vậy nên trong CSDL có
bao nhiêu bản ghi (tương ứng chừng ấy User) sẽ được trả về, và khi đó ...
Ngoài ra ta còn có thể làm ngắn gọn hơn vì chỉ cần nhập
$nick = xyz' OR '1' = '1 #
hoặc
$nick = xyz' OR '1' = '1 --
là được.
Ngoài ra còn có rất nhiều cách để lợi dụng như nâng quyền của mình lên Admin, tìm tên
CSDL và thậm chí DROP Database.
Đối với phương thức GET thì ta cũng sử dụng tương tự bằng cách đưa tham số lên URL.
Xem bài viết viewtopic.php?f=35&t=301
4. Ép kiểu:
- Ta biết id của một đối tượng (user, category, box, product ...) luôn là kiểu số nguyên, vì
vậy ta dùng:
$id = (int)$_POST['id'];
hoặc
$id = (int)$_GET['id'];
hoàn tất