[난이도-low]

Quest. 다음 화면과 같이 경고창을 띄워봅시다.

  경고창을 띄우기 위해 script태그를 이용하여 success라는 문구를 띄울 수 있도록 <script>alert("success")</script>라고 작성해주었다.

<입력>

<script>alert("success")</script>

그랬더니 이와같이 경고창이 떴다.

 

 

Quest. 사용자의 쿠키 값을 경고창에 띄워봅시다.

Hint1. 사용자의 쿠키값은 document.cookie에 저장되어 있습니다.

지난주 실습처럼 script태그 내에 document.cookie를 입력해주었다.

 

<입력>

<script>alert(document.cookie)</script>

 

위와 같이 입력해 주었더니 아까 떴던 success 경고창이 먼저 뜬 후에 쿠키값이 경고창에 뜬 것을 확인할 수 있었다. 

 

 

Quest. (게시판에 등록된 내용을 삭제하지 않았다면) XSS 공격을 시도할 때마다 경고창이 여러 개가 뜨는 것을 확인했습니다. 왜 그럴까요? 이유를 작성해주세요.

Hint1. Stored XSS 방식에 대해 잘 생각해봅시다.
Hint2. 소스코드를 확인해봅시다. 테이블에 어떻게 저장되어 있나요?
Reflected 방식 Stored 방식
- URL, URL파라미터, Cookie 파라미터 등 사용자가 입력한 내용에 대해서 응답 페이지에 실행되는 취약점 - 공격자가 게시판등과 같은 부분에 악의적으로 스크립트를 삽입하고 저장하여 다른 사용자가 해당 게시글을 보거나, 리스트 확인시 악의적으로 삽입한 스크립트가 실행되는 취약점

  소스코드를 확인해보았더니 위에서 작성한 명령어들이 누적되어 저장되고 있었다. 그렇기 때문에 이전에 작성했던 경고창이 모두 나타나는 것이다.

 

[난이도-high]

Quest. 공격할 수 없습니다. 이유를 적어주세요.

Hint1. 특수 문자를 막는 함수가 있는 것 같습니다.
Hint2. xss_stored_1.php에서 확인할 수 있습니다.

  난이도 high는 low단계와 달리 태그들이 적용되어 출력되는 것이 아닌 문자열 그대로 출력되어 나오는 것을 확인할 수 있었다.

 

이 페이지에 소스코드를 통해 security_level이 2라는 점과 xss_stored_1.php파일을 이용한다는 점을 알 수 있었다.

그래서 해당 파일의 내용을 확인해보기로 하였다.

 

  먼저 security_level이 2이기 때문에 위 함수를 확인하여 문제점을 찾기로 하였다. 여기서는 sqli_check_3함수를 사용하였다. 하지만 이는 case 0, 1, 2 모두 사용되는 함수이기 때문에 이 함수로 인해 문제점이 나타나지는 않았을 것이라고 생각하였다.

 

그래서 다른 함수를 찾아보던 도중 아래와 같은 함수를 찾게되었다.

위 사진을 통해 security_level 2에서는 xss_check_3 함수를 이용하는 것을 확인할 수 있었다.

 

functions_external.php 파일에서 위 함수를 찾을 수 있었다. 

이 함수에서는 htmlspecialchars가 사용되기 때문에 공격이 불가하다.

Quest. GET방식과 POST방식의 차이에 대해 간단히 정리해봅시다.

GET방식 POST방식
: 서버에서 어떤 데이터를 가져와서 보여줄 때 사용
(글의 내용에 목록을 보여주거나 내용을 보는 경우)

- URL에 데이터를 포함시켜 요청한다. -> 보안에 취약

- 데이터를 헤더에 포함하여 전송한다.
- 캐싱할 수 있다.
: 서버상의 데이터 값이나 상태를 바꾸기 위해 사용
(글의 내용을 저장하고 수정하는 경우)

- URL에 데이터를 노출하지 않고 요청한다.

- 데이터를 바디에 포함하여 전송한다.
- 캐싱할 수 없다.

 

Quest. 다음 화면을 띄워보세요.

경고창을 누른 후 화면 (Welcome success 출력)

 

[난이도-low]
Hint1. GET방식에서 썼던 공격을 잘 생각해보세요.

 

Get 방식과 동일하게 입력해주었다.

 

<입력>

First name : <script>alert("XSS")</script>

Last name : success

 

 

그랬더니 위와 같은 결과가 나왔다.

 

burpsuite에서 firstname과 lastname에 각각 입력한 내용이 적혀있는 것을 확인할 수 있다.

 

 

 

Quest. 다음과 같이 사용자의 쿠키 값을 경고창에 출력해보세요.

 

