사전 지식
XSS(Cross Site Scripting)
취약한 웹 사이트(게시판, 웹 메일 등)에 악성 스크립트 코드를 삽입하여 개발자가 고려하지 않은 기능을 작동하게 하는 공격을 말한다. OWASP TOP 10에 올라가 있는 공격으로 큰 위험요소 중 하나이다.
웹 언어 중 하나인 CSS와 약자가 같아 XSS라고 되었다.
Reflected XSS
웹 애플리케이션의 지정된 변수를 이용할 때 발생하는 취약점을 이용한 것이다. 검색 결과, 에러 메시지 등 서버가 외부에서 입력받은 값을 받아 브라우저에게 응답할 때 전송하는 과정에서 입력되는 변수의 위험한 문자를 사용자에게 그대로 돌려주면서 발생하는 공격이다. 공격 과정은 다음과 같다.
➀ XSS 공격에 취약한 웹 사이트인 것을 확인하고, 정보를 획득할 수 있는 악성 URL을 생성한다.
➁ 공격용 악성 URL을 생성하고 해당 URL을 사용자에게 노출 시키거나 이메일에 포함해 보낸다.
➂ 피해자가 URL을 클릭하면 웹 사이트 서버에 스크립트가 포함된 URL 요청을 보낸다.
➃ 웹서버가 해당 스크립트를 포함하여 응답을 전송해 피해자에게 공격 스크립트가 반사되어 중요한 정보가 공격자에게 전송된다.
실습
<High Level>
High 단계의 코드를 보았더니 preg_replace 함수를 사용해 필터링을 해주는 것을 알 수 있다.
< preg_replace >
이 함수는 ("/찾을 문자/", "변경할 문자", "해당하는 문자열") 순으로 작성한다.
str_replace와 같이 문자열을 바꾸어주는 함수이다.
str_replace와 다른 점은 preg_replace 함수는 정규 표현식을 사용할 수 있다는 점이다.
정규 표현식을 사용하여 필터링을 한 것을 알 수 있다. *s는 s라는 문자가 0번 또는 그 이상 반복될 수 있음을 의미한다. 그렇기 때문에 medium 레벨에서 썼던 방법처럼 <script> 안에 <script>를 넣어 해당 태그가 완성하는 방식은 쓸 수 없게 된다.
즉, script라는 문자열은 전부 필터링이 되어 공백으로 변경된다.
medium에서 사용한 <script>를 중복하여 공격하는 방법을 시도해봤지만 필터링이 되었다.
하지만, <script> 태그만 필터링 해주기 때문에 해당 태그 말고 다른 것을 사용하면 성공적으로 세션 값을 얻을 수 있다. 필자는 img 태그를 사용하여 공격하였다.
공격 성공~!
<Impossible Level>
해당 코드는 CSRF를 막기 위한 쿠키값 확인과 htmlspecialchars 함수를 사용해 스크립트를 막는 것을 알 수 있다.
< htmlspecialchars 함수 >
HTML의 코드로 인식될 수 있는 문자열의 일부 내용을
HTML 형식으로 인코딩하여 출력해주는 역할을 하는 함수이다.
아래와 같이 왼쪽 문자를 오른쪽과 같이 변경해준다.
변경 전 | 변경 후 |
& | & |
> | > |
< | < |
" | " |
공격을 시도해봤지만 스트립트가 실행되지 않고 문자 그대로 출력이 되는 것을 볼 수 있다.
보안 방안
- 외부 입력값이나 출력값에 스트립트가 삽입되지 못하도록 문자열 치환 함수를 사용하여 스크립트에 자주 사용하는 특수문자나 태그를 치환해준다.
- 크로스 사이트 스크립트 방지 라이브러리를 활용한다.
- HTML 태그를 허용하는 게시판에서는 허용되는 HTML 태크 리스트를 만들어 해당 태그만 지원하도록 한다.
'Web > DVWA' 카테고리의 다른 글
DVWA Stored Cross Site Scripting (XSS) medium level (0) | 2021.07.28 |
---|---|
DVWA Stroed Cross Site Scripting (XSS) low level (0) | 2021.07.28 |
DVWA Reflected Cross Site Scripting (XSS) medium level (0) | 2021.07.28 |
DVWA Reflected Cross Site Scripting (XSS) low level (0) | 2021.07.28 |
DVWA Dom based Cross Site Scripting (XSS) high/impossible level (0) | 2021.07.28 |