Web 모의해킹

XSS (Cross Site Scripting)

5_jinseok12 2018. 3. 24. 19:15
728x90

XSS 란?

 

Cross Site Scritpting 은 어플리케이션에서 브라우저로 전송하는 페이지에서 사용자가 입력하는 데이터를

검증하지 않거나, 출력 시 위험 데이터를 무효화 시키지 않을때 발생한다.

 

즉, 공격자가 브라우저에서 실행될 수 있는 악성 스크립트를 웹서버에 삽입했고, 사용자가 이를 요청해

자신의 브라우저에서 실행되게 될 때 공격자에 의해 작성된 악의적인 스크립트가 사용자에게 전달되는 공격이다.

공격방식은 자바스크립트의 특징을 이용하여 다른 사람의 컴퓨터에서 실행을 시킨다. ex) alert

스크립트가 실행되기만 해도 XSS에 대해 취약하다고 볼 수 있다.

웹 브라우저 내에서 적절한 검증이 없이 실행되는 것이기 때문에 사용자의 세션을 탈취/ 웹사이트를 변조/PC 오작동 등 발생.

공격자가 직접 접속하여 악성코드를 퍼트리는 것이 아니라 HTTP 프로토콜을 사용하는 과정의 취약점을 이용한 것으로

웹 서버로부터 클라이언트에게 전달되는 데이터에 악성스크립트를 삽입하기 때문에

사용자가 접속하게 되면 사용자의 클라이언트에서 실행되어 공격을 당하는 원리이다.

그렇기에 자연스럽게 여러명에게 공격을 가할 수 있는 방법이다.

공격이 단순해보이지만 오히려 특징잡기가 어려워서 막기가 더 힘들다.

 


 

예)아래 사진과 같이 게시판 같은 곳에 글을 쓴 후 상대방이 클릭하면 프로그램을 실행시키는 코드를 작성하는것.

 

이런 방법으로 피해자가 게시판의 글을 보고 접근했을 때 자동으로 alert의 알림 기능을 통해 프로그램을 실행 시켜보았다.

피해자는 alert의 기능이 있는 줄 인지하지 접근하였을 것이다.

즉, alert 가 아니라 악성코드였다면 이미 클릭한 순간 공격자에게 공격을 받은 것이다.

 

 

공격하는 과정을 설명하겠다.

코드를 살펴보면 알 수 있다.

 

1. 게시글을 작성할 때 스크립트 구문을 입력한다.

2. 피해자(사용자)는 게시판의 글을 보고 내용을 확인하기 위해 클릭한다.

3. 웹 서버는 사용자가 접근한 XSS 코드가 포함된 게시판의 글을 사용자에게 전달한다.

4. 사용자 측에서 XSS 코드(ex.alert기능)이 실행된다.

5. XSS 코드가 실행된 것을 사진을 통해 확인할 수 있다

 


 

1) stored XSS :   공격자가 웹 서버에 악성 스크립트를 포함하는 페이지(게시글, 댓글)를 미리 저장해 놓고, 이를 클라이언트(사용자)가

요청하면  전달하여 클라이언트가 실행하는 과정에서 공격당하게 하는 방법.

 

2) reflected XSS  :  스크립트가 포함된 공격 URL을 다른 웹 사이트나 이메일로 보내서 다른 사용자가 클릭하도록  유도한다.

 (본인이 직접 공격해서 공격당한다고 하더라도 가능성이 있다면 취약점이 된다)

 

 

 

1) 공격 방법

 

 

 

사용자는 "그림파일" 이라는 제목의 글을 보고 접근하는데

게시판의 내용에는 XSS 공격이 있다. 

 

 

 

위 사진의 소스파일을 통해 공격이 되고 있음을 알 수 있다.

 

 

 

 

 

stored XSS 를 막는 방법

1. 스크립트가 입력되지 않도록 설정하는 방법.

2. 스크립트를 입력시켜도 실행이 안되도록 설정

 

 

 

2) XSS 방어하기

 

글을 작성하는 vi 에서 script 가 보이면 바로 차단을 하는 코드.

이런식으로 스크립트를 입력되지 않도록 설정하는 방법.

<script>를 입력하면 XSS 라는 문장 알림과 함께 전의 페이지로 되돌아간다,

 

 

위의 vi에 들어가서 정보를 확인할 수 있다.

 

 

 

 

$t_board="zetyx_board"

$id = vul

$filenum=1 이라는것을 확인할 수 있기 때문에 쿼리의 내용을 변경할 수 있다

 

 

 XSS 방어를 위해 작성한 코드때문에 script를 통한 입력은 허용되지 않는다

하지만 이러한 방법을 예측하고 우회를 하여 memo 컬럼에 직접 script를 삽입하여 문자를 출력하는 방법을 사용할 수 있다.

 

memo 라는 변수는 텍스트입력 창을 나타내는 변수이다

즉 script가 막혀있더라도 memo에서 직접 값을 입력하면 프로그램이 실행된다

 

ex) memo= <script>alert("hello")</script> 이렇게 직접 입력.

 

 

데이터베이스를 통해 입력이 제대로 되었는지 확인

 

 

 

 

 

 

memo를 확인해보면 입력된 값이 저장되어 있는것을 확인할 수 있다

그렇다면 막을 방법이 없는것인가?

그렇지 않다. 문자열을 나타내는 "" 를 막는 방법을 사용하면 된다.

 

 

 

 

 

 

745번의 magic_quotes_gpc=Off 에서 On으로 변경.

문자열을 나타내는 따옴표들 앞에 슬래시를 붙여서 실행되지 않도록 설정하는 것이다

alert(" ")  안에 따옴표들을 다 막아버리기 때문에 문자열을 입력할 수 없게 된다

 

반응형