1

게시판 Reflected XSS 공격과 취약점 고치기 - 3

게시판 Reflected XSS 공격과 취약점 고치기 - 3

노아의 블로그

    목차
반응형

저번 시간에는 사용자 입력값이 스크립트 태그 안에 들어가지 않는 경우를 배웠습니다.
해커는 직접 스크립트 태그 혹은 모종의 태그를 써야지  해킹을 시도할 수가 있는데요.
이것을 htmlspecialchars 로 태그 등 각종 특수문자들을 html 엔티티,이스케이프 문자로 바꾸면서 막아보았죠
 
하지만 이것은 사용자 입력값이 스크립트 태그에 들어간다면 소용이 없습니다.
다른 방법으로 막아보도록 합시다.
 
1.문자열 체크
자바스크립트로 사용자가 입력한 문자열을 체크 해 봅시다..
 
이것을 필터링이라고 하는데요. 
필터링에는 블랙 리스트 기반,화이트 리스트 기반의 필터링이 있습니다.
블랙 리스트는 설정된 값을 못넘어가게 하는 필터링이고
화이트 리스트는 설정된 값만 넘어가게 하는 필터링 입니다.
 
설정된 값만 통과되니까
화이트 리스트가 블랙 리스트보다 보안 능력이 뛰어나죠.
 
우선 블랙 리스트 필터링을 해 봅시다.
 
list.php 하단의 출력 코드를 다시 스크립트 태그로 바꾸시구요

else{
	echo"<script>alert('no search results for $encoded_text'); </script>";
}

 

<!DOCTYPE html>
<head>
  
  <script>
  	
  </script>
</head>

<body>
	<form action="" method ="get" id=search_form onsubmit="return submitevent();"> 
		<input type="search" name = "search" id = "search">
		<input type="submit">
	</form>
	<script>
	function submitevent(){
		var search = document.getElementById("search").value;
		  if(search.includes("alert")){
		  alert("You cannot enter that character.");
		  return false;
		  
  		}
  		else{return true;}
	
	}
	
	</script>
	
	<?php
	if($search){$sql = "select * from board where title like '%$search%'";}
else{$sql = "select * from board";}


$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
        while($row = mysqli_fetch_assoc($result)) {
        echo "<a href='read.php?bno=" . $row['bno'] . "'>" . $row['title'] . "</a>";
        echo "<br>";
    }

}
else{
	echo"<script>alert('no search results for $encoded_text'); </script>";
}
?>

</body>

이러한 코드를 삽입합니다.
form 에 onsubmit이라는 속성을 넣었는데요 이것은 이벤트를 처리하는것입니다.
이벤트는 특정 조건.. 마우스 down(클릭), 마우스 up , 마우스가 위에 있을 때 , 키보드 입력 , 등등 입니다.
이러한 이벤트가 발생될 때 실행되는 함수가  
이벤트 핸들러입니다.
 
return submitevent();
즉 submitevent 이벤트 핸들러 함수를 실행한 리턴값을 받고 있습니다.
 
 

검색창

 
 
함수는 이 검색창의 입력란의 값을 가지고와서 블랙리스트에 있는 alert가 있으면 경고창을 띄우고 false를 리턴합니다.
아니면 true를 리턴합니다. 리턴값에 따라서 검색 여부가 결정됩니다.
 
직접 해 봅시다.
 

블랙리스트에 적혀있는 alert를 입력했더니 통과를 하지 못하고 
경고창이 날라옵니다.
 
그렇다면 다 해결된건가요??
 
절대....아닙니다.
front는 모든것이 오픈되있습니다.
 
해커는 이제 페이지 소스코드를 봅니다.
 
(f12를 누르면 페이지의 코드를 볼 수 있습니다.)
 

이렇게 어떻게 필터링되는지 원리가 다 나옵니다.
 
취약점 : 
1. 블랙리스트 자체가 보이니까 리스트에 없는 공격을 하면 된다.
2.검증을 검색창 안에 입력된 문자만 검증하고있다.
3.응답 위조
 
1번은 생략하고
2번의 뜻은 무엇이냐.
 

검색창

이 검색창에 있는 문자만 검증을 한다는 것 입니다.
 
GET 방식의 파라미터는 어떻게 이동했죠?
url을 통해서 보내졌죠. 즉 url 안에 파라미터는 전혀 검증을 하고있지 않다는 소리입니다.
 
다시 한번 공격을 해 봅시다.
 

역시 정상적으로 스크립트가 실행이 됩니다.

3번 응답 위조 또한 프론트를 변경하는것이라서.. 그냥 프론트에서 검증하는것은 매우 위험합니다.
 
 
 
즉 사용자 요청을 먼저 백(php) 에서 검증해서 처리 한 후, 프론트를 구성하는 방법이 좋습니다.

반응형