>웹 프론트엔드 >JS 튜토리얼 >js 주입 사용법에 대한 자세한 설명

js 주입 사용법에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-04-23 10:50:157665검색

이번에는 js 인젝션 사용에 대한 자세한 설명을 가져오겠습니다. js 인젝션 사용 시 주의사항은 무엇인가요? 실제 사례를 살펴보겠습니다.

최근에 알리바바의 네트워크 보안 부서 직원 4명이 웹 허점을 이용하여 js 스크립트를 작성하여 월병을 훔치는 것에 관심이 생겼고 이 js 스크립트를 작성하는 방법을 알고 싶었습니다. 주문을 속이는 방법은 다양합니다. 그리고 그것을 달성하는 방법.

자바스크립트 주입 공격이란 무엇인가요?

1. 사용자 입력이 승인되고 다시 표시될 때마다 웹사이트는 JavaScript 주입 공격에 취약합니다. JavaScript 주입 공격에 취약한 특정 애플리케이션을 살펴보겠습니다. 고객 피드백 웹사이트를 만들었다고 가정해 보겠습니다. 고객은 웹사이트를 방문하여 제품에 대한 피드백을 입력할 수 있습니다. 고객이 피드백을 제출하면 피드백 정보가 피드백 페이지에 다시 나타납니다.
고객 피드백 웹사이트는 간단한 웹사이트입니다. 안타깝게도 이 사이트는 JavaScript 삽입 공격에 취약합니다.
고객 피드백 양식에 다음 텍스트가 입력된다고 가정해 보겠습니다.

<script>alert("Attack!")</script>

이 텍스트는 경고 메시지 상자를 표시하는 JavaScript 스크립트를 나타냅니다. 누군가 이 스크립트를 고객 피드백 양식에 제출한 후 나중에 누군가가 고객 피드백 사이트를 방문하면 공격!이라는 메시지가 나타납니다.

2. 또 다른 방법은 브라우저 주소 표시줄에 js 코드를 입력하여 페이지 js 변수 및 페이지 태그의 내용을 변경하는 것입니다.

Javascript 삽입을 사용하면 사용자는 웹페이지를 닫거나 저장하지 않고도 웹페이지의 내용을 변경할 수 있으며 이는 브라우저의 주소 표시줄에서 수행됩니다. 명령 구문은 다음과 같습니다.

javascript:alert(#command#)

예를 들어 http://www.example.com 사이트에서 경고 상자를 보려면 다음을 수행하세요. 먼저 주소 표시줄을 입력하세요. URL을 입력하고 페이지가 로드될 때까지 기다린 다음, URL을 삭제하고 새 URL로

javascript:alert("Hello World")

을 입력하세요. 그러면 "Hello World" 경고 상자가 팝업되며 이 기술을 사용하여 이미지와 같은 웹 페이지의 거의 모든 콘텐츠를 변경할 수 있습니다. 웹사이트 로고 사진이 있고 페이지 소스 파일을 보고 HTML 코드 조각을 찾았다고 가정해 보겠습니다.

"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" 경고 팝업이 뜨고 이미지가 변경됩니다. 이러한 변경 사항은 일시적일 뿐이라는 점에 유의하는 것이 중요합니다! 페이지를 새로고침하거나 재접속하시면 웹서버가 아닌 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="someone@somewhere.com">
<input type="text" name="name">
<input type="submit" value="submit"></form>
양식이 someone@somewhere.com이 아닌 이메일 주소로 전송되기를 원합니다. 다음 명령을 사용할 수 있습니다:

javascript:alert(document.format.mail.value="me@hacker.com")

•也许你已经注意到了这些命令的层次关系:
 •我们按照从左到右的顺序依次说明:
 •1)最左边是document
 •2)然后是我们想要更改的对象名(比如document.hi.src)或其包含的对象(比如document.format.mail.value)
 •3)最后是我们想要更改的属性(比如源路径:document.hi.src,或变量值:document.format.mail.value)
 •4)使用“.”号分隔
 •5)当我们想要更改属性值的时候,我们使用“=”号和新的属性值
 •*注释:当新的属性值为字符串时(比如:document.format.mail.value="me@hacker.com")需要用双引号把它括起来。
 •如果我们想要把它作为一个变量的值,则不需要使用双引号""。例如我们想要将变量b的值赋予变量a,我们可以输入javascript:alert(a=b)。
 •但是,页面中的大部分标签都没有名字,比如: 

