Reflected XSS 공격 (2)
1. Reflected XSS 공격 Medium 단계 실습
[그림 1-1] 공격 스크립트 삽입
Reflected XSS 공격을 시도 하기 위해 공격 스크립트를 삽입 후 요청을 보낸다.
[그림 1-2] 실행 결과
공격 스크립트 삽입 후 실행 결과 Low 레벨과는 다르게 XSS 공격 경고창이 나타나지 않는다는 것을 볼 수 있다.
[그림 1-3] 소스 코드
Medium 레벨의 소스 코드를 보면 str_replace 함수로 <script> 문자열을 제거한다. 폼에 XSS 공격 스크립트를 삽입하고 요청을 보낼 때 <script> 문자열을 제거한 후 응답값이 오는 것이다. str_replace 함수는 대소문자를 구분하는 반면 HTML은 대소문자를 구분하지 않는다.
[그림 1-4] 공격 스크립트 삽입
HTML이 대소문자를 구분하지 않는다는 취약점을 이용해 <SCRIPT>alert(1)</SCRIPT> 공격 스크립트를 입력한 후 요청을 보낸다.
[그림 1-5] 공격 성공
<SCRIPT>alert(1)</SCRIPT> 공격 스크립트를 입력한 후 요청을 보낸 결과 우회되서 공격이 성공했다는 걸 볼 수 있다. XSS 공격을 방어하기 위해선 HTML의 대소문자 구분 함수 구현도 필요하다.
2. Reflected XSS 공격 High 단계 실습
[그림 2-1] 공격 스크립트 삽입
Reflected XSS 공격을 시도 하기 위해 공격 스크립트를 삽입 후 요청을 보낸다.
[그림 2-2] 실행 결과
공격 스크립트 삽입 후 실행 결과 XSS 공격 경고창이 나타나지 않는다는 것을 볼 수 있다. 결과 값만 봐도 문자열이 필터링 되었음을 볼 수 있다.
[그림 2-3] 소스 코드
PHP의 preg_replace 함수를 이용해 <*s*c*r*i*p*t 규칙에 해당하는 문자열을 대소문자 구분하지 않고 제거한다. "<script", "<SCRIPT", "<SC\RIPT", "</script", "</SCRIPT", "</SC/**/RIPT" 등의 문자열을 제거하기 때문에 <script>를 이용해 자바스크립트를 삽입할 수 있는 방법은 없다.
[그림 2-4] 공격 스크립트 삽입
<script> 문자열을 쓸 수 없어 <img src=x onerror=alert(document.cookie)>라는 다른 XSS 공격 스크립트를 삽입한다. <img도 XSS 공격 스크립트 구문으로 많이 쓰이는 문자열 중 하나다.
[그림 2-5] 공격 성공
<img src=x onerror=alert(document.cookie)> XSS 공격 스크립트 요청 결과 우회되서 공격이 성공했음을 볼 수 있다. <script> 뿐만 아니라 다른 문자열도 필터링 해줄 수 있는 시큐어코딩이 필요하다.