비트(bit)주세요

XSS(Cross Side Scripting) 본문

정보보안/웹보안

XSS(Cross Side Scripting)

yglee730 2021. 6. 11. 21:27
728x90

XSS(Cross Side Scripting)

        :웹 애플리케이션에서 일어나는 취약점으로 관리자가 아닌

        권한이 없는 사용자가 웹 사이트에 스크립트를 삽입하는 공격 기법

 

간단한 소스코드로 설명하자면

 

클라이언트 측 소스코드

<!DOVTYPE html>
<html>
	<head>
		<style>
			.test{
				text-align:center;
			}
		</style>
	<head>
	<body>
		<div class="test">
			<h2>XSS Test</h2>
			<form method="GET" action="xssEx.php">
				<input type="text" name="xss">
				<input type="submit" value="submit">
			</form>
		</div>
	</body>
</html>

 

 

서버 측 소스코드

<?php

	echo $_GET['xss'];

?>

가 있다고 가정합시다.

 

이 코드는

① 클라이언트에서 문자열을 입력하고

② 서버에 전송하면

③ 서버가 그 문자열을 받아서

④ 그대로 출력하는 코드입니다.

 

 

 

 

클라이언트에서 hello~를 입력하고 서버에 전송했더니

서버가 문자열을 받아서 브라우저에 hello~라고 출력했습니다.

 

일반 문자열이 아니라 스크립트를 전송한다면?

 

<script>alert('hello~');</script>

 

서버가 클라이언트로부터 스크립트를 입력받으니 스크립트로 출력했습니다.

 

 

서버의 입장으로 가보면

<?php

	echo $_GET['xss'];

?>
<?php

	echo <script>alert('hello~');</script>;

?>

출력을 해야하는데 그 출력문이 자바스크립트입니다.

그래서 서버는 어쩔 수 없이 자바스크립트로 출력해야 합니다.

그래서 브라우저에 hello~라는 알림창이 뜨게 한 것입니다.

 

 

 

그래서 이 취약점이 왜 문제인건데? 

 

쿠키로 예를 들어보겠습니다.

쿠키는 브라우저에 저장되는 정보입니다.

쿠키는 사용자의 접속 정보를 저장합니다.

쿠키는 로컬에 저장되는데, 서버와 통신을 할 때 사용자를 증명해주는 역할을 합니다.

 

그래서 

  • ID 저장, 로그인 상태 유지
  • N일간 다시 보지 않기
  • 최근 검색한 상품들을 광고에서 추천
  • 쇼핑몰 장바구니 기능 

같은 것들이 쿠키로 구현이 가능합니다.

 

하지만 사용자의 정보를 저장해주는 이 쿠키가 다른사람에게 넘어간다면?

이 정보들이 뺏긴다면?

 

그 뒤는 상상에 맡길게요.

 

이 XSS 공격은 크게 2가지로 나뉩니다.

Stored XSS, Reflected XSS

 

1. Stored XSS

가장 일반적인 XSS 유형으로, 스크립트를 서버에 저장시킵니다.

게시판이나 자료실같이 사용자가 글을 저장하는 부분에 스크립트 코드를 입력합니다.

그러면 다른 사용자가 게시물을 열람하는 순간 공격자가 입력해둔 악성 스크립트가 실행됩니다.

과정은 다음과 같습니다.

2. Reflected XSS

Reflected XSS는 스크립트를 저장하는 것이 아니라, URL의 변수 부분처럼 스크립트 코드를

입력하는 동시에 결과가 바로 전해지는 공격기법 입니다.

과정은 다음과 같습니다.

 

둘의 차이점을 정리하자면

Stored XSS Reflected XSS
 자동 공격
 성공이 쉬움
   구현은 어려움
수동 공격
성공이 어려움
 구현은 쉬움

이 됩니다.

 

 

XSS는 <script></script>말고도 여러가지 방법으로 시도해 볼 수 있습니다.

1. <meta>

    - meta 태그가 지시하는 url로 이동하며, content=0은 즉시 이동을 의미합니다.

<meta http-equiv="refresh" content="0;url=https://www.naver.com\">

 

 

 

 

2. <iframe>

    - 문서 내에 삽입할 로컬 및 원격지 페이지를 호출합니다.

<iframe width="600" height="300" src="http://daum.net" name="test" id="test" 
frameborder="1" scrolling="yes" align="left">이 브라우저는 iframe을 지원하지 않습니다</iframe>

연결을 거부당해서 페이지를 제 서버의 또 다른 페이지로 수정하고 다시 시도했습니다.

3. <img>

   - 이미지를 삽입하는 태그이지만 그 이미지가 없어서 에러가 나면?

<img src="hahaha" onerror="location.href=('https://www.naver.com');">

 

이 외에도 

<object>

<applet>

<embed>

<form>

같은 것들이 존재합니다.

 

 

 

XSS 취약점 대응책?

  - 사용자의 입력값을 검증합니다.
  - <, > 같은 특수문자들을 필터링합니다.
  - script, img 같은 특정 태그 이름을 필터링하는 방법도 존재합니다.

 

 

'정보보안 > 웹보안' 카테고리의 다른 글

Blind SQL Injection  (0) 2021.06.04
SQL Injection  (0) 2021.06.03
SQL Injection을 위한 SQL  (0) 2021.06.02
Web Shell  (0) 2021.05.27
netcat과 포트포워딩  (0) 2021.05.23