본문 바로가기

1. Web hacking (웹 해킹)/2) 개념 정리

[25.05.30] 웹 떠봐요 7주차 활동

SSRF 정의

SSRF는 Server-Side Request Forgery의 약자로, 웹 서비스의 요청을 변조하는 취약점으로, 브라우저가 변조된 요청을 보내는 CSRF와 다르게 웹 서비스의 권한으로 변조된 요청을 보낼 수 있다.

웹 서비스는 내부망 서비스와 통신할 수 있기 때문에 SSRF 취약점을 통해 웹 서비스의 권한으로 요청을 보낼 수 있다면, 공격자는 외부에서 간접적으로 내부망 서비스를 이용할 수 있고, 막대한 피해를 입힐 수 있다.

 

SSRF 분석

  • 이용자가 입력한 URL에 요청을 보내는 경우
    image_downloader : 이용자가 입력한 image_url을 requests.get 함수를 이용해 GET 메소드로 요청을 보내고 응답 반환.
    request_info : 웹 페이지에 접속한 브라우저의 정보를 반환.

    문제점 : image_downloader 엔드포인트의 image_url에 request_info 엔드포인트 경로를 다음과 같이 입력
    http://127.0.0.1:8000/image_downloader?image_url=http://127.0.0.1:8000/request_info
    위 경로 url에 http 요청을 보내고 응답을 반환하게 된다. 반환값을 확인해보면 브라우저로 request_info 엔드포인트에 접속했을 때와 다르게 브라우저 정보가 python-requests/<LIBRARY_VERSION> 임을 확인할 수 있다.
    웹 서비스에서 http 요청을 보냈기 때문. 이처럼 이용자가 웹 서비스에서 사용하는 api 주소를 알아내고, url에 주소를 전달하면 외부에서 직접 접근할 수 없는 기능을 임의로 사용 가능하다.
  • 웹 서비스의 요청 URL에 이용자의 입력값이 포함되는 경우
    user_info : 이용자가 전달한 user_idx 값을 내부 API의 URL 경로로 사용
    user_search : 이용자가 전달한 user_name 값을 내부 API 쿼리로 사용

    문제점 : 요청 URL에 이용자 입력값이 포함되면 요청을 변조할 수 있다.
    예를 들어, user_info 함수에서 user_idx에 ../search를 입력할 경우 웹 서비스는 http://api.internal/search와 같은 url에 요청을 보내게 된다.

  • 웹 서비스의 요청 Body에 이용자의 입력값이 포함되는 경우
    board_write : 이용자 입력값을 HTTP Body에 포함하고 내부 API로 요청을 보냄
    internal_board_write : board_write 함수에서 요청하는 내부 API 구현. 전달된 title, body, 계정 이름을 JSON 형식으로 반환
    index : board_write 기능을 호출하기 위한 인덱스 페이지

    문제점 : 데이터를 구성할 때 이용자 입력값을 파라미터 형식으로 설정한다. 이로 인해 구분 문자 &를 포함하면 data 값을 변조할 수 있다.
    예를 들어 title에서 title=title&user=admin을 삽입하면 내부 API에서는 전달받은 값을 파싱할 때 앞에 존재하는 파라미터 값을 가져와 사용하기 때문에 usre 값을 변조할 수 있게된다. 

SSRF 문제 풀이(web-ssrf)

url에 'localhost' 또는 '127.0.0.1'일 경우 error.png를 띄우기 때문에 우회해서 url을 입력해야 한다. 

코드 local_port = random.randint(1500, 1800) 를 통해 포트 번호가 1500~1800 중에 하나임을 알 수 있다. 

 

http://0x7f000001:{1500~1800}/static/dream.png에 숫자를 무작위 대입을 시도하여 확인할 수 있다.

burp suite의 repeat 기능을 이용해 시도한 결과, 1546포트가 동일한 응답을 출력함을 알 수 있다.

1546포트에 접근해 flag.txt를 읽으면 base64로 인코딩된 flag가 나온다.

이 값을 디코딩하면 flag값을 확인할 수 있다.