▶문제

▶문제 속 용어 정리
API(Application Programming Interface)
소프트웨어 응용 프로그램에서 다른 소프트웨어 구성 요소 또는 서비스와 상호 작용하기 위한 인터페이스를 제공하는 프로그래밍 기술이다.
-> 서로 다른 애플리케이션 간에 통신이 가능하도록 한다!
API 서버
말그대로 API를 제공하는 서버이다. 대표적으로 데이터베이스를 대신해서 규칙들(로그인하기, 상품정보 보기, 결제하기 등)이 정의되어 있다.
클라이언트는 데이터베이스가 아닌 이러한 API 서버와 통신하는 것이다.
Path Traversal 취약점
디렉토리 조작으로도 알려져있으며 사용자로부터 경로(path) 형태의 입력값을 받아 서버의 파일에 접근할 수 있는 공격 기법이다.
Path Traversal을 이해하려면 먼저 파일 다운로드 취약점에 대해 알아야한다.
※파일 다운로드 취약점
웹 서비스의 파일 시스템에 존재하는 파일을 다운로드하는 과정에서 발생하는 보안 취약점이다.
공격자가 웹 서비스의 파일 시스템에 존재하는 임의 파일을 다운로드할 수 있다.
-> 설정 파일, 암호 파일, DB 백업 파일 등 민감한 정보가 포함된 파일을 탈취하여 2차 공격의 수행 가능하다!

위의 사진 속 주소들은 전부 URL 내에서 파일에 대한 경로로 접근이 가능하다는 것을 보여준다!
이렇게 파일 이름을 직접 입력받아 임의의 디렉토리에 있는 파일을 다운로드 받는 취약점이 Path Traversal 취약점이다.
▶풀이

문제 서버로 들어가니 위와 같은 화면이 나왔다. Home,About,Contact 다 눌러봤는데 아무런 동작을 하지 않았고 Get User Info를 눌러보았다.

userid에 guest가 입력되어있다.

View를 눌러보니 이렇게 떴다. 음...여기서 뭘해야할까 생각해보다가 guest를 해봤으니 한번 admin을 입력해보았다.(뭔가 admin과 guest는 다 입력해봐야할 것 같았다...ㅎㅎ)

admin을 입력하니 뭔가 바뀌었다. 근데 뭐...딱히 여기서 뭘 얻을 순 없었다...그냥 userid랑 level, password가 바뀌었네? 정도만...
일단 문제 파일을 다운받아보았다.

일단 이 부분을 먼저 살펴보겠다. flag 값을 구하는 데에 영향을 미치는 코드는 아니지만 아까 guest를 입력했을 때는 0으로, admin을 입력했을 때는 1로 순식간에 변하면서 userid, level, password가 출력되었다. (너무 빨라서 캡처는 못함...)
users 딕셔너리에 각 사용자를 저장하고 이 사용자들은 0과 1이라는 고유한 키를 가지고 있다. 여기서 0에 해당하는 사용자는 guest이고, 1은 관리자인 것이다.

자 이제 위의 코드가 진짜 눈여겨봐야하는 부분이다.
만약 POST 요청이 들어오면, 사용자가 입력한 userid를 가져와서 이를 /api/user에서 찾아서 출력해준다.

그리고 이 부분! FLAG에 관련된 코드니까 당연히 주목해야한다. /user/uid를 입력받아 이것을 json파일로 변환해 출력한다. 또다른 하나는 /api/flag 경로로 가면 FLAG를 출력한다!
※json파일
JavaScript Object Notation. Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다. 웹 애플리케이션에서 데이터를 전송할 때 일반적으로 사용한다.
문제에서 flag는 /api/flag에 있다고 했다. 그러면 나는 이곳에 접근하기만 하면 된다. 즉, userid 부분을 /api/flag를 향하도록 바꿔주면 되는 것이다.

그래서 ../flag를 일단 입력하였다.

음? FLAG 값이 나올줄 알았는데 안나왔다. 문제 서버에 바로 입력하면 안되는 것 같다...
그러면 어디다 입력할까...
잘 모르겠어서 검색을 해보니 풀이 방법이 2가지였다. 하나는 Burp suite를 이용해 푸는 방법, 다른 하나는 console 창에 입력하는 방법.
나는 더 간단하게 풀 수 있는 후자의 방법으로 풀어볼 것이다.

f12를 눌러 개발자 도구로 들어가서 console창에 입력을 할 것이다. (console창은 하단에 있다.)
우선 위의 사진과 같이 users를 입력해서 사용자를 확인해보았다.
위에서 봤듯이 guest는 0, admin은 1로 나왔다.

guest의 값을 ../flag로 입력하여 강제로 ../flag에 접근하게 하였다.
그러고나서 userid 부분에 guest를 입력하면

답이 나온다!

문제 풀이에 성공하였다!
'Dreamhack' 카테고리의 다른 글
[Dreamhack] web-misconf-1 (0) | 2024.05.22 |
---|---|
[Dreamhack] simple-web-request (0) | 2024.05.22 |
[Dreamhack] baby-union (0) | 2024.05.22 |
[Dreamhack] phpreg (0) | 2024.05.22 |
[Dreamhack] Flying Chars (0) | 2024.05.22 |