[난이도-medium]
Hint1. 사용자의 쿠키 정보는 document.cookie에 저장되어 있습니다.
Hint2. alert함수에 사용자의 쿠키 정보를 알 수 있는 경로를 넣으면 될 것 같습니다.

  alert함수를 이용해 경고창에 쿠키 정보를 띄워야 하므로 alert함수 내 문자열에 document.cookie를 포함시켜야한다.

따라서 <script>alert(document.cookie)</script>를 입력하면 이에 해당하는 내용이 나타날 것이다.

 

<입력>

First name : <script>alert(document.cookie)</script>

Last name : success

 

 

이를 입력해주었더니 위와같은 결과가 나왔다.

 

burpsuite에서도 cookie값을 확인해볼 수 있다.

Quest. xss 취약점이 있는지 알아봅시다. 다음 화면을 띄워보세요.

경고창을 누른 후 화면 (Welcome success 출력)

 

 

[난이도-low]
Hint1. 스크립트 태그 안에 alert함수를 넣어 경고창을 띄울 수 있습니다.
Hint2. First name과 Last name에 각각 공격을 하면 어떤 결과가 나오는지 알아봅시다

 

먼저 First name에 abc, Last name에 123을 넣어보았더니 Welcome abc 123이 출력되었다.

 

hint 1을 참고해 경고창을 띄우기 위해 스크립트 태그 안에 alert함수를 넣어보기로 하였다. 

Welcome success를 출력시키기 위해 First name에는 스크립트 태그를 작성하고 Last name에는 success를 입력해 보았다.

 

< 입력 >

First name : <script>alert("XSS")</script>

Last name : success

 

이를 입력해주었더니 아래와 같은 결과가 나왔다.

 

[난이도-medium]
Hint1. xss 공격을 막는 함수가 있는 것 같습니다. 소스코드를 살펴봅시다.
Hint2. xss_check_4가 어떤 함수인지 알아봅시다.
Hint3. 함수 정보는 functions_external에 저장되어 있습니다.
Hint4. addslashes함수가 어떤 문자를 필터링하는지 알아봅시다.

 

  low단계와 동일하게 입력해보았지만 경고창은 뜨지 않았다. hint1처럼 xss 공격을 막는 함수가 있는 것 같다.

 

페이지 소스코드를 살펴보았다.

