https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/
OWASP Top 10 2021 중 10위로 올라간 Server-Side Request Forgery (SSRF) (서버 측 요청 위조) 이다.
SSRF란?
- 서버가 의도하지 않은 곳으로 요청을 보내도록 속이는 공격이다.
- 웹 애플리케이션이 사용자가 입력한 URL 또는 리소스 위치를 검증 없이 그대로 요청할 때 발생한다. 공격자는 이를 악용하여 내부 또는 외부의 의도치 않은 대상에 요청을 보낼 수 있다.
- 방화벽, VPN 등으로 보호되던 시스템도 SSRF 공격을 통해 우회될 수 있으며, 취약점의 심각성은 클라우드 서비스와 복잡한 인프라가 확산됨에 따라 커지고 있다.
- 최신 웹 애플리케이션은 사용자의 편리한 기능을 제공하고자 URL 입력이 일반적인 상황이 되었다. 이로 인해 SSRF 발생률이 증가하고 있다.
/etc/passwd
와 같은 내부 파일에 접근하거나, 클라우드 메타데이터(서버 안에서만 접근 가능한 주소)를 요청해 인스턴스 관련 민감 정보를 탈취할 수 있다.PortSwigger Web Security Academy - Lab: Basic SSRF against the local server
https://portswigger.net/web-security/ssrf/lab-basic-ssrf-against-localhost
이 랩의 내부 시스템에는 데이터를 가져오는 재고 확인 기능이 있다.
랩을 해결하려면 재고 확인 URL을 변경하여 관리자 인터페이스 http://localhost/admin
에 엑세스하고 사용자 carlos
를 삭제하시오.
랩에 접속하여 직접 URL창에 /admin
을 입력하여 접속하였더니 관리자가 아니라 접속할 수 없다는 것을 알 수 있다.
제품을 선택하고 '재고확인'을 클릭한다. Burp Suite에서 '재고확인 버튼 클릭' 요청을 가로채서 Burp Repeater로 보낸다. (Burp Repeater에서는 Proxy에서 잡은 요청을 복사해서 반복적으로 실험이 가능하다.)
요청에서 stockApi
파라미터를 찾는다. stockApi
는 웹 어플리케이션이 stock 정보를 다른 서버에서 가져오기 위해 사용하는 API주소를 지정하는 파라미터이다.
문제에서 stockApi
의 URL을 변경하여 관리자 인터페이스에 접근하라고 하였으니, stockApi
파라미터의 URL을 관리자 인터페이스인 http://localhost/admin
로 변경한다.
send
를 누르면 Response에 HTML 코드가 뜨는걸 확인할 수 있다. 이를 읽어 사용자를 삭제할 수 있는 URL 정보를 찾는다. <div>
<span>wiener - </span>
<a href="/admin/delete?username=wiener">
Delete
</a>
</div>
<div>
<span>carlos - </span>
<a href="/admin/delete?username=carlos">
Delete
</a>
</div>
위의 코드에서 carlos
의 계정을 삭제하기 위해서는 /admin/delete?username=carlos
URL을 사용해야함을 알 수 있다.stockApi
파라미터에 삭제 URL을 넣어서 send 하면 성공적으로 carlos 계정을 삭제할 수 있다.stockApi
파라미터가 검증되지 않았다. 그 결과 localhost
와 같은 내부에서만 접근 가능한 리소스에 접근하도록 서버를 속일 수 있었다. 즉, 서버가 공격자의 대리인이 되어 내부 네트워크에 접근이 가능하다./admin
은 관리자만 접근 가능하도록 외부 접근을 차단하였지만, SSRF 공격으로 뚫렸기에 유명무실해졌다.