본문 바로가기
보안

XSS

by frontChoi 2024. 7. 26.
반응형

🤸‍♂️ XSS

XSS(Cross Site Scripting)공격으로 웹사이트에서 Script를 심어서, 공격하는 방식(URL에 스크립트를 넣는 방식)을 말한다.

XSS(Cross Site Scripting)는 3가지가 있다.

  • Reflected XSS
  • Stored XSS
  • DOM-based XSS

 

🤺  Reflected XSS

보통 스크립트가 포함된 링크를 클릭하게 하여 공격자가 원하는 사이트(피싱사이트 등)에 접근하게 하거나 세션 값을 유출 시키는 행위를 한다.

 

시나리오

1. GET으로 전송시, script으로 코드로 돌아가는지 확인
2. script가 포함된 URL을 변환
   1) bitly.com 사이트에서 주소 변환

 

reflectedXssAttack.php

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>reflectedXssAttack</title>
    <link rel="stylesheet" href="./styles/reset.css">
</head>
<body>
    <form action="/get.php" method="GET">
        <p>
            <label for="name">이름 : </label>
            <input id="name" name="name" type="text">
        </p>
        <p>
            <label for="password">비밀번호 : </label>
            <input id="password" name="password" type="text">
        </p>
        <p>
        <div>
            <label for="contents">내용</label>
            </div>
            <textarea name="contents" name="contents" id="contents"></textarea>
        </p>
        <input type="submit">
    </form>
</body>
</html>

get.php

<?php
 $name = $_GET['name'];
 $contents = $_GET['contents'];
 echo $name.'<br/>';
 echo $contents
?>

 

스크립트 부분 전송

http://localhost:8000/get.php?name=fdsf&password=fsdfsdf&contents=<script>alert(1)</script>

으로 호출할경우 alert 창이 뜨는 것을 알수있다.

예방 방법

php에서는 htmlspecialchars를 이용하여 특수문자 변환이 가능하다

<?php
 $contents = $_GET['contents'];
 echo htmlspecialchars($contents)
?>

⛸  Stored XSS

취약점이 있는 웹 서버에 악성 스크립트를 저장하는 공격 방법입니다.
공격자는 악성 스크립트가 포함된 게시글을 작성하여 게시판 등 사용자가 접근할 수 있는 페이지에 업로드 합니다.
이후 사용자가 해당 게시글을 요청하면 서버에 저장된 악성 스크립트가 사용자 측에서 동작하게 됩니다.

 

게시물 리스트 php

<?php
    $board_list = array(
        array(
            "id" => 1,
            "title" => "제목1",
            "contents" => "제목1"
        ),
        array(
            "id" => 2,
            "title" => "제목2",
            "contents" => "제목2"
        ),
        array(
            "id" => 3,
            "title" => "제목3",
            "contents" => "<script>alert('1')</script>"
        )
    );
?>

 

리스트 보여주는 화면

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>LIST</title>
    <link rel="stylesheet" href="./styles/reset.css">
    <link rel="stylesheet" href="/styles/common.css">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
<body>
    <?php
        include('boardlist.php');

        echo '<table class="table">
                <thead>
                    <tr>
                    <th scope="col">ID</th>
                    <th scope="col">제목</th>
                    </tr>
                </thead>
                <tbody>';
                    foreach($board_list as $key => $subArray){
                        echo '<tr>'.
                            '<td>'.$subArray['id'].'</td>'.
                            '<td><a href=/listDetail.php?id='.$subArray['id'].' class="title"> '.$subArray['title'].'</a></td>'
                        .'</tr>';
                    }
        echo "</tbody>
        </table>";
    ?>
</body>
</html>

 

리스트 상세 화면

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>BOARD ITEM</title>
    <link rel="stylesheet" href="./styles/reset.css">
    <link rel="stylesheet" href="/styles/common.css">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
<body>
    <div class="container">

        <?php
            include('boardlist.php');
            $id = $_GET["id"];
            echo '<h1>'.$board_list[$id-1]['title'].'</h1>';
            echo '<p>'.$board_list[$id-1]['contents'].'</p>';
        ?>
    </div>
</body>
</html>

상세로 이동할 경우 boardList에서 3번째 게시물에 내용에 스크립트가 존재했는데, 게시물 클릭시 심어있던 script가 동작한다.

 

🛹   DOM-based XSS

 DOM 객체를 이용하여 악성스크립트를 심는것.

 

domxss.php

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>DOM XSS</title>
	<link rel="stylesheet" href="/styles/reset.css">
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
<body>
	 <div id="tag"></div>
	 <script>
		const value = location.hash.slice(1);
		const tagEle = document.querySelector('#tag');
		tagEle.innerHTML = decodeURIComponent(value);
	 </script>
</body>
</html>

 

http://localhost:8000/domxss.php#<img src='valid.png' onerror='alert(1)'/> 으로 호출할 경우 존재하지 않는 이미지이면서 alert을 수행한다.

 

 

 

후기

사용해본 결과 웹프론트에서는 HTML을 넣는 방식은 주의할 필요가 있다.

반응형

댓글