저자: BIBI
우리가 해커를 떠올릴 때마다 해커는 흔히 이런 식이다. 남의 서버에 조용히 들어가 남의 비밀 정보를 파괴하거나 훔치는 외로운 사람이다. 어쩌면 그는 우리 홈페이지를 변경하거나 고객의 신용 카드 번호와 비밀번호를 훔칠 수도 있습니다. 또한 해커는 당사 웹사이트를 방문하는 고객을 공격할 수 있습니다. 동시에 우리 서버도 그의 공범자가 되었습니다. Microsoft는 이 공격을 "교차 사이트 스크립팅" 공격이라고 부릅니다. 이러한 공격의 대부분은 웹사이트가 동적으로 웹페이지를 생성할 때 발생하지만, 해커의 목표는 귀하의 웹사이트가 아니라 웹사이트를 탐색하는 고객입니다.
크로스 사이트 스크립트 공격에 대한 설명
<<ADVISORY CA--2000-02>>라는 잡지에서 CERT는 모든 사람에게 다음과 같이 경고합니다. 서버가 고객의 입력을 효과적으로 확인하지 않으면 해커가 악성 HTML 코드를 입력할 것입니다. SCRIPT 프로그램에서 코드 입력을 사용하면 혐오스러운 그림이나 소리 등을 삽입하는 등의 피해를 입힐 수 있으며 동시에 고객의 올바른 웹 페이지 탐색을 방해할 수도 있습니다.
우리는 몇몇 친구들이 의심스러운 무료 웹사이트로 유도되었고 그들이 얻은 것은 10~20개의 작은 창뿐이었다는 것을 알고 있습니다. 이러한 창에는 종종 JAVA 또는 JAVASCRIPT에 의해 생성된 잘못된 버튼이 표시됩니다. 이 창을 닫는 것은 헛된 일입니다. 창을 닫을 때마다 10개의 창이 더 나타납니다. 이러한 상황은 관리자가 부재 중일 때 자주 발생합니다. 마우스 사고는 해커가 크로스 사이트 SCRIPT 방법을 사용하여 고객을 공격하는 전형적인 예입니다.
악성 태그와 스크립트는 단순한 장난이 아니라 데이터를 훔치고 시스템을 손상시킬 수도 있습니다. 똑똑하거나 똑똑하지 않은 해커라도 SCRIPT를 사용하여 서버에 입력되는 데이터를 방해하거나 변경할 수 있습니다. SCRIPT 코드는 고객 시스템을 공격하고 하드 드라이브를 완전히 손상시키는 데에도 사용될 수 있습니다. 그리고 당신이 서버를 사용하는 동안에도 당신의 서버의 안전한 장소에는 해커의 SCRIPT가 실행되고 있다는 사실을 알아야 합니다! 고객이 귀하의 서버를 신뢰하면 악성 SCRIPT 코드도 신뢰하게 됩니다. 이 코드도 <SCRIPT>나 <OBJECT> 형태로 해커 서버에서 온 것입니다.
방화벽(SSL)을 사용해도 사이트 간 SCRIPT 공격을 방지할 수 없습니다. 악성 SCRIPT 코드를 생성한 기기도 SSL을 사용한다면, 우리 서버의 SSL이 해당 코드를 식별할 수 없기 때문입니다. 우리 고객이 한때 그토록 신뢰했던 웹사이트를 해커에게 넘겨줄 건가요? 그리고 이런 종류의 파괴가 존재하면 귀하의 웹사이트의 평판이 완전히 손상될 것입니다.
1. Cross-site SCRIPT 공격 예:
CERT 정보에 따르면 동적 입력은 일반적으로 URL 매개변수, 테이블 요소, COOKISE 및 데이터 요청과 같은 형식을 갖습니다. 이 웹사이트를 단 두 페이지로 분석해 보겠습니다. 웹사이트 이름은 MYNICESITE.COM입니다. 첫 번째 페이지에서는 양식이나 COOKIE를 사용하여 사용자 이름을 얻습니다.
<%@ Language=VBScript %>
<% If Request.Cookies("userName") <> "" Then
Dim strRedirectUrl
strRedirectUrl = "page2.asp?userName="
strRedirectUrl = strRedirectUrl & Response.Cookies("userName")
Response.Redirect(strRedirectUrl)
Else %>
<HTML>
<HEAD>
<TITLE>MyNiceSite.com 홈 페이지</TITLE>
</HEAD>
<BODY>
<H2>MyNiceSite .com</H2>
<FORM method="post" action="page2.asp">
MyNiceSite.com 사용자 이름을 입력하세요:
<INPUT type="text" name="userName">
<INPUT type="submit" name= "submit" value="submit">
<//FORM>
</BODY>
</HTML>
<% End If %>
두 번째 페이지에서는 환영할 사용자 이름을 반환합니다:
<%@ Language=VBScript %>
<% Dim strUserName
If Request.QueryString("userName")<> "" Then
strUserName = Request.QueryString("userName")
Else
Response.Cookies("userName") = Request.Form("userName")
strUserName = Request.Form("userName" )
종료 If %>
<HTML>
<HEAD></HEAD>
<BODY>
<H3 align="center">Hello: <%= strUserName %> </H3>
</BODY>
<//HTML>
평소에 언제 텍스트를 입력하면 모든 것이 잘 작동합니다. 스크립트 코드: <SCRIPT>alert('Hello.';</script>)를 입력하면 JavaScript 경고 라벨이 나타납니다.
다음에 방문할 때 이 경고 라벨도 나타납니다. 이는 스크립트 코드가 다음과 같기 때문입니다. 이는 처음 방문할 때 이미 쿠키에 들어 있습니다. 이는 교차 사이트 공격의 간단한 예입니다.
이것이 특별한 경우라고 생각되면 인터넷에서 다른 곳을 찾아 직접 테스트해 보는 것이 좋습니다. 대형 정부 웹사이트, 교육 웹사이트, 상업 웹사이트 중 일부는 위와 같은 상황에 처해 있습니다. 심지어 제가 신용카드를 자주 사용하는 웹사이트에서는 입력 내용을 필터링하지 않는다는 사실을 생각할 때
마다
정말 무섭습니다.해커 중에서는 외로운 사람이 남의 서버에 몰래 들어가 다른 사람의 비밀 정보를 파괴하거나 훔치는 경우가 많습니다. 어쩌면 그는 우리 홈페이지를 변경하거나 심지어 고객의 신용 카드 번호와 비밀번호까지 훔칠 수도 있습니다. 해커는 당사 웹사이트를 방문하는 고객도 공격합니다. Microsoft는 이 공격을 "교차 사이트 스크립트" 공격이라고 부릅니다. 이러한 공격의 대부분은 웹사이트가 웹 페이지를 동적으로 생성할 때 발생하지만 해커의 대상은 귀하의 웹사이트가 아니라 고객입니다. 사이트 간
스크립트 공격에 대한 설명은
<<ADVISORY CA. --2000-02>>라는 책에 나와 있습니다. CERT는 해당 잡지에서 모든 사람에게 다음과 같이 경고했습니다. 서버가 고객의 입력을 효과적으로 확인하지 않으면 해커가 일부 악성 HTML 코드를 입력하게 됩니다. 이러한 HTML 코드 입력이 SCRIPT 프로그램에 사용되면 역겨운 그림이나 소리 등을 삽입하는 등 피해를 입힐 수 있으며 동시에 고객에게 방해가 될 수도 있습니다. ' 올바른 웹 브라우징.
우리는 일부 친구들이 의심스러운 무료 웹사이트로 유도된 것을 알고 있으며 그들이 얻은 것은 10개에 불과했습니다. 20개의 작은 창에는 종종 JAVA 또는 JAVASCRIPT에 의해 생성된 잘못된 버튼이 표시됩니다. 이런 창을 닫으면 헛수고가 됩니다. 창을 닫을 때마다 팝업이 10개 이상 나타나는데, 이러한 상황은 관리자가 없을 때 발생하는 경우가 많습니다.
악의적인 태그와 SCRIPT는
단순한 장난이 아니라 데이터를 훔치고 시스템을 파괴할 수도 있습니다. SCRIPT 코드를 사용하면 클라이언트 시스템도 공격할 수 있으며, 서버를 사용하는 동안 해커의 SCRIPT도 서버의 안전한 위치에서 실행되고 있다는 점을 알아야 합니다. 코드가 <SCRIPT> 또는 <OBJECT>로 시작하더라도 해당 악성 SCRIPT 코드를 신뢰하십시오. 양식은 해커의 서버에서 온 것입니다.
방화벽(SSL)을 사용해도 사이트 간 SCRIPT 공격을 방지할 수 없습니다. 악성 SCRIPT 코드를 생성한 기기도 SSL을 사용한다면, 우리 서버의 SSL이 해당 코드를 식별할 수 없기 때문입니다. 우리 고객이 한때 그토록 신뢰했던 웹사이트를 해커에게 넘겨줄 건가요? 그리고 이런 종류의 파괴가 존재하면 귀하의 웹사이트의 평판이 완전히 손상될 것입니다.
1. Cross-site SCRIPT 공격 예:
CERT 정보에 따르면 동적 입력은 일반적으로 URL 매개변수, 테이블 요소, COOKISE 및 데이터 요청과 같은 형식을 갖습니다. 이 웹사이트를 단 두 페이지로 분석해 보겠습니다. 웹사이트 이름은 MYNICESITE.COM입니다. 첫 번째 페이지에서는 양식이나 COOKIE를 사용하여 사용자 이름을 얻습니다.
<%@ Language=VBScript %>
<% If Request.Cookies("userName") <> "" Then
Dim strRedirectUrl
strRedirectUrl = "page2.asp?userName="
strRedirectUrl = strRedirectUrl & Response.Cookies("userName")
Response.Redirect(strRedirectUrl)
Else %>
<HTML>
<HEAD>
<TITLE>MyNiceSite.com 홈 페이지</TITLE>
</HEAD>
<BODY>
<H2>MyNiceSite .com</H2>
<FORM method="post" action="page2.asp">
MyNiceSite.com 사용자 이름을 입력하세요:
<INPUT type="text" name="userName">
<INPUT type="submit" name= "submit" value="submit">
<//FORM>
</BODY>
</HTML>
<% End If %>
두 번째 페이지에서는 환영할 사용자 이름을 반환합니다:
<%@ Language=VBScript %>
<% Dim strUserName
If Request.QueryString("userName")<> "" Then
strUserName = Request.QueryString("userName")
Else
Response.Cookies("userName") = Request.Form("userName")
strUserName = Request.Form("userName" )
종료 If %>
<HTML>
<HEAD></HEAD>
<BODY>
<H3 align="center">Hello: <%= strUserName %> </H3>
</BODY>
<//HTML>
평소에 언제 텍스트를 입력하면 모든 것이 잘 작동합니다. 스크립트 코드: <SCRIPT>alert('Hello.';</script>)를 입력하면 JavaScript 경고 라벨이 나타납니다.
다음에 방문할 때 이 경고 라벨도 나타납니다. 이는 스크립트 코드가 다음과 같기 때문입니다. 이는 처음 방문할 때 이미 쿠키에 들어 있습니다. 이는 교차 사이트 공격의 간단한 예입니다.
이것이 특별한 경우라고 생각되면 인터넷에서 다른 곳을 찾아 직접 테스트해 보는 것이 좋습니다. 대형 정부 웹사이트, 교육 웹사이트, 상업 웹사이트 중 일부는 위와 같은 상황에 처해 있습니다. 심지어 제가 신용카드를 자주 사용하는 웹사이트에서는 입력을 필터링하지 않는다는 사실을 발견했습니다.
2부
.: 사이트 간 스크립트 공격을 방지합니다.
1. 크로스 사이트 스크립트의 공격을 방지하는 방법
다행히도 크로스 사이트 스크립트 공격을 방지하는 기술은 점점 완벽해지고 있습니다. 현재 크로스 사이트 스크립트 공격을 방지하기 위해 여러 가지 방법을 채택할 수 있습니다.
1. 동적으로 생성된 페이지의 문자를 인코딩해야 합니다.
가장 먼저 해야 할 일은 동적으로 생성된 페이지의 문자를 인코딩하는 것입니다. 해커는 매우 취약할 것입니다. 캐릭터 설정을 변경하면 방어를 쉽게 통과할 수 있습니다. 우리 웹사이트가 영어 웹사이트라면 문자 인코딩을 라틴 문자 ISO-8859-1로 설정하기만 하면 됩니다. 구체적인 상황은 다음과 같습니다:
<META http-equiv="Content-Type" content="text/html ;charset= ISO-8859-1">
2. 모든 입력 데이터를 필터링하고 제한합니다.
이는 크로스 사이트 스크립트 공격을 방지하는 두 번째 방법입니다. 로그인 시 해당 특수 문자의 입력을 허용하지 않습니다. 따라서 ONSUBMIT 메소드에 JAVASCRIPT 프로그램을 추가하여 이 기능을 완료할 수 있습니다. 이 예에서는 입력을 15자로 제한합니다. 이렇게 하면 더 긴 스크립트를 입력할 수 없습니다.
책 <<지식 기반 기사 QA252985>>에서 Microsoft는 입력 데이터 필터링을 완료하기 위한 간단한 Javascript 프로그램을 제공합니다. 또한 다음과 같은 특정 상황에 따라 예제에 이 코드를 도입했습니다.
function checkForm() {
document.forms[0].userName.value = _
RemoveBad(document.forms[0].userName.value)
return true ;
}
// MICROSOFT의 코드
함수 RemoveBad(strTemp) {
strTemp = strTemp.replace(/</>/"/'/%/;/(/)/&/+/- /g ,"");
return strTemp;
}
이 방법을 사용하면 입력에 포함된 다음 문자를 필터링할 수 있습니다.
% < > [ ] { } ; & + - " '( )
3.위의 방법을 사용하더라도
HTML 및 URL 인코딩을 사용합니다
.위에서 언급한 입력을 필터링하고 제한하는 방법은 매우 중요한 방어 방법이지만 이메일 기반 공격에는 여전히 무력합니다. 이메일에 URL 매개변수를 직접 넣었기 때문입니다. 이러한 상황에 대응하여 우리는 보다 강력한 보안 조치를 취해야 합니다. ASP를 사용하면 상대적으로 해결하기가 더 쉬울 것입니다. HTML과 URL만 동적으로 생성된 웹페이지를 인코딩합니다. 예제의 상황에서는 첫 번째 입력 페이지의 리디렉션 URL을 다음과 같이 변경했습니다.
strRedirectUrl = strRedirectUrl & _
server.URLEncode(Response.Cookies("userName"))
실행 페이지에 다음을 추가했습니다.
strUserName = server .HTMLEncode(Request.QueryString("userName"))
및
strUserName =server.HTMLEncode(Request.Form("userName"))
Microsoft에서는 동적 페이지의 모든 입력 및 출력을 인코딩할 것을 권장합니다. 이는 데이터베이스에서 데이터를 저장하고 검색하는 경우에도 마찬가지입니다. 이렇게 하면 크로스 사이트 스크립트 공격을 크게 피할 수 있습니다.
이렇게 하려면 Page1.asp에 다음을 추가합니다.
<%@ 언어=VBScript %>
<% If Request.Cookies("userName") <> "" Then
'쿠키를 감지하면 리디렉션
Dim strRedirectUrl
strRedirectUrl = "page2.asp?userName="
strRedirectUrl = strRedirectUrl & _
server.URLEncode(Request.Cookies("userName"))
Response.Redirect(strRedirectUrl)
Else %>
<HTML>
<HEAD>
<META http-equiv="Content-Type"content="text/html; charset=ISO-8859-1">
<TITLE>MyNiceSite.com 홈페이지</TITLE>
<// HEAD>
<script LANGUAGE="javascript">
<!--
function checkForm() {
document.forms[0].userName.value =
RemoveBad(document.forms[0].userName.value)
return true
;
//************************************************ ******
//프로그래머: 원본 코드가 아님 - MICROSOFT에서 제공됨
//코드 출처: Microsoft 기술 자료 기사 Q25z985
//설명: 잘못된 문자를 제거합니다
//**************** ***** *****************************************
function RemoveBad(strTemp) {
strTemp =strTemp.replace(/</>/"/'/%/;/(/)/&/+/-/g, "");
return strTemp;
}
//-->
</SCRIPT>
<BODY>
<BR>
<H2>MyNiceSite.com</H2>
<BR>
<FORM method="post"action="page2.asp" onsubmit="return checkForm ();">
MyNiceSite.com 사용자 이름을 입력하세요:
<INPUT type="text"name="userName" width="10" maxwidth="10">
<INPUT type="submit"name="submit" value=" submit">
</FORM>
<//BODY>
</HTML>
<% end if %>
Page2.asp에 다음을 추가합니다.
<%@ Language=VBScript %>
<% Dim strUserName
If Request.QueryString("userName")<>"" Then
strUserName =server.HTMLEncode(Request.QueryString("userName"))
Else
Response.Cookies("userName") =Request.Form("userName")
strUserName = server.HTMLEncode(Request.Form("userName"))
End If %>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/ html;charset=ISO-8859-1">
</HEAD>
<BODY>
<H3 align="center">Hello: <%= strUserName %></H3>
</BODY>
<//HTML>
이제 이것으로 인해 공격은 효과적으로 방지되었습니다. 악성 태그와 스크립트가 인코딩되면 아래와 같이 텍스트 형식으로 표시됩니다.
또한 동적 입력에서 모든 특수 문자를 필터링하기 위해 IIS 구성 요소를 추가할 수도 있습니다. 이미 개발된 웹사이트의 경우 이 방법을 사용하면 크로스 사이트 스크립트 공격을 방지하는 것이 매우 쉽습니다. 우리의 컨트롤은 ASP 페이지에서 REQUEST 대상을 가로챌 수 있으며 테이블, 쿠키, 요청 문자열 및 프로그램의 내용을 감지할 수 있습니다.
로그 파일을 작성하여 이 구성 요소에 통계 데이터를 추가할 수도 있습니다. 클라이언트가 잘못된 문자를 입력할 때마다 이 구성 요소는 IP 주소와 시간을 기록합니다. 자세한 내용은 Doug Dean의 <<ASPToday에서 IIS 애플리케이션 롤업>> 기사를 참조하세요.
크로스 사이트 스크립트 공격을 효과적으로 방지하려면 몇 가지 간단한 조치만 취하면 됩니다. 위에서 언급한 세 가지 방법 외에도 Microsoft와 CERT에서는 "온전성 검사"라고 하는 방법을 사용할 것을 강력히 권장합니다. 예를 들어 숫자만 입력할 수 있는 입력창이 있는 경우 0~9까지의 숫자만 입력할 수 있도록 제한하겠습니다. 입력 문자를 제한하기 위해 Microsoft와 CERT에서 사용하는 방법은 특수 문자만 필터링하는 것보다 훨씬 낫습니다. 이러한 조치를 취하면 귀하의 웹사이트를 방문하는 고객을 보호할 수 있습니다.
2. 해커 공격으로부터 브라우저를 보호하는 방법:
인터넷에서 로밍할 때 공격을 피하는 방법은 무엇입니까? Microsoft와 CERT는 온라인에서 장난을 치지 말라고 조언합니다. 이런 상황에 대해 존 드보락(John Dvorack)이라는 PC 매거진 칼럼의 저자는 흥미로운 답변을 내놓았다. 그는 이것이 인터넷 사용자에게 겁을 주어 America Online 및 MSN.com과 같은 안전한 사이트를 탐색하도록 하는 Microsoft의 계획적인 행위라고 믿습니다.
우리의 예에서는 인터넷을 헤매지 않더라도 온라인에서 해커의 공격을 피할 수 없습니다. 아이러니하게도 대부분의 위험은 우리가 가장 신뢰하는 웹사이트에서 발생합니다. 귀하의 웹사이트에 문제가 없도록 하려면 동적 콘텐츠나 쿠키를 다운로드하지 말아야 합니다. 자세한 내용은 브라우저의 관련 정보를 참조하세요.
Microsoft는 또한 브라우저의 Active Script를 심각하게 제한된 상태로 설정하고 이메일을 심각하게 제한된 수신 모드로 설정하라고 경고합니다. 이메일의 링크를 클릭할 때는 주의하세요. 자세한 내용은 <<Microsoft의 기술 자료 문서 Q253117>>을 참조하세요. 혹시라도 온라인에서 더 많은 경험을 쌓고 항상 조심하는 것이 좋습니다.
결론
이전 UNIX 프로그래머라면 크로스 사이트 스크립팅이 무엇을 의미하는지 모를 수도 있습니다. 많은 사이트의 관리자가 로그인하는 사용자 이름과 비밀번호는 각각 root이고, 마찬가지로 많은 데이터베이스 관리자의 이름과 비밀번호는 각각 sa와 비밀번호라는 것을 알고 있습니다. Webzine(예: Phrack 및 Alt2600)도 알고 있습니다. 그들이 제공하는 방법을 통해 특정 서버의 약점을 단계별로 알 수 있습니다. 이러한 종류의 하드웨어에서는 많은 웹사이트 데이터베이스 서버와 웹 서버가 스스로를 보호하지 못한다는 것도 알고 있습니다. 해커를 만나면 컴퓨터가 마비됩니다.
해커로부터 시스템을 보호하기 위한 조치를 취하는 것은 쉽지만 시스템은 항상 해커에게 노출되어 있습니다. 내년에 일부 새로운 보안 취약점이 나타날 것이라고 믿을 만한 충분한 이유가 있습니다. CERT Company의 John Howard 씨의 지도 하에 작성된 논문에서는 다음과 같이 언급했습니다. "현재 연구에 따르면 인터넷에 도메인 이름이 있는 모든 웹사이트는 평균 1년에 한 번 이상 해커의 공격을 받습니다.
" 공격은 견딜 수 없습니다. 크로스 사이트 스크립팅 공격은 해커가 사용할 수 있는 또 다른 방법입니다. 하지만 위에서 언급한 몇 가지 간단한 처리만 수행하면 이러한 형태의 공격이 발생하는 것을 방지할 수 있습니다.