머리말
Web2.0의 발전과 Ajax 프레임워크의 인기로 인해 리치 클라이언트 웹 애플리케이션(RIA)이 날로 증가하고 있으며 점점 더 많은 로직이 서버 측에서 서버 측으로 이전되기 시작했습니다. 이러한 로직은 일반적으로 모두 JavaScript 언어를 사용하여 작성됩니다. 그러나 불행하게도 개발자들은 일반적으로 JavaScript 코드의 보안에 많은 관심을 기울이지 않습니다. IBM X-Force 2011 중기 동향 보고서에 따르면 Fortune 500대 웹사이트와 일반적으로 알려진 웹사이트의 40%가 JavaScript 보안 취약점을 갖고 있습니다. 이 기사에서는 독자가 일상적인 코딩 작업에서 이러한 보안 취약점을 피할 수 있도록 돕기 위해 코드와 함께 일반적인 JavaScript 보안 취약점을 보여줍니다. 또한 클라이언트측 JavaScript 보안 취약점의 원칙은 서버측 보안 취약점의 원칙과 약간 다릅니다. 현재 JavsScript 보안 취약점을 자동으로 탐지하는 데는 큰 기술적 어려움이 있습니다. 이 기사에서는 사용 사례를 독자들과 공유합니다. IBM Rational AppScan Standard Edition V8.0의 새로운 기능(JSA(JavaScript Security Analyser) 기술은 JavaScript 보안 취약성을 자동으로 감지합니다.
일반적인 JavaScript 보안 취약점
2010년 12월 IBM은 웹 애플리케이션의 클라이언트 측 JavaScript 보안 취약점에 대한 백서를 발표했으며, 여기에는 IBM Security Research Institute에서 실시한 JavaScript 보안 상태 설문 조사가 포함되어 있습니다. 샘플 데이터에는 Fortune 500대 기업의 웹사이트를 포함한 675개의 웹사이트와 IT 기업, 웹 애플리케이션 보안 서비스 회사, 소셜 네트워킹 사이트 등을 포함한 유명 웹사이트 175개가 포함되어 있습니다. 이러한 웹사이트의 정상적인 작동에 영향을 주지 않기 위해 연구원들은 로그인 없이 액세스할 수 있는 페이지의 하위 집합(사이트당 최대 200페이지)만 검사하는 비침해적 크롤러를 사용했습니다. 이러한 페이지는 저장되었으며, 연구원들은 IBM의 JavaScript 보안 분석 기술을 사용하여 DOM 기반 크로스 사이트 스크립팅 및 리디렉션 취약성에 중점을 두고 오프라인으로 이러한 페이지를 분석했습니다.
테스트 결과는 놀랍습니다. 이러한 유명 웹사이트 중 14%에는 심각한 JavaScript 보안 문제가 있습니다. 해커는 이러한 취약점을 이용해 악성 소프트웨어를 심고, 피싱 사이트를 심고, 사용자 세션을 하이재킹할 수 있습니다. 더욱 놀라운 점은 IBM의 JavaScript 보안 분석 기술이 성숙해짐에 따라 2011년 중반 X-Force 보고서에 따르면 IBM이 위에서 언급한 유명 웹사이트를 다시 테스트하여 더 많은 보안 취약점을 발견했으며 웹사이트의 약 40%에 JavaScript 보안이 적용되어 있는 것으로 나타났습니다. 취약점.
java 기업 수준 범용 권한 보안 프레임워크 소스 코드 SpringMVC mybatis 또는 최대 절전 모드 ehcache shiro druid 부트스트랩 HTML5
다음 기사에서는 독자가 코드와 함께 이러한 일반적인 JavaScript 보안 취약점을 보여줌으로써 독자가 실제 코딩 과정에서 이러한 보안 문제를 발견하고 가능한 한 빨리 이러한 위험을 피할 수 있도록 합니다.
DOM 기반 크로스 사이트 스크립팅
우리는 XSS(Cross Site Script, Cross-Site Scripting Attack이라고도 함)에 대해 모두 들어보셨을 것입니다. 이는 공격자가 합법적인 웹 페이지 코드에 악성 스크립트 코드(일반적으로 HTML 코드 및 JavaScript)를 삽입한 후 공격자는 이러한 악성 스크립트 코드를 이용하여 세션 하이재킹 등의 공격을 수행할 수 있습니다. 크로스 사이트 스크립팅은 일반적으로 반사형과 영구형으로 구분됩니다. 반사형 크로스 사이트 스크립팅은 요청 데이터가 서버 응답 페이지에서 인코딩 및 필터링되지 않은 상태로 렌더링될 때 발생합니다. 영구형은 악성 코드가 포함된 요청 데이터를 서버에 저장합니다. 웹 애플리케이션. 사용자가 특정 페이지를 방문할 때마다 악성 코드가 자동으로 실행됩니다. 특히 Web2.0 유형의 소셜 네트워킹 사이트에서는 이러한 공격이 흔하며 위협도 더 큽니다. 크로스 사이트 스크립팅을 처리하는 방법에는 크게 두 가지가 있습니다. 첫째, 사용자 입력을 신뢰하지 않고 화이트리스트 기술을 사용하여 입력 매개변수를 확인하는 것입니다. 둘째, 출력 시 사용자가 제공한 콘텐츠를 이스케이프 처리합니다.
그러나 세 번째 유형의 크로스 사이트 스크립팅 취약점이 있다는 사실은 알려진 바가 거의 없습니다. 2005년에 Amit Klein은 DOM 기반 교차 사이트 스크립팅을 공개한 "DOM 기반 교차 사이트 스크립팅 또는 제3종 XSS"("DOM 기반 교차 사이트 스크립팅 또는 제3종 XSS") 백서를 출판했습니다. 일부 HTML 페이지가 document.location, document.URL 또는 document.referer와 같은 DOM 요소의 속성을 사용하는 경우 공격자는 이러한 속성을 사용하여 악성 스크립트를 삽입하여 DOM을 구현할 수 있습니다. 기반 상호 참조 공격.
아래에서는 매우 간단한 HTML 페이지를 통해 DOM 기반 크로스 사이트 스크립팅의 원리를 보여줍니다. 사용자의 성공적인 로그인을 환영하는 메시지를 표시하는 정적 HTML 페이지(목록 1 참조)가 있다고 가정합니다.
목록 1. DOM 기반 XSS를 사용한 HTML 코드
<HTML> <TITLE>Welcome!</TITLE> Hi <SCRIPT> var pos=document.URL.indexOf("name=")+5; document.write(document.URL.substring(pos,document.URL.length)); </SCRIPT> <BR> Welcome to our system … </HTML>
按照该页面 JavaScript 代码逻辑,它会接受 URL 中传入的 name 参数并展示欢迎信息,如清单 2 所示:
清单 2. 正常情况下的访问 URL
http://www.vulnerable.site/welcome.html?name=Jeremy
但如果恶意攻击者输入类似如下的脚本,见清单 3,该页面则会执行被注入的 JavaScript 脚本。
清单 3. 访问 URL 中注入脚本
很明显,受害者的浏览器访问以上 URL 的时候,服务器端会跟正常情况下一样返回清单 1 中所示 HTML 页面,然后浏览器会继续将这个 HTML 解析成 DOM,DOM 中包含的 document 对象的 URL 属性将包含清单 3 中注入的脚本内容,当浏览器解析到 JavaScript 的时候会执行这段被注入的脚本,跨站点脚本编制攻击即成功实现。
值得关注的是,通过以上示例可以看出,恶意代码不需要嵌入服务器的响应中,基于 DOM 的跨站点脚本编制攻击也能成功。可能某些读者会认为:目前主流浏览器会自动转义 URL 中的 '0b0d3c1d0eac9ad57b06cc87ca4baf9e' 符号,转义后的注入脚本就不会被执行了,基于 DOM 的跨站点脚本编制也就不再有什么威胁了。这句话前半段是对的,但后半段就不准确了。我们要意识到攻击者可以很轻松地绕过浏览器对 URL 的转义,譬如攻击者可以利用锚点 '#' 来欺骗浏览器,如清单 4 所示。浏览器会认为 '#' 后面的都是片段信息,将不会做任何处理。
清单 4. 访问 URL 中结合锚点注入脚本
通过 URL 重定向钓鱼
网络钓鱼是一个通称,代表试图欺骗用户交出私人信息,以便电子欺骗身份。通过 URL 重定向钓鱼指的是 Web 页面会采用 HTTP 参数来保存 URL 值,且 Web 页面的脚本会将请求重定向到该保存的 URL 上,攻击者可以将 HTTP 参数里的 URL 值改为指向恶意站点,从而顺利启用网络钓鱼欺骗当前用户并窃取用户凭证。清单 5 给出了较为常见的含有通过 URL 重定向钓鱼漏洞的代码片段。
清单 5. 执行重定向的 JavaScript 代码片段
<SCRIPT> … var sData = document.location.search.substring(1); var sPos = sData.indexOf("url=") + 4; var ePos = sData.indexOf("&", sPos); var newURL; if (ePos< 0) { newURL = sData.substring(sPos); } else { newURL = sData.substring(sPos, ePos); } window.location.href = newURL; … </SCRIPT>
이러한 JavaScript 스크립트는 리디렉션 수행을 담당하며 사용자 입력에 표시된 것처럼 document.location, document.URL 또는 document.referer와 같은 DOM 요소의 속성 값에서 새 주소를 가로채는 것을 볼 수 있습니다. 목록 6.
목록 6. 리디렉션을 수행할 URL
http://www.vulnerable.site/redirect.html?url=http://www.phishing.site
분명히 사용자가 목록 6에 표시된 URL을 실행하면 피싱 웹사이트로 리디렉션됩니다. 이 취약점의 원리는 서버 측 리디렉션 취약점보다 간단하고 이해하기 쉽습니다. 그러나 URL 리디렉션을 통한 피싱의 경우 피싱 사이트의 URL이 서버에 의해 가로채어 필터링되지 않으므로 이 취약점은 서버 측 리디렉션 취약점보다 더 숨겨져 있는 경우가 많습니다.
클라이언트 JavaScript 쿠키 참조
쿠키는 일반적으로 웹 서버에 의해 생성되어 클라이언트 브라우저에 저장되며 사용자의 신원, 세션 정보, 심지어는 클라이언트의 인증 정보까지 저장하는 데 사용됩니다. 클라이언트 측 JavaScript 코드는 쿠키 데이터를 조작할 수 있습니다. 클라이언트 측에서 JavaScript를 사용하여 사이트의 쿠키를 생성하거나 수정하는 경우 공격자는 코드를 보고, 코드를 읽음으로써 해당 논리를 이해할 수 있으며, 해당 지식을 사용하여 쿠키를 수정할 수도 있습니다. 쿠키에 권한 정보와 같은 중요한 정보가 포함되면 공격자는 이러한 취약점을 쉽게 악용하여 권한 상승 및 기타 공격을 수행할 수 있습니다.
자바스크립트 하이재킹
많은 웹 애플리케이션이 JSON을 Ajax의 데이터 전송 메커니즘으로 활용하는데, 이는 일반적으로 JavaScript 하이재킹 공격에 취약한 반면 기존 웹 애플리케이션은 덜 취약합니다. JSON은 실제로 JavaScript의 일부이며 일반적으로 배열 형식입니다. 공격자는 자신의 악성 사이트 페이지에 있는 03c6714b8e3ee3238fc596020c4901e1 태그를 통해 공격 사이트의 JSON 동적 데이터 인터페이스를 호출하고, JavaScript Function Hook 등의 기술을 통해 JSON 데이터를 획득합니다. 사용자가 공격받은 웹 사이트에 로그인(신원 인증 정보는 세션 쿠키를 기반으로 저장되어 있다고 가정)하고 공격자에게 유인되어 악성 사이트 페이지를 방문하게 되면