Misc
Medium
100 points
rusty-web
Recuite 2025 - HCMUS
6 tháng 10, 2025

Misc
Rusty Web
Tổng Quan
Challenge này là một ứng dụng HTTP server đơn giản được viết bằng ngôn ngữ Rust, phục vụ các file tĩnh từ thư mục public. Tuy nhiên, do thiếu sót trong việc xử lý đường dẫn, ứng dụng này chứa lỗ hổng Path Traversal (Directory Traversal) cho phép kẻ tấn công truy cập vào các file nằm ngoài thư mục được phép.
Thông Tin Challenge
- Danh mục: Web Security
- Độ khó: Dễ
- Điểm: 100
- Lỗ hổng: Path Traversal (Directory Traversal)
- Kỹ năng: Rust, HTTP Server, File System Security, Path Manipulation
Phân Tích Lỗ Hổng
Source Code
Đây là đoạn code Rust có lỗ hổng:
use std::fs;
use std::path::{Path, PathBuf};
use warp::Filter;
#[tokio::main]
async fn main() {
let public = warp::path("public").and(warp::fs::dir("./public"));
let routes = public.or(warp::any().and_then(serve_file));
warp::serve(routes)
.run(([127, 0, 0, 1], 3030))
.await;
}
async fn serve_file(path: warp::path::Tail) -> Result<impl warp::Reply, warp::Rejection> {
let mut file_path = PathBuf::from("./public");
file_path.push(path.as_str()); // ⚠️ Vấn đề ở đây!
let contents = fs::read_to_string(file_path).unwrap();
Ok(warp::reply::html(contents))
}
Vấn Đề
- Không validate đường dẫn: Input từ URL được sử dụng trực tiếp mà không kiểm tra
- PathBuf::push() không ngăn được
../: Hàm push() chỉ nối chuỗi, không xử lý các ký tự đặc biệt - Không canonicalize đường dẫn: Không chuyển đổi đường dẫn về dạng chuẩn
- Không kiểm tra boundary: Không đảm bảo file nằm trong thư mục cho phép
Nguy Cơ
Kẻ tấn công có thể:
- Đọc các file nhạy cảm (flag, file cấu hình, source code)
- Truy cập vào các thư mục hệ thống (/etc/passwd, /proc/version)
- Lấy thông tin về server và ứng dụng
- Trong trường hợp nghiêm trọng hơn, có thể ghi file vào hệ thống
Khai Thác
Cách Hoạt Động
Path Traversal hoạt động bằng cách sử dụng các ký tự đặc biệt để "leo thang" thư mục:
| Ký tự | Ý nghĩa | Ví dụ |
|---|---|---|
../ | Lên thư mục cha | ../../../etc/passwd |
./ | Thư mục hiện tại | ./file.txt |
/ | Root directory | /etc/passwd |
// | Directory separator | //etc//passwd |
Lấy flag
curl --path-as-is 'http://HOST/../../flag.txt'
Bài Học Rút Ra
Cho Developers
-
Luôn validate input đường dẫn
- Kiểm tra các ký tự đặc biệt:
../,..\\,// - Từ chối các ký tự nguy hiểm ngay từ đầu
- Kiểm tra các ký tự đặc biệt:
-
Sử dụng canonicalization
- Chuyển đường dẫn về dạng chuẩn trước khi xử lý
- So sánh với đường dẫn gốc để đảm bảo nằm trong boundary
-
Implement proper boundary checks
- Đảm bảo file luôn nằm trong thư mục được phép
- Sử dụng
Path::strip_prefix()để kiểm tra
-
Sử dụng secure APIs
- Rust có nhiều thư viện an toàn hơn cho file serving
- Cân nhắc sử dụng
std::fs::canonicalize()trước khi đọc file
-
Principle of least privilege
- Chạy ứng dụng với quyền tối thiểu
- Không cho phép đọc file hệ thống không cần thiết
100
Points
Medium
Difficulty
Misc
Category