SSRF

SSRF란 서버의 요청을 변조할 수 있는 취약점입니다.
웹 서버는 일반 사용자가 접근할 수 없는 자신이나 연결되어 있는 다른 백엔드 서비스에 접근이 가능합니다.
이런 서버의 요청을 조작한다면 해당 권한으로 일반 사용자에게 인가되지 않은 파일을 열람하거나 수정하는 행위를
가능하게 합니다. 대부분의 경우 http(s) 프로토콜만을 허용하지만 필터가 적용되지 않은 경우
data:// , ftp:// 와 같이 여러 프로토콜을 사용해 공격에 응용할 수 있어 광범위한 영향을 미칠 수 있는 취약점이라 할
수 있습니다.

출처 : https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html#case-1-application-can-send-request-only-to-identified-and-trusted-applications%2034

서버가 웹 앱과 같이 다른 어플리케이션에서 이미지, API 통신과 같이 정보를 받아오기 위해 GET 또는 POST 방식을 통해 파라미터를 전송한다면 해당 파라미터에서 SSRF가 일어날 수 있습니다. 특히 링크 또는 도메인 이름, FQDN을 포함하는 모든 URL 매개변수가 Injection Point로 접근하면 될 것 같습니다.

stockApi는 SSRF를 터트릴 수 있는 Point로 유추해볼 수 있습니다.

Burp Suite의 Intruder 기능을 사용하여 Brute Force를 통해 내부 사설 IP를 찾아볼 수도 있습니다. 이를 통해 내부망
내의 다른 어플리케이션에 직접적으로 접근이 가능하고, 공격을 수행할 수 있게 됩니다.

다음은 SSRF에 대한 보안 대책입니다. Filtering 혹은 Least Privilege Policy를 적용하여 SSRF에 대비해야 합니다.

SSRF 보안

  • 되도록 내부 애플리케이션과 통신하는 입력에 대해 사용자가 개입할 수 없도록 구성
  • 시스템은 HTTP 및 HTTPS와 같은 극소수의 포로토콜만으로 제한
  • White List 기반으로 필터를 사용

다만 이러한 보안조치 이후에도 이를 무력화하는 방법들도 존재하는데요. 이는 다음과 같습니다.

SSRF bypass

  • localhost 와 같이 URL 필터링이 적용되는지 확인
  • 내부 사설 IP를 brute force를 통해 찾을 수 있음
  • IP 난독화를 사용하여 필터 우회
  • URL 표현방법 중 @ (host), # (fragment) 를 사용해서 White List 우회

참고 자료 : https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass

 

실제 버그바운티 분야에서 발견되는 SSRF에 대한 보고서를 살펴보겠습니다.

https://hack-ed.net/2017/11/07/a-nifty-ssrf-bug-bounty-write-up/

 

A Nifty SSRF Bug Bounty Write Up

Due to the positive response I got on my previous write up, I figured I’d keep the ball rolling and do another. Thank you to everyone who shared the last post, and I hope that you find this w…

hack-ed.net

SSRF가 터질 수 있는 Url 파라미터를 필자도 인지하고 익스를 시도했습니다.

실제로 SSRF가 터지는 포인트는 맞으나 어플리케이션에서는 Output 데이터에 대한 타입을 검증해서 JSON 형식이 아니라면 오류를 반환하도록 만들었습니다.
때문에, 직접적으로는 파일을 열람할 수 없어 X-Forwarded-For 헤더를 사용하여 SSRF를 응용하게 됩니다.

  • X-Forwarded-For : HTTP Server에 요청한 Client의 IP를 식별하기 위한 표준으로 사용
    • Proxy & cashing Server가 존재할 경우 웹 서버는 Proxy에 접속한 것으로 인식함
    • 그렇기 때문에 웹 서버는 실제 클라이언트의 IP가 아닌 앞단에 있는 Proxy Server IP를 Request IP로 인식
    • Client IP -> Proxy IP -> Web Server

XFF 헤더에는 내부 IP가 노출되어 있어 해당 IP에 대한 포트 스캔을 시도했습니다. 

Open Port와의 응답시간을 비교하여 판단

이는 내부 IP에 대해 방화벽을 우회하여 포트 스캔이 가능함을 의미하게 됩니다.

SSRF를 통해 Port Scan이 가능하다는 점. SSRF의 광범위한 영향을 보여주는 보고서가 아닌가 싶습니다.
외에도 Redirect를 활용하여 SSRF Point에서 XSS를 터트린다거나 CRLF를 같이 사용하여 Exploit을 하는 보고서 등
다양한 기술과 더불어 창의적인 익스 방식을 엿볼 수 있었습니다. 현재 버그바운티 분야에서도 종종 발견되고 있는 취약점이니 여러 기술과 응용하여 SSRF를 알아둔다면 도움이 될 것 같습니다.

'WEB' 카테고리의 다른 글

Data URIs  (1) 2022.02.16

Data URI는 HTML 및 CSS에 이미지를 포함하거나 외부 파일을 인라인으로 넣기 위해 사용합니다.

<img src="./filename.jpg">

 

img태그를 사용하였을 때 src 속성에 보통은 위와 같은 방법으로 이미지를 불러옵니다. 그러나
Data URI의 형식은 다음과 같습니다.

data:[MIME][;charset=encoding][;base64]<data>

<img src=data:image/jpg;base64,AAAAAAA...>

[MIME] 생략 시 기본적으로 text/plain;charset=US-ASCII로 설정됩니다.

