XSS 취약점 분석 - htmlspecialchars()

chwrld·2023년 9월 15일
0

misc

목록 보기
4/4

🐸 PHP htmlspecialchars()

💡 XSS 공격에 사용할만한 태그와 문자를 변환시켜준다.

CharacterReplacement
&(ampersand)& amp;
" (double quote) & quot;unless ENT_NOQUOTES is set
' (single quote) & #039;(for ENT_HTML401) or & apos; (for ENT_XML1, ENT_XHTML or ENT_HTML5), but only when ENT_QUOTES is set
< (less than)& lt;
> (greater than)& gt;

src -> https://www.php.net/manual/en/function.htmlspecialchars.php

하지만 htmlspecialchars() 함수를 잘못된 방법으로 사용하면 여전히 XSS 공격에 취약하다.

아래는 취약한 코드이다.

💣 Vulnerable Code

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<form>
    <input type="text" name="comment">
    <input type="submit" value="댓글추가">
    <input type="submit" name="reset" value="댓글 초기화">
</form>

<?php
    session_start();
    
    //세션 설정이 안 돼있으면 세션 초기화 
    if(!isset($_SESSION['comment'])) {
        $_SESSION['comment'] = [];
    }

    // reset 버튼을 누르면 초기화
    if(isset($_GET['reset'])) {
        $_SESSION['comment'] = [];
        exit(); // reset 버튼을 누르면 문자열 검사 없이 종료
    }

    // 댓글 추가 버튼을 누르면 공백 제거 후 추가
    // 댓글에 공백이 없으면 xss필터 후 저장
    if(isset($_GET['comment'])) {
        $comment = trim($_GET['comment']);
        if(strlen($comment)!=0) 
            $_SESSION['comment'][] = htmlspecialchars($comment);
        else {
            echo "<script>alert('댓글을 입력하세요')</script>";
        }
    }

    // 세션값을 모두 출력
    foreach($_SESSION['comment'] as $c){
        // echo $c .'<br/>';
        // echo "<embed src='" .htmlspecialchars($comment). "'></object><br>";
        echo '<object data="'.htmlspecialchars($comment).'"></object><br>';
        // <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object><br>

    }
?>

</body>
</html>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object><br>

오브젝트 데이터에 base64로 인코딩된 <script> 태그를 넣으면 그대로 실행되는 것을 확인할 수 있다.
<embed> 태그도 마찬가지로 보안에 취약하게 사용하게 되면 그대로 취약점이 노출된다.
직접 실행해본 결과 alert를 띄울 수 있었고 다른 파일에 접근할 수도 있었다.
만약 file upload 취약점과 연계한다면 악성 스크립트를 업로드해 세션 ID를 탈취할 수도 있다.

💬 Comment

많은 XSS 취약점을 배우고 익히면서 다양한 방법을 공부, 연구해야한다.

Ref.
https://blog.oneandonlyme.xyz/126

profile
BoB 13th 최강포린이👮

0개의 댓글