💡 XSS 공격에 사용할만한 태그와 문자를 변환시켜준다.
Character | Replacement |
---|---|
&(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
아래는 취약한 코드이다.
<!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를 탈취할 수도 있다.
많은 XSS 취약점을 배우고 익히면서 다양한 방법을 공부, 연구해야한다.