#XSS란 무엇인가?
*워게임 사이트나 가상환경에서 실행해보기 바람..
클라이언트에 대한 취약점을 이용해서 javascript, html 언어 등을 이용하고 있는 불특정 다수를 공격할 수 있다.
공격자가 악의적인 스크립트를 사용자의 웹 브라우저에 숨겨놓게 되면, 해당 사용자가 접속할 때
악성 코드가 실행된다. 사용자의 쿠키 및 기타 개인정보가 해커에게 전송될 수 있다.
: 주로 보안에 대한 지식이 없는 웹프로그래머에 의해 개발된 web어플리케이션에서 발견되는 HTTP관련 취약점이라고
한다. 따라서 방화벽, 바이러스 백신과 같은 기존의 보안대책들이 XSS 취약점을 감지하지 못할 가능성이 있다.
<특징>
=> 교차해서 스크립트를 실행한다.
=> 공격이 단순하면서도 강력하다
=> JAVASCRIPT 공격 중 하나이다.
1) Stored XSS
: 공격자는 게시글, 쪽지, 댓글 등등 여러 곳에 자바스크립트 코드를 입력하여 작성해 놓는다.
공격을 당하는 사람은 해당 웹 페이지를 열 때 숨겨진 자바 스크립트 코드가 실행되어 공격당하게 된다.
가장 대표적인 공격 코드는
<script>alert(1)</script> 를 삽입하는 것이고, 이것 이외에도 여러가지 공격이 존재한다.
자세한것은 xss cheat sheet를 참고하면 좋다.
EX) XSSGAME 2번
-> 이렇게 게시물을 올릴수 있는 게시판 사이트가 존재한다.
게시물에 스크립트 코드를 첨부해서 실행해보자.
<img src="#" onclick=alert('1')>
-> 이미지를 클릭하면 alert(1)이 실행된다.
-> 게시판에 이미지를 첨부해 올려서 XSS 공격을 실행하였다. 따라서 게시글, 댓글, 회원가입 창 곳곳을 실행했을때 숨겨진 스크립트가 실행되는 것이 Stored XSS 라고 생각하면 되겠다.
2)Reflected XSS
: 실행 시킨 웹 페이지에서 자바스크립트 코드가 발생하고, get 방식 으로 url에 코드를 입력한다.
: url 이 너무 길면 수상하므로 shorten url(짧은 url)로 script 부분이나 파라미터를 숨길 수 있다.
: url 안에 스크립트 코드 작성시에 웹브라우저에서 자동으로 xss 공격을 방지한다.
EX) XSS GAME 1번
=> 가상의 검색 엔진에서 검색을 시도하면 url에 해당 검색어가 그대로 노출이 되는 것을 확인 할 수 있다.
: 이를 통해 reflected xss 라는 용어를 이해할 수 있다. url에 자신이 날린 공격이 노출되는 것이다.
이때, query=<script>alert(1)</script>를 실행시켜주면?
이렇게 url에 포함된 스크립트를 통해서 alert()이 실행되었다.
* 이것을 조금만 응용해서 생각해보면, url에 스크립트 코드를 숨겨서 각종 해킹을 시도할 수 있게된다.
- 보통 사람들은 url의 앞 부분만 확인하고 뒤의 파라미터 부분은 확인하지 않는다.
따라서 (https://www.xssgame.com?query=<script>window.open("https://hackeverything.com")</script>)
등을 실행했을때 엉뚱한 사이트로 리다이렉트 될거라고 예측할수 있는 사람이 많지 않을 것이라는 것이다.
=> 예를 들어 저 url을 문자나 메일로 뿌린 다음, 쿠키나 사용자 정보를 탈취하도록 만든 피싱 사이트로 연결되게끔 한다면 사용자는 속수무책으로 자신의 정보를 유출당할 수 밖에 없는 것이다.
+) 흔히 말하는 피싱사이트 의 원리가 바로 reflected XSS라고 할수 있겠다.
: 웹사이트를 만드는 기술 이외에 특별한 기술이 필요 없고, 사용자가 신뢰할 수 있는 url로 가장하기 때문에 해커 입장에서도 해킹을 시도하기도 쉽고, 사용자가 당하기도 쉬운 기술이라고 생각하면 되겠다.
#대응 방안
-> 대부분 XSS 취약점을 진단할 때는 <script>alert(1)</script> 와 같은 구문을 삽입하는 경우가 많다.
따라서 <script>,</script> 등과 같은 치명적인 구문을 삽입하였을때 이를 대체해버리는 방법이 있다.
Alttext=Replace(Alttext,"<script>","A") Alttext=Replace(Alttext,"</script>,"B")
-> 각각 <script>,</script> 를 A,B 로 치환할 수 있다.
#우회 필터링
=> 따라서 이러한 대응을 우회하기 위해서 여러가지 방법을 사용 할 수 있다.
1) 대소문자 이용
: 위 필터링은 소문자에 해당하는 값만 적용되므로, 문자열에 대문자를 섞어주면 우회가 가능하다.
<ScripT>alert("1")</ScRipT>
2) HTML 태그 속성 이용
=> 깨진 이미지를 삽입하여 마우스가 특정 이미지를 지나가면 경고 메세지를 출력하도록 한다.
<img src="#" onmouseover="alert(1);">
3) 문자열 분리를 이용한 우회 방법
: 특정 문자열 전체를 필터링 해버렸기 때문에 자바스크립트의 '+' 와 'eval'함수를 통해 우회한다.
=> 치환되지 않고 정상적으로 작동된다.
var inputString="aler"+"t(al"+"ert"+"(1));"; eval(inputString);
4) 특정한 문자열의 연속된 입력을 거부할 때
: Null Byte Injection을 사용한다.
: 문장의 종료를 나타내는 'NULL' 값을 문자열 사이사이에 삽입하게 된다.
: URL 로 인코딩 된 널바이트 문자(%00)을 이용해 악의적인 공격자에 의해 의도하지 않은 동작을 시키는 것이다.
문자열을 저장할 때 null 문자를 삽입하여 null 문자열이 있는 곳까지 출력하고 끝난 것으로 간주함을 이용한 공격이다.
=> 하지만 null문자 이후로는 그대로 공격이 전달되게 된다.
ex) webhacking.kr 23번
https://mslilsunshine.tistory.com/category/Wargame/webhacking.kr
=>위 포스팅은 지속적으로 업데이트 예정.
'WEBHACKING > web' 카테고리의 다른 글
Bugbounty) 사례 분석 XSS-2) (0) | 2020.02.08 |
---|---|
Bugbounty) 사례분석 XSS -1) (0) | 2020.02.07 |
Bug Bounty) Naver Cafe XSS - 실패ㅋ (0) | 2020.02.06 |
[정리/발번역] 버그 바운티 방법론에 대해서 (0) | 2020.02.05 |
[Mini-CTF] 취약점 찾기 (0) | 2020.01.30 |