<form action="send.php" method="post">
<input type="hidden" name="mail" value="someone@somewhere.com">
<input type="text" name="name">
<input type="submit" value="submit"></form>

在这段代码中没有表单名,综合上面这些信息,可以使用此命令: 

javascript:alert(document. .mail.value="me@hacker.com")

在这种情况下我们必须统计并找出表单序号,下面是一个例子: 

<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="someone@somewhere.com">
<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,通常我们要把找到的表单序号减一。我们将用这个序号来补全我们的命令:

javascript:alert(document.forms[1].mail.value="me@hacker.com")

•这样你就可以更改没有名字的图片或链接了,你可以把“forms”换成任何你想要的标签类型。对于图片就是 

javascript:alert(document.images[3].src="#the url of the picture you want#")

对于链接就是 

javascript:alert(document.links[0].href="#the url you want#")

 最后,我们可以用这个技巧来编辑cookies。下面的命令由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('The cookie is: "'+document.cookie+'"');alert(c(prompt("The name of the cookie:",""),
prompt("Change this value:",""),prompt("with this:","")))

//如果你想要手动更改你的cookie,可以使用下面这条命令:

javascript:alert(document.cookie)

这将显示你的当前cookie,假设是“userid=1”,如果你想把它改成“userid=2”,可以使用下列命令:

javascript:alert(document.cookie="userid=2")

最后我必须强调的是,所有的更改都只是在客户端!就像是把网页保存在你的PC上然后修改它。尽管如此,使用这一技巧你仍然可以欺骗页面(例如cookies)或绕过安全验证。例如一些网页会检测用户发送数据的位置,如果从http://www.test.com/form.php发送数据到http://www.test.com/check.php,check.php可能会检测数据是否来自http: //www.test.com/form.php上的表单。除此之外,如果你打算在页面中输入你自己的JavaScript代码,通过使用一些这样的技巧,你将能够更改图片并保持不变!

最后的最后,既然js注入这么可怕,我们自己写的网站有什么解决办法来防止js注入呢? 

方法一:

阻止 JavaScript 注入攻击的一种简单方法是重新在视图中显示数据时,用 HTML 编码任何网站用户输入的数据
如:<%=Html.Encode(feedback.Message)%>
使用 HTML 编码一个字符串的含意是什么呢?使用 HTML 编码字符串时,危险字符如 < 和 > 被替换为 HTML 实体,如 < 和 >。所以,当使用 HTML 编码字符串 <script>alert("Boo!")</script> 时,它将转换为 <script>alert("Attack!")</script>。浏览器在解析编码的字符串时不再执行 JavaScript 脚本。而是显示无害的页面。 

방법 2:

뷰에 데이터를 표시할 때 HTML을 사용하여 데이터를 인코딩하는 것 외에도 HTML을 사용하여 데이터를 데이터베이스에 제출하기 전에 데이터를 인코딩할 수도 있습니다.

StringEscapeUtils.escapeHtml("Data submit by the frontend");

일반적으로 사람들은 두 번째 방법보다는 이 튜토리얼에서 설명한 첫 번째 방법을 선호합니다. 두 번째 접근 방식의 문제점은 데이터베이스에 HTML로 인코딩된 데이터가 있다는 것입니다. 즉, 데이터베이스의 데이터에 이상한 문자가 포함됩니다. 해악은 무엇입니까? 웹 페이지가 아닌 다른 형식으로 데이터베이스 데이터를 표시해야 하는 경우 문제가 발생합니다. 예를 들어 Windows Forms 애플리케이션에서는 데이터를 쉽게 표시할 수 없습니다.

이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!

추천 도서:

!=,==,!==,===사용 요약

JS에서 시간 단위를 비교하는 방법

위 내용은 js 주입 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.