안녕하세요. 휴먼스케이프 ted 입니다 :)
오늘은 OWASP의 2017 RC 버전에서도 Top 10에 속한 A2 — Broken Authentication and Session과, A3 — XSS(Cross Site Scripting) Attack에 대해서 알아보고자 합니다.
아래 주소의 pdf로 나머지 내용을 확인할 수 있으니 참고해 주세요~
OWASP 한국어 버전 pdf : 2013년 판 | 2017년 판
A2 — Broken Authentication and Session Management
인증 및 세션관리에 대한 취약점 유형으로 다음과 같은 것을 생각해 볼 수 있습니다.
쿠키 변조 — 쿠키 값을 변조하여 타 사용자로 로그인을 시도할 수 있는 경우(쿠키 값을 탈취하여 사용하면 로그인 상태를 탈취할 수 있음)
세션쿠키 타임아웃 — 세션에 타임아웃이 지정되지 않을 경우 사용자가 로그아웃 하지 않으면, 공용PC환경에서 다른 사람이 해당 세션을 사용할 수 있는 문제
다중세션 사용 — 여러 PC에서 로그인이 가능한 경우(다중세션을 방지하는 대표적인 사례로 은행에서는 계정을 다른곳에서 로그인하면 현재 계정이 튕김)
아래는 OWASP 에서 제공한 pdf를 캡쳐한 것 입니다.
A2 — Broken Authentication and Session Management
보통 이런 인증 탈취 관련된 문제를 해결하기 위해서는 A3-XSS를 불가 하게 하는게 가장 좋고(결합되어서 공격을 하기 때문)
아래의 Application Security Verification Standard 관련 문서를 참고하셔도 좋습니다.
OWASP 애플리케이션 보안 검증 표준(ASVS)
위 사이트의 정리된 가이드를 보시면 꽤 많은것을 챙겨야한다는걸 알 수 있는데, 기회가 되면 자세히 살펴보도록 하겠습니다 :)
A3 — XSS(Cross Site Scripting)
XSS는 개발자들이 흔히 실수하기 쉬운데요. 입력값이나 DB에서 가져온 값을 다룰때 해당 값을 escape를 해주지 않는 경우에는 항상 공격 받기 쉽다! 라고 보시면 됩니다.
과거에 대표적으로 xss를 활용한 서비스(?) 사례로 페이스북 자동 글올리는 것과 싸이월드 방문자 추적기가 XSS를 활용한 서비스입니다.
XSS 은 악의적인 스크립트를 삽입하여 실행하게 됩니다. 보통은 사용자의 정보(쿠키)가로채는데 사용합니다.
XSS 기법으로는 DOM XSS(Type 0), Reflected XSS(Type 1), Stored XSS(Type 2)가 있습니다.
DOM(local) XSS(Type 0)
DOM 오브젝트들은 외부에서 검증되지 않는 값을 사용할 수 있기 때문에 항상 믿어서는 안됩니다.
예를 들면 document.URL document.URLUnencoded document.location document.referer 이 대표적인 입력값을 쓸때 위험한 오브젝트인데, 이 데이터들을 바로 쓰다보면 XSS에 노출 될 수 있습니다.
그리고 document.write, document.writeln element.innerHTML(outerHTML) 을 사용하는데에도 유의해야합니다.
document.URL
예를들어 위와 같은 코드로 입력값을 처리하게 되면
a3.html?name=testddd
위와 같은 XSS 방식으로 문자열에 공격코드 삽입이 가능합니다. (요즘 브라우저에서는 encode를 해주어서 잘 발생하진 않습니다만 구 브라우저(IE)에서 주로 많이 발생합니다.)
document.URLUnencoded
디코딩하는 역할만 하기 때문에 똑같이 공격할 수 있습니다.
document.location
location은 보통 document.location.hash.split(“#”)[1] 이런식으로 사용하기 때문에 코드 삽입이 쉽습니다.
document.referer
referer 도 요청 헤더를 조작하여 XSS 삽입이 가능합니다.
document.write, document.writeln
document.write('test' + user-data );
element.innerHTML(outerHTML) + jQuery
innerHTML를 사용하는 다른 라이브러리에서도 악의적으로 값을 출력할수있습니다.(jQuery)
element.innerHTML = '' + user-data; $('');Altoro Mutual: Link Disclaimer This hyperlink allows you to access a third party website: Please read the privacy policy of the linked website, which…demo.testfire.net
위 사이트에서 테스트해보세요 :)
취약점 분석 도구에서는 위와 같은 오브젝트를 사용하는지 검사하는 방법으로 분석합니다.
Reflected(non-persistent) XSS(Type 1)
Reflected XSS는 사용자 입력데이터가 화면에 즉시 출력되는 형태인데, 보통 서버에서 escape해주지 않아서 발생합니다.
취약점 판단은 요청 파라미터가 페이지를 요청할때 그 소스에 그대로 노출되는 경우에 발생하게 됩니다. 이를 분석도구에서 취약점이 있다고 판단합니다.
Stored(Persistent, Second Order) XSS(Type 2)
Reflected XSS와 유사하지만 데이터가 DB에 저장된다는 점이 다릅니다.
툴은 이를 확인할수 없습니다. 다만 스캐너가 점검 후에 발생하는 경우가 있으므로 점검 후에 확인 가능합니다.
HTTPOnly 속성 부재
HTTPOnly 및 Secure 속성
쿠키에 저장하고 전송하는 방식에 대한 방법으로 각 flag에 따라 브라우저에서 쿠키를 다루는 방법이 달라지게 됩니다.
HTTPOnly 속성 : 해당 속성을 켜지 않으면 HTTP전송 이외에도 자바스크립트상에서 쿠키를 조회하거나 수정할 수 있게 됩니다.
Secure 속성(Secure flag) : Secure 속성은 HTTP이외에 HTTPS에서만 쿠키전송이 가능하도록 합니다.
보통 쿠키를 통해 인증을 하는경우에는 HTTPOnly Secure 속성 모두 켜두고 진행하는것이 가장 좋습니다. XSS 로 쿠키의 값이 탈취되는것을 막아줄 수 있기 때문입니다 :)
아래는 XSS 에 대한 정리된 가이드입니다. 참고해주세요~
A3 — XSS(Cross Site Scripting)
위 부분을 참고하셔서 무탈한 서비스 완성해 나가시길 빕니다!