홈페이지 취약점 분석 이야기 | 파일 지도 사진 깨알 |
---|
>> 목록보이기 DVWA: Stored XSS (low, medium, high level) 공략DVWA(Damn Vulnerable Web Application) 1.9 훈련장 라이브 ISO는 다음에서 다운로드 받을 수 있다. DVWA 1.9 훈련장 라이브 ISO를 구동하는 방법은 다음 문서에서 볼 수 있다.
여기서는 구동 후 DVWA 훈련장의 주소가
XSS 취약점은 사용자의 입력을 HTML에 출력하는 부분에서 발생한다.
HTML을 제대로 검증하지 않으면 공격자는 자신이 원하는 자바스크립트를 삽입할 수 있다.
기본적으로 자바스크립트 삽입이 가능한 지 점검하는 방법은
HTML 삽입 취약점 탐지방법 문서에서 살펴볼 수 있다.
Vulnerability: Stored Cross Site Scripting (XSS) 실습문제는 방명록(Guestbook)이다.
사용자가 이름( Vulnerability: 저장형 XSS (low level) 실습 설명
Vulnerability: Stored Cross Site Scripting (XSS) low level에서는 사용자의 입력인
// Get input $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input $message = stripslashes( $message ); $message = mysql_real_escape_string( $message ); // Sanitize name input $name = mysql_real_escape_string( $name ); // Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
위에서 사용한
DVWA 저정향 XSS의 방명록 입력에는 제한이 있다.
Name * <input name="txtName" type="text" size="30" maxlength="10">
이렇게 HTML을 이용하여 입력을 제한하는 방법은 HTML을 수정하여 풀 수 있다.
가장 간단한 방법은 Firefox 웹브라우저의
위와 같이
이제부터 Vulnerability: Stored Cross Site Scripting (XSS) 훈련장에 접속하면 항상 두 경고창을 만나게 된다. 서버(실제로는 MySQL 데이터베이스)에 사용자의 공격 스크립트가 저장된 것이다. 이렇게 공격 결과가 서버에 남게 되는 HTML 삽입 공격을 "저장형 XSS"라고 한다.
저장형 XSS가 가능하면 다양한 공격이 가능하다.
접속하는 모든 사용자의 세션을 탈취할 수도 있다.
Vulnerability: Stored Cross Site Scripting (XSS) 실습문제는 관리자만 접속할 수 있으므로
여기서는 홈페이지 위변조 공격을 시도해 보자. 실제 침해사고 사례는 저장형 XSS를 이용한 홈페이지 위변조 사례 문서에서 볼 수 있다.
파이어폭스의
그 결과는 위의 그림과 같다.
URL은 Vulnerability: Stored Cross Site Scripting (XSS)
실습문제( Vulnerability: 저장형 XSS (medium level) 실습 설명Medium level의 PHP 소스 코드를 살펴보자. // Get input $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input $message = strip_tags( addslashes( $message ) ); $message = mysql_real_escape_string( $message ); $message = htmlspecialchars( $message ); // Sanitize name input $name = str_replace( '<script>', '', $name ); $name = mysql_real_escape_string( $name ); // Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
Low level에서와 동일한 문자열을 입력해보자.
이 때 Firefox의
Name 입력에 취약점이 있으면 쿠키를 확인하는 경고창이, Message 입력에 취약점이 있으면 'SVG_image' 경고창이 뜰 것이다.
방명록의 결과를 보면 위와 같이 쿠키 값이 <div id="guestbook_comments">Name: Name 입력에서는 HTML이 그대로 출력되고 Message 입력에서는 HTML이 완전히 제거된 것을 볼 수 있다. Vulnerability: 저장형 XSS (high level) 실습 설명High level에서의 HTML 삽입 방어기작을 살펴보자. 관련 PHP 소스는 다음과 같다. // Get input $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input $message = strip_tags( addslashes( $message ) ); $message = mysql_real_escape_string( $message ); $message = htmlspecialchars( $message ); // Sanitize name input $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name ); $name = mysql_real_escape_string( $name ); // Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
방어기작은 medium level과 거의 동일하다.
다만 Name 입력에 대해서는 Medium level과 동일하게 시험해보면 결과도 동일하다. 증빙화면은 생략하였다. <div id="guestbook_comments">Name: 서버가 응답하는 HTML 소스도 medium level과 동일하다. Vulnerability: 저장형 XSS (impossible level) 실습 설명이제 HTML삽입이 불가능한 impossible level의 PHP 소스코드를 살펴보자. // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Get input $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input $message = stripslashes( $message ); $message = mysql_real_escape_string( $message ); $message = htmlspecialchars( $message ); // Sanitize name input $name = stripslashes( $name ); $name = mysql_real_escape_string( $name ); $name = htmlspecialchars( $name ); // Update database $data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );
Name 입력과 Message 입력 모두에 대해서
Medium level에서와 동일한 시험을 하면 결과는 위와 같다. 부등호, 앰퍼샌드 등이 모두 변환되면서 HTML 삽입이 차단되는 것을 볼 수 있다. 서버가 응답하는 HTML 소스는 다음과 같다. <div id="guestbook_comments">Name:
서버의 DB에 저장될 때 마무리거의 모든 웹취약점이 그렇듯이 "HTML 삽입을 통한 자바스크립트 공격"(Cross-site Scripting)은 서버가 입력값을 제대로 검증하지 않을 때 발생한다. 특히 저장형 XSS의 경우에는 불특정 다수를 대상으로 하는 지속적인 공격뿐만 아니라 특정 소수 대상의 표적 공격이 가능하고, 반사형 XSS에 비해서 다양한 방법의 공격을 동원할 수 있으므로 매우 위험하다.
PHP의 경우에는 서버가 HTML에서 출력하는 모든 입력에 대해서
[처음 작성한 날: 2017.01.01] [마지막으로 고친 날: 2017.01.01] < 이전 글 : DVWA Reflected Cross Site Scripting (XSS) 실습 설명서 (2016.12.27) > 다음 글 : SVG 이미지의 ECMAscript를 이용한 악성코드 배포 (2016.12.01) 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다. 잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다. 문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문 |