ctf.j0n9hyun.xyz/challenges#%EA%B0%80%EC%9C%84%EB%B0%94%EC%9C%84%EB%B3%B4
문제
가위바위보 그림을 클릭하면 게임이 시작된다.
선택하면 게임이 시작되면서 이겼는지, 비겼는지 그리고 졌는지 결과가 나오는 페이지이다.
그리고 게임하는 페이지만 있는 것이 아니라 이름과 프로필 사진을 변경할 수 있는 페이지도 존재한다.
해당 페이지 이름은 settings.php이다.
풀이
지금 설정되어있는 이름은 kaa으로 설정되어있다.
정상적인 페이지에서 어떻게 문제를 해결할 수 있는가 생각해보았을때, 가장 먼저 소스코드를 확인하는 것이었다.
메인페이지에서는 자바스크립트가 있고 게임을 진행하는 코드가 존재하였다.
큰 힌트를 찾지는 못했다.
다음으로 settings.php 페이지의 소스코드를 살펴보았다.
해당 소스코드에서는 /settings.php라고 링크가 걸려있기 때문에 명령어 cd를 한 번 넣어보았다.
cd를 넣었을때만 나타나는 화면이 아니라 다른 명령어를 입력해도 같은 화면이 나타난다.
또한 이미지의 위치가 ctf.j0n9hyun.xyz:2037/avatars/kaa로 설정되어있는데 실제 케이크 이미지는 해당 위치가 아니며, 파일의 위치 이름이 사용자 이름으로 되어있다.
혹시나 사용자 이름을 php 파일로 한다면 php 파일이 브라우저 상으로 나타날 수 있다고 생각이 들어 php 파일을 만들어보았다.
사용자 이름으로 kaa.php로 이미지 변경이 가능하지만, 파일이 올라가지 않는다.
왜냐하면 이미지 파일이 아니기 때문이다.
이미지 파일임을 증명하기 위해서 php 파일의 파일 시그니처를 PNG 파일로 삽입하기로 하였다.
PNG 파일의 시그니처: P N G(89 50 4E 47 0D 0A 1A 0A)
시그니처를 추가하기 위해 HxD 툴을 사용하여 PNG 파일의 시그니처를 추가하고 파일을 다시 업로드해보았다.
그리고 나서 해당 페이지로 이동해보았다.
여기서 어려움을 겪었다. 어떻게 해야 avatars 경로로 이동하여 그 안에 있는 파일이나 어떤 식으로 동작이 되는 것인지 살펴볼 수 있을까 고민하였다.
해당 kaa.php 파일 안에 cmd라는 변수에 GET방식으로 값을 전달받아서 system 함수를 호출할 수 있도록 하였다.
이때 알게된 지식이 파일 업로드 취약점이었다.
kaa.php 파일을 변경해주고 system 명령어를 사용하여 GET 방식으로 전달하였다.
ctf.j0n9hyun.xyz:2037/avatars/kaa.php?cmd=cd%20../;ls 명령어를 이용하여 avatars 위치에 어떤 파일이 있는지 확인한다.
flag.txt 파일을 cat 명령어를 통해서 열었더니 flag 값이 존재하였다.
알게 된 지식
파일 업로드 취약점
- 파일 업로드 기능을 사용해서 공격자가 원하는 웹 쉘을 해당 서버에 올려서 원하는 행동을 취할 수 있도록 하는 취약점
- 파일 업로드 취약점이 생기는 이유로 게시판에 확장자 php, jsp, asp 등의 확장자를 가진 파일을 업로드하는 것을 서버에서 막지 않는다면 파일 업로드 취약점이 생기며 공격자가 원하는 공격을 시도할 수 있다. 확장자를 막는다고 해도 공격자가 우회기법을 사용하여 파일을 올릴 수만 있다면 공격을 성공한다.
PHP 파일 업로드 취약점
- PHP 소스파일이 서버에 존재하며 웹 브라우저에서 접근이 가능하다.
- 확장자가 무조건 php만 가능하고 위에 두가지 조건을 성립해야한다.
- 우회하는 방법으로는 php 확장자를 .php만 가능한 것이 아니라 다른 확장자도 가능하도록 설정파일에서 설정해주면 다른 확장자도 php파일 역할을 하게 된다.
웹 쉘
- 웹을 통해서 명령어를 입력할 수 있다.
- 가장 기본적인 형태: <?php system($_GET[cmd]) ?>
- cmd 창 사용이 가능해진다.
바인드 쉘: TCP를 이용한 원격 쉘 획득
리버스 쉘: 강제로 서버 쪽에서 포트를 열었을때 방화벽 때문에 안될 경우에는 반대로 공격자(클라이언트)가 포트를 열고 서버에서 클라이언트 방향으로 방화벽을 우회하는 기법이다.
참고
forensic-proof.com/archives/300
'Security > WebHacking' 카테고리의 다른 글
[웹취약점] 포맷스트링(Format String) 기본지식 및 공격방법 (454) | 2023.01.04 |
---|---|
[WebGoat] Buffer Overflows / Off-by-One Overflows 풀이 (440) | 2022.12.28 |
[HackCTF Web] Input Check (X-Forwarded-For 헤더) (636) | 2021.02.03 |
[HackCTF Web] Input Check (295) | 2021.02.03 |
[HackCTF Web] Time (is_numeric 함수) (466) | 2021.02.01 |