Stored XSS란 무엇인가?
Stored XSS는 사용자의 입력 값을 전달 받아 서버 데이터베이스에 저장한 후 해당 저장 값을 불러와 동적 페이지를 구성할 때 발생하는 취약점이다. 보통 게시글이나, 댓글 기능에서 발견된다.
- Stored XSS 가 다른 XSS와의 차이는 악성 스크립트가 담긴 URL을 직접 전달하지 않아도 된다는 것이다. 공격자는 악성 스크립트를 게시글 저장과 같은 기능을 이용하여, 서버 데이터베이스에 저장한 후 희생자가 해당 페이지에 접근하면 웹 서버 데이터베이스에서 정보를 가져와 동적 페이지를 구성하며, 이 과정에서 스크립트가 실행된다.
💡 Stored XSS의 경우 게시판으로 예를 들어, 글쓰기 기능과 수정기능에 대한 내부 소스코드가 서로 상이하기에, 모든 기능에 대해 테스트 해봐야 하며, 또한 출력되는 구간에서 처리하는 로직이 서로 다른 경우가 존재하며, 출력되는 종료지점을 유심히 파악해야한다.
이러한 Stored XSS는 대응을 잘못 할 경우, 게시글 목록에서 XSS 를 방지할 수 있겠지만, 다른 표면에서 해당 게시글 제목등을 볼 수 있게 된다면, XSS는 여전히 데이터베이스에서 남아 잠재적인 위험이 존재한다. 뭐든 입력값은 전위 처리 방식을 통해 검증해야한다.
Detection
주로 게시판 과 댓글 기능에서 주로 발견되며, 취약점이 존재할 경우 다양한 구간에서 해당 스크립트가 발현된다.
[write 기능]
$title = $db_conn->real_escape_string($_POST["title"]);
$writer = $db_conn->real_escape_string($_SESSION["name"]);
$content = $db_conn->real_escape_string($_POST["content"]);
$query = "insert into {$tb_name}(title, id, writer, content, regdate) values('{$title}', '{$id}', '{$writer}', '{$content}', now())";
$db_conn->query($query);
게시판의 글 쓰기 기능의 로직이 위와같이 아무런 XSS에 대한 대응방안 없이 이루어져 있으며,
[read 기능]
$query = "select * from {$tb_name} where idx={$idx}";
$result = $db_conn->query($query);
해당 게시물을 보게 될 때에도 아무런 조치가 되어있지 않다.
즉 전위 처리 및 후위 처리등 아무런 조치가 되어있지 않아 해당 글 쓰기 로직에서는
Stored XSS 취약점이 발생할 수 있다.
제목, 내용 두 부분에서 발생하며, 제목에 스크립트 작성시 게시글 목록에서 스크립트가 실행되며,
내용에 작성시, 글 보기와 같은 기능을 사용하여 해당 게시물을 보게 될 경우 스크립트가 실행되게 된다.
이러한 게시물 관련해서 XSS 취약점은 잘 살펴봐야 하며, 글 쓰기에서 XSS 방지가 되어 있다 하더라도, 수정 기능에서 XSS 취약점이 발견될 수도 있다.
공격자가 입력한 악성 스크립트는 아래와 같이 삽입되게 된다.
[read 기능2]
$row = $result->fetch_assoc();
'''
'''
'''
<tr>
<th scope="row" width="20%" class="text-center">Contents</th>
<td><?=$row["content"]?></td>
</tr>
''''''''
<td><script>alert(1)</td>
'Web > Web Hacking Techniques' 카테고리의 다른 글
Deserialize_Vulnability for Python_Pickle (0) | 2025.05.06 |
---|---|
Cross-Site Script (XSS) (0) | 2025.05.02 |
Reflected XSS (0) | 2025.05.02 |
Dom-Based-XSS (0) | 2025.05.02 |
Content Security Policy(CSP) Bypass (0) | 2025.04.30 |