Đây là Writeup cho WebGoat - một trong những challenge mình chọn cho mùa hè 2025

A1 - Broken Access Control

Hijack Session

Challenge xoay quanh nhân tố là hijack_cookie. Mục tiêu của chúng ta là phân tích format của hijack_cookie và tìm cách login vào account của một user khác.

Giao diện challenge

Thử gửi một POST request đăng nhập như trong ảnh, ta thu được cookie 8978894399465949343-1750751209589
Reponse trả về

Nguyên nhân

Với source code tạo cookie như sau:

1
2
3
4
5
6
7
8
9
10
11
12
public class HijackSessionAuthenticationProvider implements AuthenticationProvider<Authentication> {

private Queue<String> sessions = new LinkedList<>();
private static long id = new Random().nextLong() & Long.MAX_VALUE;
protected static final int MAX_SESSIONS = 50;

private static final DoublePredicate PROBABILITY_DOUBLE_PREDICATE = pr -> pr < 0.75;
private static final Supplier<String> GENERATE_SESSION_ID =
() -> ++id + "-" + Instant.now().toEpochMilli();
public static final Supplier<Authentication> AUTHENTICATION_SUPPLIER =
() -> Authentication.builder().id(GENERATE_SESSION_ID.get()).build();

Ta nhận thấy cookie được hình thành theo công thức:

  1. Tạo base id
  2. Với mỗi một user, tăng 1 đơn vị so với id trước đó
  3. Ghép với thời gian lấy từ Instance.now() theo format id - time

Vậy ta thử gửi request liên tục, nếu để ý phần id của cookie tăng lên hơn 1 đơn vị thì đơn vị nằm giữa đó sẽ là id của người khác -> Mục tiêu cần tấn công

POC

Áp dụng ý tưởng đó, chúng ta lấy được 2 cookie với id lệch nhau hơn 1 đơn vị là:

1
2
8978894399465949341-1750751202550
8978894399465949343-1750751209589

Để ý phần đuôi của id tăng từ 41 lên 43, vậy ID 42 sẽ là ID cần tấn công! Lúc này, chúng ta chỉ cần brute-force khung thời gian từ 2550-9589 (khoảng thời gian chênh lệch) là được.

Setup payload brute-force

Ta thành công khai thác toàn bộ cookie của ID 42

Hijack Session thành công

Cách khắc phục

  • Gia tăng độ phức tạp & ngẫu nhiên trong quá trình tạo session.