XSS는 클라이언트측에서 스크립트를 실행시키는 공격이라고 배웠습니다.
이때 많이 사용하는 언어가 자바스크립트이기 때문에 자바스크립트를 얼만큼 잘 사용하냐에 따라 해당 취약점으로 엄청난 공격도 가능합니다.
최소한으로 알고있어야하는 쿠키 탈취가 있었습니다.
이외에 자바스크립트로 할 수 있는 것이 무엇이 있는지 기본적인 것들을 알아보겠습니다.
1. Page Redirect
자바스크립트로 새로운 페이지를 불러올 수 있습니다.
- location.href = "https://google.com";
- location.replace("https://google.com");
2. 주소창 변조
주소창의 경로를 변경하여 보여줄 수 있습니다. (실제 해당 경로는 아님.)
- history.pushState(null, null, 'login.php');
실제로는 ctf.segfaulthub.com/#1234123412341234 URL 이지만 login.php로 변경이 가능합니다.
만약, Reflected XSS 공격으로 URL 이 너무 길고 이상할 경우 사용하면 좋을 것 같습니다.
3. DOM 객체 접근
이 기능이 가장 중요합니다.
다음 시간에 배울 CSRF에도 유용하게 사용할 수 있다고 합니다.
DOM이란 ? 웹 페이지(HTML이나 XML 문서)의 콘텐츠 및 구조, 그리고 스타일 요소를 구조화 시켜 표현하여 프로그래밍 언어가 해당 문서에 접근하여 읽고 조작할 수 있도록 API를 제공하는 일종의 인터페이스역할을 해주는 것입니다.
document를 사용하면 해당 객체에 접근할 수 있게 됩니다.
console.dir(document)를 사용하여 구조화된 document를 확인할 수 있습니다.
원하는 곳에 접근하고 싶을 경우 document.이름 을 작성해주면 원하는 곳에 접근할 수 있습니다.
Ex) URL 을 확인하고 싶을 경우 document.URL 을 입력하면 사진에 나와있는 URL 을 가져옵니다.
이제 DOM 에 대해 더 자세히 알아보겠습니다.
DOM 을 통해 페이지의 원하는 어느 곳이든 접근할 수 있습니다.
그렇기 때문에 취약점이 발생하는 페이지에 중요한 정보가 있다면 해당 값을 가져올 수 도 있습니다.
만약, 마이페이지 Flag Here..! 부분에 중요한 정보가 있다고 가정을 해봅시다.
해당 부분에 접근을 어떻게 할까요?
우리가 원하는 태그에 접근하는 방법은 많습니다.
- document.getElementById(id); : id가 id인 Element를 가져옵니다.
- document.getElementsByClassName(class); : className이 class인 Element를 가져옵니다.
- document.getElementsByName(name); name이 name인 Element를 가져옵니다.
- document.getElementsByTagName(tagname); 태그가 tagname인 Element들을 가져옵니다.
이때 id를 제외한 나머지는 각 Element마다 중복된 값을 가질 수 있기 때문에 여러개의 Element가 나올 수 있습니다.
그렇기 때문에 리스트로 반환되어 접근하기 위해서는 해당 인덱스도 같이 입력해주어야합니다.
우리가 원하는 Flag Here..!를 담고 있는 Element는
id = x
class = x
name = info
tagName = input
입니다.
그렇기 때문에 name과 tagName을 사용하여 접근할 수 있습니다.
우리가 원하는 곳에 접근까지 했습니다.
이제 우리가 원하는 Flag Here..! 는 placeholder라는 속성안에 있습니다.
속성을 가져오는 방법은 접근한 Element.속성 을 입력해주면 됩니다.
Element를 i 라는 변수에 저장해주고 i.placeholder 라고 속성 접근을 하니 원하는 값을 가져오기까지 성공했습니다.
만약 속성이 아닌 Element 값에 있으면 어떻게 할까요?
사진과 같이 개인정보라는 글자는 해당 속성이 아닌 내용에 적혀있습니다.
물론 여기도 접근 가능합니다. innerHTML 을 사용하는 것입니다.
innerHTML 은 해당 Element 안에 있는 내용을 전부 가져와줍니다. 만약 해당 태그안에 다른 태그가 있다면 그것도 포함해서 가져옵니다.
이렇게 DOM 객체를 사용하면 페이지에 만약 중요한 정보가 저장되어 있다면 그 정보를 가져올 수 있습니다.
가져오는 것은 우리가 쿠키 가져오기할 때처럼 우리 공격자 서버로 요청을 하면 될 것입니다.
마지막으로, 만약 XSS 취약점이 발생하는 페이지와 중요한 정보가 저장되어 있는 페이지가 다를 경우 중요한 정보를 가져올 수 있는 방법을 알아보겠습니다.
iframe 태그를 사용하는 것인데 iframe 태그를 사용하면 해당 페이지를 그대로 가져와 출력해줍니다.
<iframe src="가져올 페이지 주소"></iframe> 으로 작성해줍니다.
XSS 취약점이 발생하는 게시판에
<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html"></iframe> 작성해주면 위의 마이페이지가 그대로 게시판에 들어가게 됩니다.
실제 다른 페이지를 가져온 모습을 확인할 수 있습니다.
이제 해당 페이지의 DOM 객체에 접근만 할 수 있다면 게시판에서 마이페이지의 정보를 가져올 수 있습니다.
이때 사용하는 것이 contentDocument; 입니다.
위에서 원하는 Element를 가져오는 방식으로 iframe 태그를 가져와서 contentDocument를 사용해주면 DOM 객체로 사용할 수 있습니다.
스크립트 작성한 부분을 확인해보면 해당 iframe Element를 가져와 dom객체로 해당 텍스트를 가져올 수 있습니다.
이렇게 자바스크립트를 사용하여 원하는 정보도 가져올 수 있는 것을 확인했습니다.
과제
1. ctf 문제풀기
'웹 해킹' 카테고리의 다른 글
웹 해킹 공부 일기장 7 - 과제2 (XSS) (0) | 2024.01.15 |
---|---|
웹 해킹 공부 일기장 7-과제1 (XSS) (0) | 2024.01.14 |
웹 해킹 공부 일기장 (XSS 정리) (0) | 2024.01.12 |
웹 해킹 공부 일기장 6- 1 (XSS) (0) | 2023.12.29 |
웹 해킹 공부하기 5 - 1 (XSS) (2) | 2023.12.22 |