최근에 뉴스가 나왔습니다. Alibaba의 네트워크 보안 부서의 4 명의 직원은 웹 페이지 취약점을 사용하여 JS 스크립트를 작성하여 달케익을 얻었으므로 흥미로 웠습니다. 그들은이 JS 스크립트를 작성하는 방법과 다양한 주문과 총을 구현하는 방법을 알고 싶었습니다.
JavaScript 주입 공격은 무엇입니까?
1. 사용자가 입력하고 redisplaed 컨텐츠가있을 때마다 웹 사이트는 JavaScript 주입 공격에 취약합니다. JavaScript 주입 공격에 취약한 특정 응용 프로그램을 살펴 보겠습니다. 고객 피드백 웹 사이트가 작성되었다고 가정 해 봅시다. 고객은 웹 사이트를 방문하여 제품에 대한 피드백 정보를 입력 할 수 있습니다. 고객이 피드백을 제출하면 피드백 정보가 피드백 페이지에서 재생됩니다.
고객 피드백 웹 사이트는 간단한 웹 사이트입니다. 불행히도이 웹 사이트는 JavaScript 주입 공격에 취약합니다.
다음 텍스트가 고객 피드백 양식에 입력되었다고 가정합니다.
<cript> Alert (Attack!) </script>
이 텍스트는 경고 메시지 상자를 표시하는 JavaScript 스크립트를 나타냅니다. 누군가이 스크립트를 고객 피드백 양식에 제출 한 후 메시지 공격! 누구나 고객 피드백 웹 사이트를 방문하면 표시됩니다.
2. 다른 유형은 브라우저 주소 표시 줄에 JS 코드를 입력하여 페이지 JS 변수 및 페이지 레이블의 내용을 변경하는 것입니다.
JavaScript Injection을 사용하여 사용자는 브라우저 주소 표시 줄에서 수행되는 웹 페이지를 닫거나 저장하지 않고 콘텐츠를 변경할 수 있습니다. 명령의 구문은 다음과 같습니다.
JavaScript : Alert (#command#)
예를 들어, http://www.example.com 사이트에서 경고 경고 상자를 보려면 먼저 주소 표시 줄에 URL을 입력 한 다음 페이지가로드 될 때까지 기다렸다가 URL을 삭제하고 다음을 입력하십시오.
JavaScript : Alert (Hello World)
새로운 URL로. 이 기술을 사용하여 사진과 같은 웹 페이지의 거의 모든 것을 변경하여 Hello World 경고 상자가 나타납니다. 웹 사이트 로고 이미지가 있다고 가정하고 페이지 소스 파일을 보면 HTML 코드 중 하나를 찾습니다.
<img name = hi src = hello.gif>
이미지의 이름은 HI이고 소스 파일은 hello.gif이며 사이트에 저장된 bye.jpeg 파일 (http://www.mysite.com)으로 변경하려고하므로 이미지의 전체 URL 주소는 http://www.mysite.com/bye.jpeg, javaScript 주입을 사용하여 주소를 입력해야합니다.
javaScript : Alert (document.hi.src = http : //www.mysite.com/bye.jpeg)
http://www.mysite.com/bye.jpegalert 경고 팝업이 표시되고 이미지가 변경됩니다. 이러한 변화는 일시적이라는 점에 유의해야합니다! 페이지를 새로 고치거나 다시 입력하면 웹 서버가 아닌 PC에서 이러한 변경을했기 때문에 변경 사항이 사라집니다.
예를 들어, 웹 페이지에서 이와 같은 코드 조각을 찾을 수있는 동일한 방법을 사용하여 변수의 값을 보거나 변경할 수 있습니다.
<script language = javaScript> var a = test </script>
변수 a의 값이 테스트이고 이제 우리는 다음을 입력한다는 것을 의미합니다.
JavaScript : Alert (a)
그런 다음 값을 Hello로 변경합니다.
JavaScript : Alert (a = hello)
JavaScript 주입은 일반적으로 다음과 같은 코드가 있다고 가정 할 때 일반적으로 형태의 속성을 변경하는 데 사용됩니다.
<양식 이름 = 형식 action = send.php method = post> <입력 유형 = hidden name = mail [email protected]> <입력 유형 = 텍스트 이름 = 이름> <입력 유형 = 제출 값 = 제출> </form>
우리는 양식을 누군가가 아닌 우편함으로 보내기를 원합니다. 다음 명령을 사용할 수 있습니다.
JavaScript : Alert ([email protected])
• 아마도 당신은이 명령의 계층 적 관계를 발견했을 것입니다.
• 왼쪽에서 오른쪽으로 순서대로 설명합니다.
• 1) 가장 왼쪽은 문서입니다
• 2) 그러면 변경하려는 객체 이름 (예 : Document.Hi.Src) 또는 포함 된 객체 (예 : Document.Format.Mail.Value)가 있습니다.
• 3) 마지막으로 변경하려는 속성이 있습니다 (예 : 소스 경로 : Document.Hi.Src 또는 변수 값 : Document.Format.Mail.Value)
• 4) .number 분리를 사용하십시오
• 5) 속성 값을 변경하려면 = 부호와 새 속성 값을 사용합니다.
•*참고 : 새 속성 값이 문자열 인 경우 (예 : [email protected]) 이중 인용문으로 동봉해야합니다.
• 변수의 값으로 사용하려면 이중 인용문을 사용할 필요가 없습니다. 예를 들어, 변수 b의 값을 변수 a에 할당하려면 javaScript : alert (a = b)를 입력 할 수 있습니다.
• 그러나 페이지의 대부분의 태그에는 다음과 같은 이름이 없습니다.
<form action = send.php method = post> <입력 유형 = hidden name = mail [email protected]> <입력 유형 = 텍스트 이름 = 이름> <입력 유형 = 제출 값 = 제출> </form>
이 코드에는 양식 이름이 없습니다. 위 정보를 기반 으로이 명령을 사용할 수 있습니다.
javaScript : Alert (문서 .mail.value = [email protected])
이 경우 양식 시퀀스 번호를 계산하고 찾아야하며 다음이 예입니다.
<form action = send.php method = post> <입력 유형 = 텍스트 이름 = 이름> <입력 유형 = 제출 값 = 제출 값 = 제출> </form action = send.php method = post> <input type = hidden name = mail [email protected]> <입력 = 이름> <입력 유형 = 제출> <양식 action = post = post> 이름 = 이름> <입력 유형 = 제출 값 = 제출> </form>
• 위의 코드에서 우리는 3 가지 양식에만 관심이 있지만 두 번째 양식에만 관심이 있습니다. 따라서 우리가 원하는 양식 번호는 2입니다. 1, 2, 3, 4와 같이 1에서 시작하는 반면 JavaScript는 0, 1, 2, 3과 같은 0부터 시작한다는 것을 잊지 마십시오. 따라서 실제 양식 번호는 1이 아닙니다. 일반적으로 발견 된 양식 숫자를 1 씩 빼야합니다. 이 일련 번호를 사용하여 명령을 완료합니다.
javaScript : Alert (document.forms [1] .mail.value = [email protected])
•이 방법으로 이름없이 이미지 또는 링크를 변경할 수 있으며 원하는 태그 유형으로 양식을 변경할 수 있습니다. 사진 용
JavaScript : Alert (Document.images [3] .Src =#원하는 사진의 URL#)
링크는입니다
JavaScript : Alert (document.links [0] .href =#원하는 URL#)
마지막 으로이 기술을 사용하여 쿠키를 편집 할 수 있습니다. 다음 명령은 triviasecurity.net의 dr_amado에 의해 작성되었으며 사용자가 편집하기 전에 나타나도록 약간 만 수정했습니다. 주소 표시 줄에 복사하면됩니다.
JavaScript : Alert (wind c.length)); nc = unescape (c) .replace (v, nv); d
// 쿠키를 수동으로 변경하려면 다음 명령을 사용할 수 있습니다.
JavaScript : Alert (Document.Cookie)
userId = 1을 가정하면 현재 쿠키가 표시되면 userId = 2로 변경하려면 다음 명령을 사용할 수 있습니다.
JavaScript : Alert (Document.Cookie = userId = 2)
마지막으로 모든 변경 사항이 클라이언트 측에 있다는 것을 강조해야합니다! PC에 웹 페이지를 저장하고 수정하는 것과 같습니다. 그럼에도 불구 하고이 트릭을 사용하면 여전히 페이지 (예 : 쿠키) 또는 우회 보안 검증을 속일 수 있습니다. 예를 들어 일부 웹 페이지는 사용자가 데이터를 전송하는 위치를 감지합니다. http://www.test.com/form.php에서 http://www.test.com/check.php에서 데이터를 보내면 Check.ph는 데이터가 http://www.test.com/form.php의 양식에서 나오는지 여부를 감지 할 수 있습니다. 그 외에도, 자신의 JavaScript 코드를 페이지에 입력 할 계획이라면 이러한 트릭 중 일부를 사용하여 사진을 변경하여 동일하게 남길 수 있습니다!
마지막으로, JS 주입이 너무 끔찍하기 때문에, 우리가 쓴 웹 사이트에서 JS 주입을 방지하기 위해 어떤 솔루션이 필요합니까?
방법 1 : 방법 1
JavaScript 주입 공격을 방지하는 쉬운 방법은 뷰에서 데이터를 재생 할 때 HTML의 모든 웹 사이트 사용자가 입력 한 데이터를 인코딩하는 것입니다.
예를 들면 : <%= html.encode (피드백 .message)%>
문자열을 인코딩하기 위해 HTML을 사용하는 의미는 무엇입니까? HTML을 사용하여 문자열을 인코딩 할 때 <및>와 같은 위험한 문자는 <및>와 같은 HTML 엔티티로 대체됩니다. 따라서 문자열 <cript> alert (boo!) </script>가 html을 사용하여 인코딩되면 <cript> alert (Attack!) </script>로 변환됩니다. 브라우저는 인코딩 된 문자열을 구문 분석 할 때 더 이상 JavaScript 스크립트를 실행하지 않습니다. 대신 무해한 페이지가 표시됩니다.
방법 2 : 방법 2.
보기에서 데이터를 표시 할 때 HTML을 사용하여 데이터를 인코딩하는 것 외에도 데이터베이스에 제출하기 전에 HTML을 사용하여 데이터를 인코딩 할 수도 있습니다.
StringEscapeutils.escapehtml (프론트 데스크에서 제출 한 데이터);
종종 사람들은이 튜토리얼에서 논의 된 첫 번째 방법을 사용하는 것을 선호하며 두 번째 방법이 아닙니다. 두 번째 접근법의 문제점은 HTML에 인코딩 된 데이터가 결국 데이터베이스에 유지된다는 것입니다. 다시 말해, 데이터베이스의 데이터에는 이상한 문자가 포함됩니다. 이것의 단점은 무엇입니까? 웹 페이지가 아닌 양식으로 데이터베이스 데이터를 표시 해야하는 경우 문제가 발생합니다. 예를 들어 Windows Forms 응용 프로그램에서는 데이터를 쉽게 표시 할 수 없습니다.
공유에 대한 네티즌에게 감사합니다 : http://zxf-noimp.iteye.com/blog/1130771
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.