본문 바로가기

Web/DVWA

DVWA Dom based Cross Site Scripting (XSS) medium level

 사전 지식  

XSS(Cross Site Scripting)


취약한 웹 사이트(게시판, 웹 메일 등)에 악성 스크립트 코드를 삽입하여 개발자가 고려하지 않은 기능을 작동하게 하는 공격을 말한다. OWASP TOP 10에 올라가 있는 공격으로 큰 위험요소 중 하나이다.
웹 언어 중 하나인 CSS와 약자가 같아 XSS라고 되었다.

Dom based XSS


피해자의 브라우저에서 DOM 환경을 수정하여 클라이언트 측 코드가 예상치 못한 방식으로 공격 구문이 실행되는 것을 공격 방법을 말한다. 페이지 자체는 변하지 않지만, 페이지에 포함된 브라우저 측 코드가 DOM 환경에서 악성 코드로 실행된다. 즉, DOM Based XSS는 서버까지 가지 않고 브라우저에서만 발생한다.

 

실습 


소스 코드에서 파란 박스 부분을 보면 stripos 함수로 ‘<script’ 문구를 필터링 해주어 거짓이 아니면 영어로 값을 설정해주게 되어있다. 필터링 문구를 적게 되면 0이 나올 수 없기때문에 스크립트 태그를 우회해서 사용할 수 없다.

 

< stripos 함수 >

대상 문자열을 앞에서 부터 검색하여 찾고자 하는 문자열이 몇 번째 위치에 있는지를
리턴하는 함수로 대소문자를 구별하지 않는다.

즉, <script의 문자열이 들어있으면 위치를 리턴해주기 때문에 숫자가 들어가므로 true가 된다. 거짓이 아니기 때문에 if문 두 번째 줄이 실행되어 디폴트값으로 <script가 들어간 문자열이 아닌 default로 English가 들어간 URL로 변경이 된다.

 

<script를 넣어보았다.

👇

해당 사진처럼 URL이 변경됨

stripos 필터링 함수는 <script> 태그만 필터링 해주었기 때문에 다른 태그를 이용해 공격이 가능하다.
</select><img src=“” onerror=alert(document.cookie)>
 하여 img 태그를 통해 공격을 시도하면 된다.

공격을 시도했더니 값이 성공적으로 뜨는 것을 볼 수 있다.

이미지 태그 앞에 </select>를 써주는 이유는 select 문을 닫고 빠져나와야 해당 태그 밖에서 이미지 태그를 성공적으로 실행할 수 있기 때문이다. 실행 후 코드를 보니 select 태그가 닫히고 그 뒤에 이미지 태그가 쓰여있는 것을 볼 수 있다.

공격 성공!


 보안 방안 

  • 외부 입력값이나 출력값에 스트립트가 삽입되지 못하도록 문자열 치환 함수를 사용하여 스크립트에 자주 사용하는 특수문자나 태그를 치환해준다.
  • 크로스 사이트 스크립트 방지 라이브러리를 활용한다.
  • HTML 태그를 허용하는 게시판에서는 허용되는 HTML 태크 리스트를 만들어 해당 태그만 지원하도록 한다.