문제 설명
여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.
CSRF 취약점을 이용해 플래그를 획득하세요.
코드 분석
엔드포인트: /vuln

- 이용자가 전달한 param 값을 출력한다.
- 이때 "frame", "script", "on" 키워드는 "*"로 치환한다.
엔드포인트: /memo

- 이용자가 전달한 memo 값을 기록함
- render_template() 함수를 통해 출력됨
엔드 포인트: /admin/notice_flag

- 로컬호스트(127.0.0.1)에서 접근안하면 "Access Denied" 출력
- userid 가 admin 이 아니면 "Access Denied 2" 출력
- 127.0.0.1이고 admin 이면 FLAG 메모장에 출력
엔드 포인트: /flag

GET
- flag.html 렌더링함
POST
- param 값을 가져와 check_csrf의 인자로 넣고 호출함
check_csrf() 함수

- check_csrf()는 인자를 다시 CSRF 취약점이 발생하는 URL의 파라미터로 설정하고, read_url함수를 이용해 방문함
read_url() 함수

- URL
URL은 서버가 동작하고 있는 로콜 호스트의 이용자가 방문하는 시나리오이기 때문에 127.0.0.1의 호스트로 접속하게 됨
취약점 분석
/vuln 기능은 이용자의 입력 값을 페이지에 출력한다.
이때 frame, script, on 키워드는 필터링되지만 필터링 키워드 이외 <,> 나 다른 키워드와 태그는 사용할 수 있기 때문에 CSRF 공격을 수행할 수 있다.

익스플로잇
/vuln 페이지에서 CSRF 공격이 가능하다.
따라서 공격코드가 삽입된 /vuln 페이지를 다른 이용자가 방문할 경우, 의도하지 않은 페이지로 요청을 전송하는 시나리오로 익스플로잇을 구상해야 한다.
플래그를 얻기 위해서는 /admin/notice_flag 페이지로 로컬호스트에서 접근해야 한다.
이를 위해, CSRF 공격으로 /vuln 페이지를 방문하는 로컬호스트 이용자가 /admin/notice_flag 페이지로 요청을 전송하도록 공격 코드를 작성해야 한다.
CSRF 취약점 테스트
<img src="https://bbvxhue.request.dreamhack.games">

img 태그로 CSRF 취약점이 있다는 것을 알 수 있음
로컬호스트에 위치하는 이용자가 /admin/notice_flag 페이지를 방문하도록 해야 하기 때문에 아래와 같이 공격 코드를 작성해야 한다.
이때, userid 파라미터가 admin 인지 검사하는 부분이 존재하기 때문에 해당 문자열을 포함해야 한다.
<img src="/admin/notice_flag?userid=admin" />

'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| simple_sqli (1) | 2026.01.15 |
|---|---|
| csrf-2 (1) | 2026.01.11 |
| session-basic (0) | 2026.01.09 |
| XSS - 2 (0) | 2026.01.01 |
| XSS -1 (0) | 2025.12.31 |