SQL injection - Authentication GBK¶
Estimated time to read: 5 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-GBK
Link challenge này tại http://challenge01.root-me.org/web-serveur/ch42/
Tổng quan¶
Trong challenge này, mục tiêu của ta là lấy được quyền admin (tất nhiên không dùng account admin).
Vấn đề gian nan của challenge này là injection theo GBK (GBK Character Encoding).
Với challenge SQL Injection Authentication ta đã tìm được cách bypass password đơn giản. Nhưng điều đó không khả thi với GBK.
Thông thường người ta dùng hàm addslashes()
1 để bảo vệ SQL Injection.
Hàm này hoạt động như kiểu filter đầu vào như hình bên dưới
Nghĩa là nếu đầu vào ta nhập admin'
thì sẽ biến đổi thành admin\'
. Vậy nên ta có thể dùng GBK mã hóa các kí tự để có thể bypass được password.
Well, phân tích xong rồi, chúng ta đến với kịch bản tấn công nào.
Kịch bản tấn công¶
Bước 1: Kiểm tra website¶
Đầu tiên ta xem xét website và bật Burp Suite quan sát gói tin
Quay trở lại đoạn code giả tưởng của ta ở challenge SQL Injection Authentication
Mục tiêu hiện tại của ta là tiêm payload admin'OR 1=1--
vào username để có thể bypass password và đoạn code trên sẽ thành
Ngay lập tức ta bị filter và bị lỗi nhận dạng như hình bên dưới
Ta phân tích gói tin, rõ ràng ta truyền vào admin'OR 1=1--
nhưng khi bật Burp Suite ta thấy thông tin này được mã hóa (HTML URL Encoding) thành admin%27OR+1%3D1--
và vẫn nhận được lỗi không nhận dạng được username, tức bị filter rùi ::). Ta sẽ tìm cách mã hóa input này để bypass filter.
Chậm lại và suy nghĩ 1
Làm thế nào để biết phía BE họ dùng hàm addslashes()
để filter đầu vào trong việc truy vấn vào hệ quản trị cơ sở dữ liệu?
Giải quyết chậm lại suy nghĩ 1
Để trả lời câu hỏi này, ta có thể test thử truyền một mảng username như hình bên dưới
Hoặc còn nhiều cách khác, bạn đọc tìm hiểu thử xem!
Bước 2: Tạo payload¶
Như đã phân tích ở trên, ta nhìn lại 1 vài HTML URL Encoding bên dưới
Character | From Windows-1252 | From UTF-8 |
---|---|---|
' | %27 | %27 |
= | %3D | %3D |
\ | %5C | %5C |
Rồi, payload của ta là admin%27OR+1%3D1--
thì %27 là ngay dấu '
thì ngay lập tức sẽ bị filter và biến đổi thành %5C%27
và dẫn đến việc khiến chúng ta không thực hiện được attack. Nhiệm vụ của ta là phải tìm payload để khi chèn vào và khi payload tự thêm %5C
thì sẽ được kết hợp với thứ mình chèn, làm tách chuỗi %5C%27
thành ...%5C
và %27
.
Well, áp dụng GBK mà triển thôi, chọn đại 2 bytes đầu là %DF thì sẽ kết hợp với %5c thành %DF%5C và là 1 kí tự Trung Quốc.
Và payload hoàn chỉnh của ta có thể là 1%df%27OR+1%3D1--%20
Và khi tiêm thành công payload, ta sẽ thấy được Follow redirection
và ta click vào chuyển hướng, ta được flag.
Flag
iMDaFlag1337!
Chậm lại và suy nghĩ 2
Tại sao payload ở phía trên phía sau cùng là %20, và tại sao số đầu là 1 chứ không phải admin
như input mẫu ban đầu?
Giải quyết chậm lại suy nghĩ 2
Contact me :>
Qua bài SQL Injection Authentication trên, ta để ý rằng trong payload ta tiêm tồn tại điều kiện "OR" và bản chất ở đây là tiêm payload với hoặc username đúng hoặc mệnh đề sau đúng (hiển nhiên mệnh đề sau luôn đúng, vì ta tiêm 1=1 mà :>). Tóm lại đây là loại tấn công Tautologies.
-
Xem document của hàm tại: https://www.php.net/manual/en/function.addslashes.php ↩