코드를 보면 alert(\"XSS\")라고 바뀐 것을 확인할 수 있다.

이 문제는 medium 단계이므로 security level이 1에 해당한다. 그리고 xss_get.php 파일을 이용하는 것을 볼 수 있다. 

 

/var/www/bWAPP 으로 이동해 xss_get.php파일을 열어주었다.

security_level이 1이므로 xss_check_4함수를 이용한다. 

 

xss_check_4 함수를 찾아보기 위해 functions_external.php를 열어보았다.

addslashes 함수
: 매개변수로 넘겨준 문자열 안에 single quote(') 혹은 double quote("), 백슬래쉬(\), NULL 바이트가 포함되어 있다면 해당 문자 앞에 역슬래시(\)를 추가해 주는 함수

addslashes함수를 통해 alert 내 문자열에 역슬래시가 추가되었음을 알 수 있다.

 

이를 우회하기 위해 따옴표가 아닌 /로 문자열을 감싸주어 입력해 보았다.

 

<입력>

First name : <script>alert(/XSS/)</script>

Last name : success

 

 

그랬더니 위와 같은 결과가 나왔다.

 

 

[난이도-high]

필터링을 우회해서 공격해보세요. 그러나 공격이 통하지 않습니다. 그 이유를 정리해주세요.

Hint1. xss_check_3 함수를 살펴봅시다.
Hint2. htmlspecialchars함수가 원인인 것 같습니다. 어떤 함수인지 알아봅시다.

medium 페이지 소스코드에서 볼 수 있듯이 난이도 high는 security_level 2에 해당된다. 

case 2를 보면 xss_check_3 함수를 사용한다. 

 

이 함수에서는 htmlspecialchars함수를 이용한다. 이 함수는 data로 받은 문자열을 UTF-8로 반환하는데 ", ' 둘 다 변환되기 때문에 문제를 풀 수 없다.

 

6주차의 내용은 아래 링크를 참고

https://jini00.tistory.com/141

 

https://github.com/jini-coding/ott_review_project

 

GitHub - jini-coding/ott_review_project: SISS 2022 겨울방학 웹프로젝트 - OTT별 콘텐츠 리뷰 홈페이지 제작

SISS 2022 겨울방학 웹프로젝트 - OTT별 콘텐츠 리뷰 홈페이지 제작. Contribute to jini-coding/ott_review_project development by creating an account on GitHub.

github.com

 

DB 수정

  원래 Table을 두개로 나누어 나중에 JOIN하는 방식으로 구성하려했다. 하지만 게시판을 만들면서 데이터들을 정리하기 않음을 느껴 처음에 제작했던 DB 방식으로 다시 수정하였다.

 

  아래 사진은 해당 table(contentsreview)의 형태이다.

 

DB에 값 넣기

- process_create.php

<?php
$conn=mysqli_connect("localhost", "root", "비밀번호", "contents_review");
var_dump($_POST);
$sql="
  INSERT INTO contentsreview
    (title, ott, category, score, comments, created)
    Value(
      '{$_POST['title']}',
      '{$_POST['ott']}',
      '{$_POST['category']}',
      '{$_POST['score']}',
      '{$_POST['comments']}',
      NOW()
      )";
$result=mysqli_query($conn, $sql);
if($result===false){
  echo '저장하는 과정에서 문제가 발생하였습니다.';
  error_log(mysqli_effor($conn));
}
else{
  echo '저장에 성공했습니다. <a href="index.php">돌아가기</a>';
}

?>

  먼저 DB와 연동을 시켜주었다. 저번주와 다르게 DB를 다시 수정하면서 table을 하나로 통일했기 때문에 위의 코드가 잘 작동되었다.

 

각 ott별 후기 작성 게시판

이런식으로 페이지에 내용을 입력해주고 작성 버튼을 눌러준다.

위 후기들은 네이버 블로그 등을 통해 발췌한 후기들이다.

 

작성 버튼을 눌러주면 위와 같은 페이지가 뜨고 DB에 저장된다.

 

이를 DB를 통해 확인해보면 아래와 같이 잘 저장되었다는 것을 확인할 수 있다.

 

아래에 설명할 BOARD 게시판을 통해서도 확인할 수 있다.

 

- 삭제 기능 추가

<?php 
   $conn = mysqli_connect('localhost','root','1111','CONTENTS_REVIEW');

   $sql = " DELETE FROM  WHERE  = {}";

   $result = mysqli_query($conn, $sql);


 ?>
 <script type="text/javascript">alert("삭제되었습니다.");</script>
 <meta http-equiv="refresh" content="- url=/경로">

  contents_review DB와 연결시킨 뒤 sql 변수에 데이터를 삭제하는 쿼리문을 지정해주었다.
글이 정상적으로 삭제되었음을 알리기 위해 js를 이용해서 alert 창이 뜨도록 하고 페이지를 refresh 시켜 원래의 게시판 페이지로 돌아가도록 했다.
  여기서 php구문 안에 if-else문을 넣어서 삭제 실패/성공에 대한 메세지를 띄워도 되는데, 이럴 경우 아예 다른 페이지로 넘어가야하거나 깔끔하게 원래 페이지로 돌아올 방법이 마땅치 않아서 위의 코드의 방식을 적용했다.
(하지만 추후에 수정될 수 있음)

 

Board 게시판 제작

- Board.php

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <style>
    li{
      text-align: left;
      padding: 10px;
      color :black;
      font-size: 20px;
      font-family : sans-serif;
    }
    h2{
      text-align: center;
      padding: 35px;
      color :#A50000;
      font-size: 5em;
      font-family : sans-serif;
    }
    body{
      background-color:#FFD8D8;
      height : 4000px;
    }
  </style>
  <title>board</title>
</head>
<body>
<h2> BOARD </h2>
    <?php
      $conn=mysqli_connect("localhost", "root", "비밀번호", "contents_review");
      $sql2=" SELECT * FROM contentsreview";
      $result=mysqli_query($conn, $sql2);
      $list=' ';
      while($row=mysqli_fetch_array($result)){
        if($row['ott']=='netflix'){
          $row['ott']='NETFLIX';
        }
        if($row['ott']=='tving'){
          $row['ott']='TVING';
        }
        if($row['ott']=='watcha'){
          $row['ott']='WATCHA';
        }
        if($row['ott']=='disney+'){
          $row['ott']='DISNEY+';
        }
        $list = $list."<li>{$row['ott']} - {$row['title']}(별점 : {$row['score']}) : {$row['comments']}";
      }
      echo $list;
      mysqli_close($conn);
    ?>


</body>
</html>

  먼저 DB와 연결을 시켜주었다. $sql2에 SELECT문을 넣어 contentsreview 테이블을 가지고 올 수 있도록 하였다. $row에 mysqli_fetch_array함수를 이용하여 DB의 값을 받아왔다. 여기서 if문을 이용해 $row['ott']의 출력형태를 모두 대문자로 바꿔주었다. 그리고 $list에 li태그를 이용해 ott, title, score, comments를 저장해주었으며 이를 마지막에 echo하도록 하여 출력해주었다.

 

  아래 사진은 임의로 DB에 저장한 데이터들이 출력된 모습이다. 아직 페이지를 꾸미지는 않았기에 다음주에 더 보완하고자 한다.

 

 

+ Recent posts