XSS와 CSRF 실습 - DVWA

Jang Seok Woo·2020년 9월 16일
0

보안

목록 보기
9/19

XSS와 CSRF 실습 - DVWA

개발환경 : DVWA, Burp Suite

참고 : Cheat sheet

https://owasp.org/www-community/xss-filter-evasion-cheatsheet
  1. XSS - Reflected

XSS를 DVWA에 실습해보도록 하겠다.

먼저 reflected를 해보자

먼저 난이도 LOW

다음과 같이

"><script>alert("daniel")</script>

를 입력해보니 필터링 없이 그대로 입력이 되었다.

버프수트를 이용해 입력값을 확인해 보니 잘 입력되어 들어간 것을 알 수 있다.

이제 난이도 Medium

이전의 쿼리를 그대로 입력해보자

"><script>alert("daniel")</script>

다음과 같이 필터링 되어 입력이 되었다.
모양이 script 부분을 공백치환한 것으로 예측된다.

그렇다면

"><scr<script>ipt>alert("daniel")</scr</script>ipt>

이렇게 입력해보자

성공하였다.

다음으로 High난이도로 시도해보자

우선 Low에서 넣었던

"><script>alert("daniel")</script>

를 넣으니 모든 구문이 없어지고 “>> 만 남았다.

Script 문자열과 특수문자 필터가 모두 되는 것으로 보인다.

Medium에서 입력한

"><scr<script>ipt>alert("daniel")</scr</script>ipt>

를 입력해보니> 만 남았다.

<img src = “javascript.alert(“XSS”)”>

이렇게 입력해도 안된다.

<img src='0' onerror=”alert("daniel")”>

되는 듯 보인다.

문자열로 묶은 부분이 이상하니 지워주고 확인

<img src='0' onerror=alert("daniel")>

잘 들어간다.

잘 작동한다.

쿠키 값을 가져와 보자

<img src='0' onerror=alert(document.cookie)>

성공

  1. XSS – stored

글 제목과 글 내용을 입력받는 게시판 같은? 페이지가 나온다.

난이도 Low

그냥

"><script>alert("daniel")</script>

를 입력해보자

필터링 없이 성공한다.

난이도 Medium

reflceted에서 사용한

"><scr<script>ipt>alert("daniel")</scr</script>ipt>

를 입력해보자

버프수트로 확인해보니 특수문자가 치환되는걸 볼 수 있다.

<img src='0' onerror=alert("daniel")>

를 입력해 보려고 하니, 입력칸 글자수가 제한이 되어있다.

F12를 눌러 확인하고 수정해준다.(그냥 더블클릭하고 지우면 지워짐)


이제 입력이 길게 되니 입력해보면,

성공했다.

다음으로 난이도 High

Low나 medium의 정답을 입력해 보았으나 당연히 안된다.

버프수트를 보면, 다음과 같이 입력값이 모두 필터가 된다.

대문자로 바꿔서 맨 위 URL cheatsheet에 있는 것을 가져와 봤으나 여전히 지워진다.

다음과 같이

<svg onload=alert("XSS")>

를 URL인코딩 해준다.


해당 URL값을 입력값으로 넣어본다.

그냥 입력값으로 나와있으나 실제로 URL 인코딩 된 값을 넣은 후 엔터치면 정상처럼 변환된다.

하지만 우측 화면엔 실제 입력한 인코딩된 값이 살아있는 것을 볼 수 있다.

성공했다.

뒤늦게 쿠키를 보니 다음과 같이 난이도를 갖고 있는 쿠키가 있어서 low로 바꾸고 그냥

"><script>alert("daniel")</script>

를 입력해 보았더니 그냥 뚫린다.

  1. XSS – DOM

마지막으로 DOM이다.

먼저 LOW

이 부분은 다른 부분처럼 입력받는 칸이 없는데, 주소창을 보면 입력값을 넣을 수 있게 되어있다.

이렇게 주소 URL 뒤에 스크립트를 넣으니 그냥 실행된다.

다음은 Medium

LOW처럼 그냥 스크립트를 넣으니 아무 변화가 없었다.
그래서 공백치환인가? 하고

<scr<script>ipt>alert("daniel")</scr</script>ipt>

를 넣어보았다.

안된다.

다음으로 img src~를 넣어보았다.

변화가 없다.

다음과 같이

</option></select><img src='0' onerror=alert(document.cookie)>

이렇게 입력을 해보자

성공했다.

마지막으로 High!

URL에서 #의 의미를 아는가!

1) #
#은 브라우저가 리로딩 없이 자바스크립트를 불러오기위한 방법입니다. 동시에 URL을 브라우저 히스토리에 남깁니다. 예를들어, http://twitter.com/# 을 방문한다음 http://twitter.com/#!/search/twitter 링크를 클릭하면 이 URL은 (#이 있으므로) 서버로 요청이 전송되지 않습니다. 그러나 URL이 이렇게 change되면 url change에 따른 이벤트 핸들러 자바스크립트를 호출 할 수 있습니다. (예를들어 http://benalman.com/projects/jquery-hashchange-plugin/ 같은 플러그인 사용) 그리고 그 이벤트 핸들러가 AJAX로 요청을 처리하게 합니다.
이렇게 한번 돌아가는게 좋은점은 브라우저의 REFRESH가 없으면서도, URL이 각 동작마다 바뀌고, 그 URL이 브라우저 히스토리에 남는다는 겁니다. 그래서 손쉽게 브라우저의 앞으로, 뒤로를 클릭할 수 있도록 만들어주는 것이죠.
입력값 앞에 #을 넣어보자

#</option></select><img src='0' onerror=alert(document.cookie)>

성공!

CSRF

CSRF 실습을 해 보도록 하겠다.

개발환경 : DVWA, Burp Suite

  1. CSRF –Low

먼저 난이도 low로 해보겠다.

다음과 같이 들어가면 비밀번호를 변경하는 페이지가 나오고, 변경하면 된다.

아래에 password changed라는 문구가 나오면서 url get 방식으로 데이터를 주고 받는걸 알 수 있다.

Burp Suite를 이용해 해당 패킷을 분석해보자

입력값을 받는 부분이 이렇게 코딩이 되어있다.

이렇게 바꾸어주자

저장은 .html 확장자로 저장해주도록 한다.

실행시키면 실행 시켜 change를 누르는것 만으로 비밀번호가 변경된다
(주의) 크롬으로 DVMA를 접근했으면 크롬으로 html파일을 실행시킨다.

  1. CSRF – High

Medium이 왜 없냐고? CSRF는 변동이 없다고 유튜브에서 바로 HIGH를 하더라고..

패킷을 잡아서 확인해보면

다음과 같이 user_token을 확인하는 걸 볼 수 있다. 이 부분만 html에 추가해주자

잘 저장해서 실행한다.

성공

추가)

XSS 방어법
• Server-side Mitigations
• HTTPOnly 플래그 사용
• Content Security Policy 사용
• X-XSS-Protection

CSRF 공격을 막기 위해서는 보통 두 가지 방법을 사용할 수 있습니다.
1. 세션 쿠키 대신 커스텀 헤더를 사용하여 사용자 인증
o 사용자 인증만을 위한 헤더를 추가합니다. (e.g. Authorization)
2. 공격자가 예측할 수 없는 파라미터 추가 및 검증
o Same Origin에서만 접근 가능한 데이터를 삽입
 CSRF Token
o CAPTCHA
o 정상적인 사용자만 아는 기존의 값을 검증 (예: 현재 비밀번호)

profile
https://github.com/jsw4215

0개의 댓글