본문 바로가기

1. Web hacking (웹 해킹)/2) 개념 정리

[20.05.08]WebGoat CSRF

CSRF(XSS와 비슷한 개념, 차이점은 XSS는 client 공격, CSRF는 server 공격)

원클릭 공격, 세션 라이딩, XSRF 등으로 호칭되는 CSRF는 웹사이트를 대상으로 하는 악성 공격이다.

웹사이트가 신뢰하는 사용자를 통해 인가되지 않은 명령이 전송되는 방식

웹사이트가 특정 사용자를 신뢰한다는 점을 이용

1️⃣사용자의 신원에 의존하는 웹사이트를 공격 대상으로 삼는다

2️⃣희생자의 신원을 이용하여 공격

3️⃣희생자가 해당 웹사이트에 (공격자 대신)HTTP 요청을 전송하게 만듦

4️⃣이 GTTP 요청 메시지에는 악성코드가 담겨있다.

사용자의 신원에 의존하는 웹사이트를 공격 대상으로 삼는다

특정 사용자를 신뢰하는 사이트를 타겟으로 삼는다

웹 기능을 표적으로 삼는다.

희생자의 신원을 사용하여 데이터를 변경한다.

get request 이용, csrf

View my Pictures!

 

실습

f12사용

링크가 들어있는 form태그 얻고

ip주소, 태그 수정 등을 하여 같은 브라우저로 html파일을 만든다.

 

외부접속, 내부접속 판단하는 법 : burp suite

referer의 유무. 있으면 false, 없으면 true

바로 직전, 어디에 있었는지를 알 수 있으며. 새 창을 열어서 접속했기 때문에 바로 직전 있던 것이 없었기 때문에 flag를 탈취할 수 있음

burp-suite repeater 이용

referer 플래그 제거

성공



post a review on someone else's behalf

현재 계정을 사용하여 리뷰 제출하기

그냥 댓글 쓰는 것이 아니라,

외부에서 사용하기

form 태그 끌어와서

위의 방법을 사용해서 submit버튼만 끌어온다.

type="hidden"을 추가하고 value만 넣고 약간 수정한다.

외부에서 동작했지만 버튼을 클릭했을 뿐인데 submit 버튼이 제대로 적용된다는 것을 알 수 있다.

다음과 같이 수정



automatic support from framework

Angular

쿠키를 헤더에 X-XSRF-TOKEN 항목을 만들어 CSRF에 대비

HttpOnly체크가 되어있으면 쿠키가 열람이 안됨

X-XSRF-TOKEN과 저장되어있는 쿠키와 비교

-> http only flag가 없을 경우 보안에 취약할 수 있다.

http only flag는 자바 스크립트 코드 접근을 막을 수 있기 때문이다.

 

헤더가 없다면 요청 메시지를 폐기하면 된다.

 

but i only have JSON APIs and no CORs enabled, how can those be susceptible to CSRF

 

CORs(cross origin resource sharing): 타도메인에서 리소스를 가져올 수 있음

same-origin policy(동일 출처) 적용

cross-origin(동일 출처, 외부에 있는 리소스를 가로질러서 가져오는 것)

내 안에서만 쓸 수 있는 것을 누군가 다운받는 것을 막을 수 있다.

 

CSRF

cross-site(사이트를 가로지른다, client가 여러개다. 내 스크립트가 다른 클라이언트에게도 악영향을 미치는 것)

 

pre-flight : HTTP 메소드 중 OPTIONS 메소드를 사용하여 CORS가 활성화 되어있는지를 확인하는 요청메세지

XHR - Ajax(비동기 통신을 위한 자바스크립트 라이브러리) 요청의 XMLHttpRequest 객체를 이용하여 서버와 통신

Ajax-비동기 통신(위에서 submit만 끌어와서 실습했듯이, 서버와의 통신을 통해 특정 필요 정보만 통신하는 방식)을 위한 자바스크립트 라이브러리

POST 메소드와 임의의 content-type을 사용하여 CORS 우회가능

->navigator.sendBeacon()메소드를 통해 소량의 데이터를 비동기 통신 할 수 있음

XHR로는 pre-flight 때문에 CSRF 공격이 어려워 다음거는 JSON 형태로 데이터를 전송하면서도 막히지 않을 수 있음. 하지만 현재는 서버와 웹브라우저 측 모두에 책임이 있어 막힌 상태

 

function postBeacon() {

    var data= new Blob([JSON.stringify({"author" :"WebGoat"})], {type : 'application/json'});

    navigator.sendBeacon("http://localhost:8083", data)

}

 

json만 받겠다고하면 정확한 방어대책이 아니다.

post 메시지 사용하여 content-type을 사용하여 CORs 우회가 가능하기 때문이다.

 

CSRF and content-type

 

form태그를 끌어와서 수정하는 방법

enctype="text/plain"이용

name에 원하는 data를 넣고 submit한다

content-type이 text/plain이 됐고 공격이 성공한 것을 볼 수 있다.

 

넣을 데이터

 

POST /csrf/feedback/message HTTP/1.1

 

{

  "name"    : "WebGoat",

  "email"   : "webgoat@webgoat.org",

  "content" : "WebGoat is the best!!"

}




login CSRF attack

 

희생자를 속여서 공격자의 계정으로 login하게 만든다.

login시 post의 body가 암호화되지않고 파라미터가 전송되는 것을 f12로 확인할 수 있다. 즉 CSRF공격에 유리하다.

후에 공격자는 해당 계정에 로그인해 희생자의 활동이력을 조회할 수 있다.

 

sameSite cookie

strict, lax mode

이를 적용하는 것은 cross site 요청이 되지 않는다.

 

CSRF Impact

로그인한 사용자가 할 수 있는 권한 정도의 영향을 줄 수 있다.

IoT, 스마트 장치, 상용 라우터에서 많이 쓰임.

 

동일 사이트 쿠키

쿠키의 범위를 제한할 수 있는 확장 기능

동일 사이트에 요청을 정송하는 경우에만 쿠키가 첨부될 수 잇음

Cross-site 요청이 안됨.

 

webgoat 수록, 참고 사이트

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet (Prevention/Defense)

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) (Attack)

https://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CSRF_Prevention_Filter / https://tomcat.apache.org/tomcat-8.0-doc/config/filter.html#CSRF_Prevention_Filter (Tomcat)

https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html