해당 img태그의 경우 data URI를 사용하여 이미지 데이터가 HTML 문서 자체의 일부가 됩니다.
base64로 인코딩된 이진 데이터를 로드함에 따라 자연스레 지연시간이 더 걸리는 문제가 발생할 수 있으나,
어느 구문을 사용하더라도 브라우저가 렌더링한 동일한 이미지를 확인할 수 있습니다.

추가적으로,
"data: " URI 체계는 짧은 값에만 유용합니다. 예를 들어 Mozilla의 경우 기본적으로 무제한 길이의
데이터 URI를 지원하지만 Opera 브라우저의 경우 데이터 URI를 4100자로 제한하고 있기에
되도록이면 짧은 값에서 사용하는게 유용하다고 볼 수 있습니다.

해당 기술이 유용한 상황은 다음과 같습니다.

  • 이미지의 크기가 너무 작아서 HTML 내에 이미지를 인라인으로 배치하여 HTTP 요청의 오버헤드를 줄일 수 있다.
  • 외부 리소스에 대한 액세스가 번거롭거나 제한적인 환경에서 사용

이미지를 Data URI로 복사하는 방법

데이터 링크에 마우스 커서를 가져다 댄 후 우클릭
상단의 소스 패널에 표시를 클릭
이미지를 우클릭 한 뒤 데이터 URI로 이미지 복사
Data URI로 변환 완료.

 

더 나아가서, Data URI는 이미지뿐만 아니라 모든 종류의 정보를 인코딩할 수 있으므로
XSS 필터를 우회하여 공격할 수 있습니다. 다음과 같은 코드가 있다고 가정해보겠습니다.

<div> user_input </div> 환영합니다.

웹 어플리케이션에서는 XSS 필터로 아래의 키워드들이 추가되어 있습니다.

  • script, javscript, alert, ', ( ) , :

자바스크립트를 실행하려면 <script> 태그를 이용해야 합니다. 그러나, 어플리케이션은 특정 키워드에
대한 사용자의 입력을 검증하기 때문에 <script> 태그는 사용할 수 없습니다.
따라서, 악성 스크립트를 실행하기 위해 데이터 URI를 사용하여 다음의 페이로드를 주입할 수 있습니다.

<object data="datatext/html;base64,HNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4="></object>
  • base64 encode : HNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=
  • base64 decode : <script>alert("Hello");</script>

브라우저는 객체 태그를 로드할 때 데이터 속성에 할당된 객체를 로드합니다. 이로 인해 자바스크립트가 실행됩니다.
base64로 인코딩된 페이로드 때문에 블랙리스트 필터를 우회할 수 있었습니다.
해당 기술을 사용하면 다양한 MIME 유형의 파일을 동적으로 생성할 수 있고, 백도어를 만들거나 악성 PDF 파일을 생성하는 등의 여러 공격을 수행할 수 있게 됩니다.

WEB 모의해킹에서 데이터 URI를 사용하는 경우

  • XSS에 대한 대책으로 웹 어플리케이션 측에서 블랙리스트를 기반으로 필터를 사용하는 경우
  • 데이터의 문자 인코딩을 직접 지정할 수 있어 웹 어플리케이션이 유효성 검사를 적용하지 않은 문자 집합으로 데이터를 인코딩 할 수 있음
  • 데이터 콘텐츠가 이미 사용자의 브라우저에 있으므로 바이러스 백신 보호를 실행하는 사용자를 우회하는데
    사용 가능

Data URI를 사용할 수 있는 XSS의 범위
새 요청을 생성하여 외부 소스를 로드하는 태그로만 제한됩니다.

  • Anchor Tag
  • IFRAME Tag
  • Object Tag
  • Image Tag

HackerOne에서 해당 기술로 XSS를 터트린 보고서가 존재하는지 찾아보았는데요.

Stored XSS로 보고된 리포트 중에서 확인할 수 있었습니다.
도메인이 출력되는 PoC도 확인할 수 있습니다.

실제 XSS 취약점 포인트에서 data: 문법을 사용하여 XSS를 터트릴 수 있었고, 이는 버그바운티 분야에서도 상당 수 쓰인다는 것을 알 수 있었습니다. 다만 레포트 몇개를 살펴보다 보니 모든 브라우저에서 터지는 것이 아님을 확인할 수 있습니다. 따라서, URI 기능을 지원하거나 허용하는 브라우저에 한해서 Data URI 기술을 이용할 수 있을 것 같습니다.

Mozilla Firefox 브라우저의 Data URI 제한

  • <a href="data:..."> click 이 새로운 최상위 데이터 URL 문서로 이동하는 경우  차단
    다음과 같은 경우가 허용 :
  • 사용자가 주소 표시줄에 "data:..."을 명시적으로 입력 / 붙여넣기
  • "data:image/svg+xml"이 아닌 경우 최상위 창에서 "data:image/*"열기
  • "data:application/pdf" 및 "data:application/json"열기
  • 데이터 다운로드 : URL, ex) "data:..." 의 save-link-as

Firefox 59부터 최상위 창에서 데이터 URL로 이동하려는 웹 페이지가 차단되고 다음과 같은 메시지가
콘솔에 기록됩니다.

 

대부분의 브라우저에서 지원되나, Internet Explorer 7 이하에서는 현재 지원되지 않습니다. 
현재, Internet Explorer 8 이상에서 CSS의 이미지에 대한 데이터 URI만을 지원합니다.
Opera의 경우 7.2부터 지원

'WEB' 카테고리의 다른 글

SSRF  (0) 2022.02.17

+ Recent posts