본문 바로가기

보안지식/CSRF

SSRF 공격 - 정리,실습

안녕하세요! SSRF 공격에 대해 정리를 해드리겠습니다.

 

- SSRF? -

 

Server Side Request Forgery 입니다.

CSRF랑 원리는 같지만 SSRF은 서버와 임의의 요청을 하게 만드는 공격입니다!

CSRF는 클라이언트와 임의의 요청을 하게 만드는 공격이고요

 

 

- 그럼 어디서 공격 되나요?(where?)

 

서버가 외부 자원(리소스) 이용하는 곳에서 발생합니다!

더군다나 파라미터로 URL을 받는 경우입니다.

 

예를 들어 볼게요.

 

제가 날씨를 알려주는 API 기능이 있다고 합시다.

이때 날씨 정보를 가져오는 API을 URL에 파라미터로 쓰는 곳에 공격을 통합니다.

 

view.php?weatherAPI=https://kakao.com/~~~

 

이렇게 API의 정보를 URL 파라미터에 담은 경우입니다.

 

저렇게 API을 파라미터로 쓰는 경우는 매우 드물긴 하지만 요즘 개발자가 API 여러 개 쓰다 보니

간단하게 처리하기 위해 저렇게 쓰는 경우가 있긴 한답니다.

 

 

 

- 그럼 어떡해 공격을 해요?

 

일단 API의 기능을 간단하게 설명해 드리겠습니다.

 

그림 못그려도 봐줘요

 

 

먼저 클라이언트가 서버에게 날씨 정보를 묻습니다.

 

그럼 서버가 API로 요청을 보내겠죠? 날씨 어떻냐고요

 

그다음에 API가 처리하고 나온 정보를 서버한테 전달합니다.

 

그리고 서버는 그 정보를 클라이언트에게 주는 거예요

 

 

 

그럼 이제 SSRF 공격을 봐봅시다.

 

조만간 그림 공부도 할게요

 

공격자가 API의 주소를 공격자가 원하는 API이나 공격 코드를 넣어서 요청을 합니다.

 

그리고 나면 서버는 아무것도 모르고 이상한 곳에 요청을 보냅니다!

 

그리고 나면 그 이상한 곳에는 정보를 얻거나 변경을 당하겠죠?

 

그리고 클라이언트에게 그 정보를 주거나 변경된 내용을 응답메시지로 보내게 됩니다.

 

 

 

 

 

- 그 공격으로 뭘 할 수 있는 건데요? 의미가 있어요?

 

이제 실습으로 보여드리겠습니다.

 

https://portswigger.net/web-security/ssrf/lab-basic-ssrf-against-localhost

 

Lab: Basic SSRF against the local server | Web Security Academy

This lab has a stock check feature which fetches data from an internal system. To solve the lab, change the stock check URL to access the admin interface at ...

portswigger.net

 

실습 장소는 여기서 했습니다.

 

Access the Lab 누르시고 로그인하시면 돼요

 

 

그럼 임의의 거래 사이트가 보이실 거예요

 

꽤나 많네요

 

 

아무 물품을 클릭하고 들어가 봅시다.

 

그리고 상품의 개수를 알려주는 요청이 있습니다.

 

check stock을 누르시면 몇개 남았는지 알려줍니다.

 

그리고 버프 스위트로 보겠습니다.

 

뭔가있는데

 

stockAPI을 파라미터로 보내는 게 있죠?

 

 

 

처음 이 실습 문제 들어오기 전에 보셨겠지만

 

 

 

http://localhost/admin으로 들어갈 수 있다고 합니다. 그러니깐 admin의 페이지를 들어갈 수 있다고 합니다.

 

그렇다면 주소 창에 admin이라고 적으면 들어가지겠네요?

 

.web-security-academy.net/admin 이라고 적고 해 보겠습니다.

 

 

감자가 눈에 띄네요

 

들어가 보니?

 

 

들어갈 수 없다고 합니다.

 

admin 인터페이스는 오로지 어드민으로 로그인해야만 들어갈 수 있다고 하네요!

내부망에서만 안으로 들어갈 수 있다는 겁니다.

 

그럼 저희는 외부에 있으니깐 들어갈 길이 없겠죠.

 

 

하지만 SSRF 공격으로 내부망에서 들어가는 방법이 있습니다!

 

전에 API 요청을 보낸 stockApi을 한번 http://localhost/admin로 한번 입력을 해보겠습니다.

 

이렇게요

 

그럼 어떻게 될까요??

 

localhost는 자기 자신을 뜻합니다! 그리고 admin 페이지로 가지게 하는 간단한 링크이죠.

 

그럼 서버에는 어떻게 될까요?

 

 

이렇게 됩니다.

 

공격자가 http://localhost에 있는 admin에 처리를 해줘 요청을 합니다

 

그리고 나면 서버는 localhost라는 API을 찾게 되는데 localhost는 자기 자신을 뜻해서

자기 자신에게 요청 즉 서버에서 처리를 하게 됩니다.

 

그리고 /admin의 페이지의 정보를 가져오게 되고

 

그 응답을 공격자에게 가져다주게 됩니다!

 

 

원래는 외부에서 admin 접근이 차단됐잖아요? 근데 이 API을 이용해 서버 컴퓨터가 자기 자신이 찾는 거니깐 

내부에서 일어나는 요청이니 admin 접근이 허용이 되면서 이런 공격이 통하게 됩니다.

 

 

 

 

보실게요! send 보내보겠습니다.

 

응답메시지에 Render로 보시면 편해요

 

저렇게 admin 계정을 들어갈 수 있다는 것을 볼 수 있습니다.

 

이 문제는 carlos 유저를 지우라는 거니 저 Delete 버튼을 누르라는 거겠죠?

응답 메시지를 보시면

 

carlos 지우는 링크

 

Delete하는 링크가 있네요!

 

그걸 그대로 API에 하면 해결이 되겠죠

 

이렇게요

 

그리고 send 하겠습니다.

 

처리가 되었고

 

실습 페이지로 돌아가시면 

 

축하합니다!

 

문제가 풀린 것을 알 수 있습니다

 

 

 

더 나아가서 파일을 열 수도 있겠죠?

 

file://localhost/etc/passwd 처럼 입력하면

 

서버 파일에 passwd의 데이터를 받을 수 있겠죠?

 

또 ssh, sft://localhost/ 이렇게 접속이 가능합니다.

 

 

 

꼭 자기 자신만 공격을 안 합니다! 내부망에는 여러 서로 연결된 서버컴퓨터가 있겠죠?

 

포트 scan을 행해서 연결된 서버컴퓨터를 찾을 수도 있습니다.

예를 들어 http://192.168.0.0:80, http://192.168.0.1:80, http://192.168.0.3:80 ...

 

반복을 하다 보면 연결된 서버컴퓨터를 찾을 수 있게 됩니다.

 

 

________________________________________________________________________________________________

 

-대응방안

 

간단해요 파라미터로 API 주소를 받지만 않으면 되겠죠

끝이에요. 이것만 하면 끝입니다!

.

.

.

.

.

여기까지 긴 글을 읽어주셔서 감사합니다!

'보안지식 > CSRF' 카테고리의 다른 글

CSRF 3번 공격 시나리오  (0) 2023.05.29
CSRF 2번 공격 시나리오  (0) 2023.05.28
CSRF 1번 공격 시나리오  (2) 2023.05.27
CSRF 공격 - 실습 (3번 풀이)  (2) 2023.05.22
CSRF 공격 - 실습 (2번 풀이)  (0) 2023.05.21