이번 실습에서는 DVWA 환경에서 저장형 XSS(Stored Cross Site Scripting) 취약점을 직접 실습해보았다. 저장형 XSS는 공격자가 입력한 악성 스크립트가 서버에 저장되고, 그 이후 페이지를 방문한 사용자에게 자동으로 실행되는 심각한 보안 취약점이다.
1. Low 보안 레벨
if( isset( $_POST[ 'btnSign' ] ) ) {
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
$message = stripslashes( $message );
$message = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message);
$name = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name);
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query );
}
취약 코드 분석
- stripslashes()로 이스케이프 문자를 제거한 뒤 mysqli_real_escape_string()으로 SQL 인젝션만을 방지하고 있다.
- 하지만, 스크립트 실행 방지를 위한 htmlspecialchars()나 strip_tags() 처리는 누락되어 있다.
- 이로 인해서 <script> 태그가 그대로 DB에 저장되고, 페이지 렌더링 시 실행된다. => 저장형 XSS 발생함.
공격
=> 게시글을 작성하고 해당 페이지를 방문하면 alert 팝업창에 session ID가 뜨는 것을 확인할 수 있다.
2. Medium 보안 레벨
$message = strip_tags( addslashes( $message ) );
$message = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message);
$message = htmlspecialchars( $message );
$name = str_replace( '<script>', '', $name );
$name = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name);
취약 코드 분석
- strip_tags()와 htmlspecialchars()를 통해 HTML과 스크립트 태그 대부분은 필터링 된다.
- 하지만 여전히 필터 우회를 통해서 XSS가 가능하다.
공격
<Script>alert(123456)</script>
hello
3. High 보안 레벨
High 보안 레벨에서는 대부분의 입력 필터링이 철저하여서 일반적인 stored XSS는 성공하지 못한다.
하지만 이미지 태그의 onerror 이벤트를 이용하여 alert 팝업을 띄우는데 성공하였다.
<img src/onerror=alert(10)>
또한 위의 사이트의 다양한 우회 페이로드를 참고하여 사용해보았다.
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
Cross-Site Scripting (XSS) Cheat Sheet - 2025 Edition | Web Security Academy
Interactive cross-site scripting (XSS) cheat sheet for 2025, brought to you by PortSwigger. Actively maintained, and regularly updated with new vectors.
portswigger.net
우회 페이로드 활용 (iframe 삽입)
<iframe src="https://xxxxxxx.com/DVWA/netflix"></iframe>
=> 외부 사이트를 프레임 내에 삽입하여 피싱을 유도하거나 클릭 재킹을 시도할 수 있다.
4. 배운 점
- 입력값 검증은 HTML과 JS 태그만 제거한다고 끝나지 않는다.
- htmlspecialchars() 같은 함수 외에도 화이트리스트 기반의 필터링이나 CSP(Content Security Policy) 적용 등의 추가적인 보안 조치가 필요하다.
- Stored XSS는 단순 테스트를 넘어서, 피해자가 해당 사이트에 방문하기만 해도 공격자가 설정한 스크립트가 자동 실행된다는 점에서 매우 위험하다는 것을 알 수 있었다.
이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.
모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.
'웹 해킹 & 보안' 카테고리의 다른 글
[웹 모의해킹] CSP Bypass - 콘텐츠 보안 정책 우회 실습 (1) | 2025.07.03 |
---|---|
[웹 모의해킹] XSS - Reflected (반사형) 크로스사이트스크립팅 실습 (2) | 2025.06.08 |
[웹 모의해킹] XSS - DOM 기반 크로스사이트스크립팅 실습 (1) | 2025.06.08 |
[웹 모의해킹] Weak Session ID 취약점 실습 (0) | 2025.06.08 |
[웹 모의해킹] Blind SQL Injection 실습 - Low / Medium / High (2) | 2025.06.05 |