CSRF

CSRF

ragdo11 2024. 7. 10. 00:36

Cross Site Request Forgery(CSRF)는 공격자가 스크립트 구문을 사용해서 다른 정상적인 사용자가 조작된 요청을 전송하도록 하는 공격을 말한다. XSS와 헷갈릴 수 있는데 XSS는 악의적인 스크립트가 희생자 측에서 동작하게 하는 공격이라면 CSRF는 희생자가 자신이 조작된 요청을 요청하도록 하게 하는 공격이라는 차이가 있다.

오묘하게 비슷한거 같으면서도 다른 이 두 공격은 같이 사용하면 더 좋은 시너지를 낸다.

 

희생자가 자신이 조작된 request를 요청하게 해야 한다는 점에서 사회공학적 공격이 같이 사용되어야 하며, 희생자의 권한에 따라 공격이 커질 수 있다.

 

GET 방식 전송일 때의 CSRF 예시

아이디와 비밀번호가 111인 계정으로 CSRF를 테스트해본다.

굉장히 조악한 비밀번호 변경 파트 부분. 아무튼 비밀번호를 123으로 변경한 후 패킷을 본다.

실제 비밀번호를 변경하는 부분은 my_change_ok.php에서 이뤄지는 것을 알 수 있고, GET 방식으로 전송하기 때문에 뒤의 pw2 파라미터와 123이라는 값 역시 url에 같이 전송됨을 알 수 있다.

 

그렇다면 이를 이용해 위치를 my_change_ok.php로 이동시키고 pw2의 값을 원하는 값으로 변경시키면 CSRF의 공격 형태가 이루어지게 된다.

XSS 취약점이 있는 게시판의 검색 부분에 위 처럼 코드를 넣어주면 현재 로그인된 사용자(111)의 비밀번호가 12345로 변경될 것이다.

확인을 쉽게 하기 위해 type을 변경해주었음!

실제 공격에 사용되는 referer의 URL 주소를 복사해준 다음, 공격에 활용하기엔 URL 주소가 너무나도 수상하니 단축 URL 등의 방법으로 변환 후 사용한다. (이번엔 9731로 변경)

 

이런 식으로 단축 URL을 만들어준 후 접속해보면

비밀번호가 변경되었음을 확인할 수 있다.

 

 

POST 방식일 때 CSRF 공격 예시

POST 방식일 때는 CSRF 단독으로는 공격에 성공하지 못한다. 반드시 XSS 등과 병행해야 함!

이번 예시는 Stored XSS와 병행해서 공격을 해봅시다~

 

POST 방식에서 패스워드를 111로 변경한 패킷이다. GET 방식과 달리 페이로드에 어떠한 파라미터나 값이 담기지 않는다.

아까 했던 방식으로 공격을 시도하면 당연히 되지 않을 것이다.

 

Stored XSS과 병행하는데 form 태그를 이용하여 조작된 요청을 만드는 간단한 방법으로 공격을 해본다.

우선 content 데이터가 폼 태그 안으로 들어가므로 폼 태그를 먼저 닫아준 후, (폼 태그안에 폼 태그 사용 X -> 데이터를 제대로 찾지 못해 오류 발생) click하면 패스워드 변경 페이지에 패스워드를 1044로 변경해달라는 요청을 만드는 공격 구문이다.

click 위치는 매우 불편하지만 click을 눌러주게 되면 

제대로 된 요청과 함께

패스워드가 변경된 것을 확인할 수 있다.

하지만 뭔가 클릭을 하라고 유도하는 것은 수상하니 아래와 같이 자동으로 넘어가도록 만들 수도 있다.

이와 같은 형태로 작성 시 자동으로 submit 되어 조작된 요청이 간다!