SQL injection - Authentication¶
Estimated time to read: 4 minutes
April 28, 2023
Tài nguyên và link challenge¶
Tài nguyên của challenge này tại https://www.root-me.org/en/Challenges/Web-Server/SQL-injection-authentication
Link challenge này tại http://challenge01.root-me.org/web-serveur/ch9/
Tổng quan¶
Trong challenge này, mục tiêu của ta là lấy được tài khoản và mật khẩu của người quản trị viên (adnin)
Kịch bản tấn công¶
Bước 1: Kiểm tra website¶
Đầu tiên ta xem xét website
Ta thấy website cung cấp cho ta hộp thoại login nhận tham số đầu vào là username và password. Tiếp theo, ta sẽ vào Burp Suite để kiểm tra gói tin request và response như thế nào với account admin/admin
Với hình ảnh trên, ta thấy rằng username và password không được mã hóa khi gửi đi, và đây có lẽ là kiểu sql injection đơn giản nhất.
Lúc này, có vẻ như bên phía server họ code logic theo dạng
Thì với dạng trên, là một điểm chí mạng trong việc truy vấn dữ liệu trong cơ sở dữ liệu. Trên thực tế chả dev nào query dữ liệu raw như thế cả ::)
Rồi, ta phân tích code một xíu. Khung nhập username ta nhập chuỗi S thì ngay lập tức chuỗi S sẽ đưa vào username (trong câu truy vấn) thành username = "S"
. Vậy để bypass được password ta có thể biến đổi truy vấn bằng nhiều cách và đây là một cách của tôi: nhập vào khung username là admin'--
và password là admin
.
Từ input của tôi khi đưa vào câu truy vấn sẽ thành username = 'admin'-- AND password ='admin'
thì lúc này dấu --
thể hiện cho việc command lệnh, nên sẽ không thực hiện query password, và ta có thể login thành công. Đấy là những điều mình nghĩ trong đầu ::)
Bước 2: Tìm kiếm password¶
Ta tiến hành hiện thực bước 1 và thao tác trên Burp Suite như hình sau
Và ta đã nhận được password là t0_W34k!$
, submit challenge thôi
Flag
t0_W34k!$
Chậm lại và suy nghĩ
Tại sao lại nghĩ được cách bypass password bằng việc tiêm payload như trên, liệu còn cách tiêm payload nào khác?
Giải quyết câu hỏi
Ta xem xét đoạn code
Ta có thể tiêm payload kiểu admin'or'1'='1'--
để đoạn code trên biến thành
Để nhận logic hoặc là username = admin đúng hoặc là '1'='1' đúng (hiển nhiên vế này luôn đúng). Nhưng đáng tiếc thay website này filter chuyện đó, và ta xem kết quả khi tiêm payload vào website
Các bạn có thể thấy, nếu làm như thế thì mặc định website sinh ra user1 với password như trong hình (có thể test với các payload khác đều sinh ra cùng 1 user1). Challenge này không đơn giản đúng không?
Challenge tiếp theo sẽ giúp chúng ta vận dụng việc tiêm payload như vầy nhưng ở một diễn biến hoàn toàn khác.