SSRF(Server-Side-Request Forgery)

SSRF는 위조된 HTTP 요청을 발생시켜 접근할 수 없는 서버 내부 자원에 접근해

외부로 데이터 유출 및 오동작을 일으키는 공격이다

CSRF와 SSRF는 공격이 비슷하다고도 할 수 있지만 다른점이 있다.







CSRF는 보는거와 같이 CLIENT 즉, 사용자쪽에서 시행되어지는 공격이고

SSRF는 SERVER측에서 시행되어지는 공격이다.

CSRF도 물론 위협적이지만 SSRF는 서버의 권한 탈취 및 DB에 접근하여

모든 사용자들의 개인정보가 유출될 수 있는 등 규모가 큰 피해를 입을 가능성이 높기에 더 위협적이다.




다음은 SSRF와 관련한 문제를 풀어보면서 SSRF가 대강 무엇인지 체감해보려 한다.



이 문제는 블랙리스트 기반의 입력필터를 가지고 있는데 이것을 우회하여

관리자 또는 로컬에서만 들어갈 수 있는 웹페이지에 접속하여서

'carlos' 라는 유저데이터를 삭제하는 문제이다.


ACCESS THE LAB을 눌러 페이지로 들어가보면





이런식으로 되어져 있는데 이 페이지에서는 딱히 POST값이나 GET값을 보낼 구멍이 없기에

첫번째사진의 View details을 눌러 들어갔다.










이런식으로 페이지가 나오고 여기서 혹시나 주소에 admin을 쳐서 접속할 수 있나 했지만





당연하게 막혔고 admin 권한 또는 로컬에서 들어가야한다고 나와있다.

다시 이전페이지로 돌아와서 Check stock이라는 유일하게 POST값을 보내는 버튼이 있다.




버튼을 누르게 되면

이런식으로 서버에 Payload로 주소에 대한 정보를 보여달라고 요청을 보낸다.

이 주소를 조작하기 위해서




Element에서 버튼에 대한 요소를 가져온다.



payload에 있는 값과 value에 있는 값이 같다는걸 알게 되었고 이걸 통해서

버튼을 클릭하는순간 value에 있는 값이 서버에 전송된다는걸 유추할 수 있다.



여기서 단순하게 http://localhost/admin이라는 주소를 치고 버튼을 누르게되면


이런식으로 요청이 걸러지게 된다.

걸러지게 되는 이유는 아까전에 말했듯이 블랙리스트기반의 필터를 가지고 있는데

이는 localhost나 admin같은 철자를 블랙리스트처리 하여서 요청이 걸러지게된다.

그럼 이를 우회하는 방법은 localhost나 admin같은 정상적인 철자를 넣지말고

비정상적으로 관리자가 생각하지도 못할 철자를 넣어서 우회하여 웹페이지를 얻어와야 한다.

localhost를 다르게 치환하면 127.0.0.1이 될 수도 있는데 이것은 127.1로 쓸 수 있다.

127.1로 쓰게되면 암시적으로 127.0.0.1로 인식을 하게 때문이다.

이것을 통해 변조를 시도해보았지만




다시한번 홍색 텍스트로 보이면서 400 bad request가 뜨며 막히게된다.

그래서 admin에 d를 인코딩해 %64로 만들어서 a%64min으로 요청을 다시 보내본다.




이렇게 요청이 잘 들어가면서


admin 페이지로 들어올 수 있게 되었다.

마지막으로 문제의 목적인 carlos 데이터를 삭제하기위해




delete?username=carlos로 carlos데이터를 삭제해준다.

이것까지 payload로 처리해주는 이유는 페이지에서 Delete를 누르게된다면

로컬에서 처리하는게 아닌 외부에서 처리가 되어지기에 또다시 권한이 없다는 창이 뜨면서

막히게 되어진다.




최종적으로 carlos데이터를 지우며 문제를 풀 수 있었다.


여기에서 더 어려운 SSRF 문제를 풀 수 있으니 참고하길 바란다.


REFERENCE







댓글

이 블로그의 인기 게시물

[WHS] 컴퓨터구조 일부분