English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
본문
최근, 알리 네트워크 보안 부서 직원 4명이 웹 취약점을 이용하여 js 스크립트를 작성하여 월식을 훔쳐 먹었다는 뉴스가 나왔습니다. 그래서 흥미를 느껴 이 js 스크립트가 어떻게 작성되었는지, 어떻게 다양한 주문과 월식 훔쳐 먹기가 가능했는지 알고 싶어졌습니다.
1javascript注入공격이란 무엇인가요?
고객 피드백 웹 사이트는 간단한 웹 사이트입니다. 불운히, 이 웹 사이트는 JavaScript 注입 공격에 취약합니다. . 각각의 사용자 입력을 받고 이를 다시 표시할 때마다, 웹 사이트는 JavaScript 注입 공격에 취약합니다. JavaScript 注입 공격이 쉽게 노출되는 특정 애플리케이션을 연구해 봅시다. 고객 피드백 웹 사이트를 생성한 경우를 가정해 봅시다. 고객은 웹 사이트에 접속하여 제품에 대한 피드백 정보를 입력할 수 있습니다. 고객이 피드백을 제출할 때, 피드백 정보는 피드백 페이지에 다시 표시됩니다.
고객 피드백 양식에 다음과 같은 텍스트를 입력하는 경우를 가정해 봅시다:
<script>alert(“Attack!”)</script>/script>
이 텍스트는 경고 메시지 다이얼로그를 표시하는 JavaScript 스크립트를 나타냅니다. 누군가가 이 스크립트를 고객 피드백 양식에 제출하면, Attack! 메시지가 향후 누구나 고객 피드백 웹 사이트를 방문할 때 표시됩니다.
2. 또한, 브라우저 주소 표시줄에 js 코드를 입력하여 페이지 js 변수, 페이지 태그의 내용을 변경할 수 있습니다.
JavaScript 注입을 사용하여, 사용자가 웹 페이지를 닫거나 저장하지 않아도 내용을 변경할 수 있습니다. 이는 브라우저 주소 표시줄에서 완료됩니다. 명령어 문법은 다음과 같습니다:
javascript:alert(#command#)
예를 들어, http://www.example.com 사이트에서 alert 경고 다이얼로그를 본 경우, 먼저 주소 표시줄에 URL을 입력하고 페이지가 로드되기를 기다린 후, URL을 지우고 다음을 입력합니다:
javascript:alert("Hello World")
이렇게 하면 “Hello World” 경고 다이얼로그가 표시됩니다. 이 기술을 사용하면 웹 페이지의 어떤 내용도 변경할 수 있습니다. 예를 들어, 한 장의 이미지입니다. 예를 들어, 웹 사이트 로고 이미지가 있다고 가정해 봅시다. 페이지 소스 파일을 확인하여 다음과 같은 HTML 코드를 찾습니다:
<IMG Name="hi" SRC="hello.gif">
이미지는 “hi”로 이름 지어져 있으며, 원본 파일은 “hello.gif”입니다. 우리는 이를 우리의 사이트(http:에 저장하고 싶습니다.//www.mysite.com)에 있는 “bye.jpeg” 파일이기 때문에 이미지의 완전한 URL 주소는 http:입니다.//www.mysite.com/bye.jpeg,JavaScript注入을 사용하여 주소 표시줄에 입력하면 됩니다:
javascript:alert(document.hi.src="http://www.mysite.com/bye.jpeg")
"http://www.mysite.com/bye.jpeg" alert 경고가 발생하면 이미지가 변경됩니다. 주의해야 할 것은, 이 변경은 일시적인 것입니다! 페이지를 새로고침하거나 다시 접근하면 변경이 사라질 것입니다.因为你只是在你的PC上做了这些更改,而不是在网页服务器上。
동일한 방법으로 변수의 값을 확인하거나 변경할 수 있습니다. 예를 들어, 웹 페이지에서 다음과 같은 코드를 찾을 수 있습니다:
<SCRIPT LANGUAGE="JavaScript"> var a="test" </SCRIPT>
이는 변수 a의 값이 "test"라는 의미입니다. 이제 다음과 같이 입력합니다:
javascript:alert(a)
그런 다음 값을 "hello"로 변경합니다:
javascript:alert(a="hello")
JavaScript注入은 일반적으로 양식 속성을 변경하는 데 사용됩니다. 예를 들어, 다음과 같은 코드가 있습니다:
<form name="format" action="send.php" method="post"> <input type="hidden" name="mail" value="[email protected]"> <input type="text" name="name"> <input type="submit" value="submit"></form>
양식이 우리의 이메일로 전송되도록 하고 싶다면, 다음 명령어를 사용할 수 있습니다:
javascript:alert(document.format.mail.value="[email protected]")
•;이 명령어들의 계층 관계를 이미 알고 계셨나요?
•;왼쪽에서 오른쪽으로 순서대로 설명합니다
•1}) 가장 왼쪽에는 document가 있습니다
•2}) 변경하고자 하는 객체 이름(예: document.hi.src) 또는 포함된 객체(예: document.format.mail.value)
•3}) 마지막으로 변경하고자 하는 속성(예: 원본 경로: document.hi.src 또는 변수 값: document.format.mail.value)
•4})를 사용하여 구분합니다
•5}) 속성 값을 변경하려면 "=" 기호와 새로운 속성 값을 사용합니다
•*주석: 새로운 속성 값이 문자열인 경우(예: document.format.mail.value="[email protected]}
•؛변수의 값으로 사용하고 싶다면, 쌍따옴표 ""를 사용하지 않아도 됩니다. 예를 들어, 변수 b의 값을 변수 a에 할당하려면 javascript:alert(a=b)을 입력할 수 있습니다.
•하지만, 페이지의 대부분의 태그는 이름이 없습니다. 예를 들어:
<form action="send.php" method="post"> <input type="hidden" name="mail" value="[email protected]"> <input type="text" name="name"> <input type="submit" value="submit"></form>
이 코드에서 폼 이름이 없습니다. 위의 모든 정보를 종합하여 다음 명령어를 사용할 수 있습니다:
javascript:alert(document. .mail.value="[email protected]")
이 경우, 폼 번호를 계산하고 찾아야 합니다. 예를 들어:
<form action="send.php" method="post"> <input type="text" name="name"> <input type="submit" value="submit"> </form> <form action="send.php" method="post"> <input type="hidden" name="mail" value="[email protected]"> <input type="text" name="name"> <input type="submit" value="submit"> </form> <form action="send.php" method="post"> <input type="text" name="name"> <input type="submit" value="submit"> </form>
•위 코드에서는3개의 폼을 시작으로, 두 번째 폼에만 관심이 있습니다. 따라서 원하는 폼 번호는2하지만, 우리는1부터 계산하기 시작합니다, 예를 들어1,2,3,4...javascript는 0부터 계산하기 때문에 예를 들어 0,1,2,3...따라서 실제 폼 번호는1이 아니라2보통, 찾은 폼의 번호를 1로 감산해야 합니다. 이 번호를 사용하여 명령어를 완성하겠습니다:
javascript:alert(document.forms[1].mail.value="[email protected]")
•이렇게 하면 이름이 없는 이미지나 링크를 변경할 수 있습니다. "forms"를 원하는 태그 유형으로 변경할 수 있습니다. 이미지에 대해서는
javascript:alert(document.images[3].src="#the url of the picture you want#")
링크에 대해서는
javascript:alert(document.links[0].href="#the url you want#")
최종적으로, 이 테크닉을 사용하여 쿠키를 편집할 수 있습니다. 다음 명령어는 triviasecurity.net의 Dr_aMado가 작성했으며, 나는 조금만 수정했습니다. 사용자가 편집하기 전에 표시되도록 했습니다. 단지 주소 표시줄에 복사만 해야 합니다:
javascript:alert(window.c=function a(n,v,nv){c=document.cookie;c=c.substring(c.indexOf(n)+n.length,c.length);}} c=c.substring(1,( (c.indexOf(";")>-1) ? c.indexOf(";") : c.length));nc=unescape(c).replace(v,nv); document.cookie=n+"="+escape(nc);return unescape(document.cookie);}); alert('쿠키는: "'+document.cookie+'"');alert(c(prompt("쿠키 이름:",""), prompt("이 값을 변경하세요:",""),prompt("이와 같이:","")))
//만약 당신이 자신의 쿠키를 수동으로 변경하고 싶다면, 다음 명령을 사용할 수 있습니다:
javascript:alert(document.cookie)
1”, 다음 명령을 사용할 수 있습니다:2
javascript:alert(document.cookie="userid=2")
마지막으로 강조해야 할 것은, 모든 변경은 모두 클라이언트 측에만 해당합니다! 그냥 웹페이지를 PC에 저장하고 수정하는 것처럼입니다. 그러나 이 기술을 사용하면 여전히 페이지(예: 쿠키)를 속이거나 보안 검증을 우회할 수 있습니다. 예를 들어, 일부 웹페이지는 사용자가 데이터를 보내는 위치를 검사할 수 있습니다. http:에서부터 데이터를 보낼 경우://www.test.com/form.php은 데이터를 http:로 전송합니다//www.test.com/check.php, check.php는 데이터가 http:에서 온지 여부를 검사할 수 있습니다 //www.test.com/form.php에 있는 폼. 이 밖에, 페이지에 자신의 JavaScript 코드를 입력하려고 한다면, 이러한 기술을 사용하여 이미지를 변경하고 동일하게 유지할 수 있습니다!
마지막 마지막에, JavaScript注入이 이렇게 무서운 것인지 생각해보면, 우리가 작성한 웹사이트에 대해 JavaScriptinject 방지를 위한 해결책이 무엇인가요?
첫 번째 방법:
JavaScript注入 공격을 방지하기 위한 간단한 방법은, 데이터를 다시 뷰에서 표시할 때마다 웹사이트 사용자가 입력한 데이터를 HTML로 인코딩하는 것입니다
예:<%=Html.Encode(feedback.Message)%>
HTML 인코딩된 문자열을 사용하는 의미는 무엇입니까? HTML 인코딩된 문자열을 사용할 때, 위험한 문자와 같은 <와 >는 HTML 엔티티로 변환됩니다. 예를 들어, <와 >로 변환됩니다. 따라서, HTML 인코딩된 문자열 <script>alert("Boo!")<을 사용할 때, <script>alert("Boo!")<로 변환됩니다./script> 때, 그것은 <script>alert("공격!")<로 변환됩니다/script>。브라우저는 인코딩된 문자열을 분석할 때 JavaScript 스크립트를 실행하지 않고 무해한 페이지를 표시합니다.
방법 2:
뷰에서 데이터를 표시할 때 HTML 인코딩된 데이터를 사용하는 것 외에, 데이터를 데이터베이스에 제출하기 전에도 HTML 인코딩된 데이터를 사용할 수 있습니다.
StringEscapeUtils.escapeHtml("전면 제출된 데이터");
일반적으로, 사람들은 이 강의에서 논의한 첫 번째 방법을 사용하며, 두 번째 방법을 사용하지 않습니다. 두 번째 방법의 문제는 데이터베이스에서 최종적으로 HTML 인코딩된 데이터가 저장된다는 점입니다. 다시 말해, 데이터베이스의 데이터는 이상한 문자를 포함할 수 있습니다. 이는 무엇이 문제일까요? 웹 외의 형식으로 데이터베이스 데이터를 표시해야 할 때 문제가 발생할 수 있습니다. 예를 들어, Windows Forms 애플리케이션에서 데이터를 쉽게 표시할 수 없습니다.
많은 인터넷 사용자들의 공유에 감사합니다: http://zxf-noimp.iteye.com/블로그/1130771
이것이 본문의 전체 내용입니다. 여러분의 학습에 도움이 되길 바라며, 다른 사람들도呐喊 강의를 많이 지지해 주시길 바랍니다.
선언: 본문 내용은 인터넷에서 가져왔으며, 저작권은 원작자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 본 사이트는 소유권을 가지지 않으며, 인공적으로 편집한 것도 아니며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있으면 notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com(보고할 때는 #을 @으로 변경하십시오.)를 통해 신고하시고 관련 증거를 제공하시면, 사실이 확인되면 해당 사이트는 즉시 저작권 침해 내용을 삭제합니다.