Thực hành SQL injection trên localhost
Mọi người Download file này về và chạy trên localhost (nếu sợ có mã độc thì có thể xem mã nguôn trước).
Hướng dẫn bypass và lấy user+pass của members trong CSDL của trang mắc lỗi:
Để có thể hiểu được nội dung của bài thực hành này. Bạn cần có hiểu biết chút ít về câu lệnh SQL và một đầu óc biết duy luận.
Bạn mở IE (hoặc FF – FireFox) lên gõ vào địa chỉ: http://localhost/login.php?install=1 để cài đặt CSDL.
Ở ô Server: Localhost (Server mà bạn dùng)
Ở ô Username: username của mysql mà bạn dùng (thường là root)
ở ô Password: mật khẩu truy cập vào CSDL (thường để trống)
Nhấn Install
Nếu hiện ra dòng:
thì tức là quá trình cài đặt thành công.
Chúng ta bắt đầu hack thôi… ![]()
Bây giờ chúng ta chưa có username và password của các thành viên chứa trong CSDL mà muốn bypass (không cần username và pass mà vẫn login hợp lệ). OKies gõ đại vô đó 1 user và 1 pass. Tất nhiên dòng thông báo đăng nhập thất bại sẽ hiện ra
và dòng phía dưới là dòng lệnh truy vấn SQL mà trong lúc Code mình viết vào cho các bạn dễ hình dung thôi chứ các forum hay web thật không bao giờ hiển thị các thông tin “nhạy cảm” đó.
Giả sử tôi mình đánh user ở đây là: hacker và pass cũng là hacker. Login thử ooop.
Bạn có thể thấy rõ dòng query là:
chứng tỏ trong CSDL không hề có user là hacker với pass: hacker
Nhưng chúng ta là hacker (tất nhiên không phải theo nghĩa gốc của nó
) thì đó không phải là vấn đề, chúng ta sẽ lấy hết user và pass trên trang này vì nó đã bị lỗi, chúng ta biết điều đó, oki, đánh user (hoặc pass) là:
nhấn login ooooops.
vậy là trang này đinh SQL INJECTION, chúng ta bắt đầu khai thác:
đánh vào user:
pass có thể để trống hoặc bât cứ cái gì. Nhấn login và:
kekekeke ===> chúng ta đã bypass được ![]()
nếu đây là 1 forum thực sự thì bạn đã đăng nhập được dưới danh nghĩa là 1 user bất kỳ mà rất có thể là admin luôn vì admin thường nằm ở dòng đầu trong bảng CSDL.
dòng
là dòng kinh điển để kiểm tra xem trang đó có thể bypass được không.
Các bạn có thể thấy dòng query:
sẽ lựa chọn mọi thứ từ CSDL. Vì sao?
. mình sẽ “dịch thử” ngôn ngữ SQL này qua ngôn ngữ tiếng việt:
tiếp theo là một dấu thăng nghĩa là mọi thứ đằng sau đều được coi là chú thích và sẽ bị bỏ qua, có thể một số trường hợp dâu # được thay bằng hai dấu gạch ngang (–) nhưng cái đó chúng ta không quan tâm, điều mấu chốt ở đây là vì sao chúng ta có thể bypass?
Như dòng trên mình đã “dịch” sang tiếng việt, dòng truy vấn sẽ lựa chọn mọi dòng mà có User=’anything’ hoặc 1=1. 1=1 là điều đương nhiên cái này ai cũng biết, còn username có thể là bất cứ username nào có trong CSDL nhưng dù username là gì đây nữa thì mệnh đề
luôn trả về giá trị đúng, cái này chắc khi vào học lập trình các bạn cũng biết mệnh đề OR sẽ đúng khi 1 trong 2 vế là đúng, ở đây 1=1 là vế đúng nên dù username có tồn tại trong bảng hay không thì mệnh đề luôn trả về giá trị đúng như vậy câu lệnh trên sẽ trả về 1 hoặc nhiều dòng trong bảng và thường thì coder sẽ dựa vào dòng đầu tiên để lấy thông tin khi login vào được.
Như vậy, (tôi hi vọng) các bạn đã hiểu vì sao chúng ta có thể bypass.
Bây giờ chúng ta sẽ lần lượt lấy hết User và pass có trong CSDL.
Vào lại trang login. vì trang này bị SQL Injection nên chúng ta có thể cho chạy bất cứ câu lệnh nào.
bây giờ dùng lệnh union (thực sự vì mới học nên mình vẫn chưa hiểu lắm lệnh này, nhờ các pro chỉ giúp)
nhập vào ô username (hoặc password):
‘admin’ ở đây là tên bảng chứa thông tin của user, trong thực tập thì cái này mình phải đoán thôi vì toàn gặp các trang bị lỗi JET DATABASE, còn nếu CSDL là My SQL thì cái này có thể lấy được (mình sẽ nói sau vì bây giờ khuya rồi).
Login, và gặp lỗi:
lỗi này có nghĩa là tên bảng đúng nhưng không đúng số cột. okies, thêm cột vào cho nó. trở lại trang login và đánh user là:
login
vẫn lỗi trên, vậy tiếp tục thêm cột
login
như vậy câu lệnh union đã hợp lệ (vì chưa hiểu về lệnh này lắm nên không giải thích được vì sao hợp lệ nhưng các bạn cứ tạm chấp nhận là nó hợp lệ, sau này tìm hiếu sau)
lỗi báo là bạn là: 2. như vậy bạn thay số 2 bằng username (username là tên của 1 cột chứa username ngừoi dùng trong bảng ở CSDL cái này ở JET Database cũng phải đoán thôi còn mysql thì có thể lấy được bằng lệnh mà mình sẽ nói ở bài sau)
login
vậy username của anh số 1 là: nguyenbinh07, bắt đầu lấy pass:
thay username bằng password trong ô username ta có:
(password trong dòng trên là cột lưu pass của các thành viên)
ấn login
trang này không mã hóa mật khẩu (may quá) vậy pass của nguyenbinho7 là admin.
tiếp bạn sẽ lấy hết user và pass
login vào
vậy user tiếp theo là: admin
trở lại trang login (back)
gõ vào ô username (hoặc pass)
nhấn login
vậy pass là: a4d1min
cứ tăng số id và thay đổi cột username bằng password, bạn lần lượt lấy hết username và password của các thành viên và tất nhiên cả admin nữa, bây giờ bạn có thể đăng nhập vào trang này bằng bất cứ tài khoản nào mà bạn vừa lấy được (trong CSDL mình tạo 3 tài khoản).
anh ơi sao cái dòng anything’ or 1=1# em gõ nó báo thất bài