일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 백준
- 정렬
- C
- 수학
- xcz.kr
- Incognito
- Web
- misc
- 써니나타스
- 문자열
- Python
- N0Named
- Digital Forensics
- cryptography
- CTF
- MySQL
- 사칙연산
- writeup
- Web Hacking
- HackCTF
- 그리디 알고리즘
- Forensics
- SuNiNaTas
- 구현
- Network
- Database
- Text
- 인코그니토
- wargame
- php
- Today
- Total
보안을 그리다, 훈이
[Web Hacking] HackCTF Guess me(100p) Write Up 본문
HackCTF Web 분야 Guess me(100p) 문제 풀이입니다.
주어진 URL로 접속해보자.
비밀 코드를 맞추면 플래그를 얻을 수 있다고 한다.
먼저, 소스코드를 살펴보자.
파일 secret.txt의 내용을 변수 $secretcode에 넣어두고, 이 값을 extract($_GET);으로 받아온 값인 변수 $guess와 비교하여 동일한 값이라면 플래그를 출력하는 구조이다.
본 문제는 PHP extract() 함수의 취약점을 다루고 있다.
extract() 함수를 통해 $_GET 또는 $_POST로 넘어온 인자는 함수 사용 전의 기존 값을 overwrite할 수 있으며,
이를 방지하기 위해서는 변수를 선언하기 이전에 extract() 함수를 사용하여야 하고 overwrite를 방지하기 위해 EXTR_SKIP 옵션을 사용하여야 한다.
[관련 게시글] [Web Hacking] PHP extract() function 취약점
위 코드에서 변수 $filename을 선언한 다음, extract($_GET);를 사용한 것이 취약점 발생의 원인이며, 이러한 경우에는 해당 URL에서 변수 $filename을 직접 초기화 및 우회할 수 있다.
따라서, 아래와 같이 URL을 조작하여 플래그를 출력할 수 있다.
http://ctf.j0n9hyun.xyz:2030/?filename=&guess
http://ctf.j0n9hyun.xyz:2030/?filename=1&guess=
변수 $filename에 해당 웹서버에 존재하지 않는 파일명을 기입하거나 공백으로 둘 경우, 변수 $secretcode에 아무런 값이 들어가지 않을 것이다.
마찬가지로, 변수 $guess에도 아무런 값을 넘겨주지 않으면 $guess === $secretcode가 성립되어 플래그가 출력된다.
Flag : HackCTF{3xtr4c7_0v3rr1d3ds_pr3vi0u5_kn0wn_v4r1abl35}
'Security > Wargame' 카테고리의 다른 글
[Forensics] N0Named Wargame 어제 뭐 했어?(100p) Write Up (0) | 2022.01.26 |
---|---|
[Forensics] N0Named Wargame 누가 진짜일까?(70p) Write Up (0) | 2022.01.26 |
[Forensics] N0Named Wargame 조별과제_배드엔딩(50p) Write Up (0) | 2022.01.18 |
[Forensics] N0Named Wargame 회사 찾기(50p) Write Up (0) | 2022.01.17 |
[Forensics] N0Named Wargame MagicIMAGE(5p) Write Up (0) | 2022.01.16 |