js注入 黑客之路必备!


Posted in Javascript onSeptember 14, 2016

最近刚出了新闻,阿里四名网络安全部门员工利用网页漏洞写js脚本抢月饼,于是兴致来了,想了解一下这个js脚本到底怎么写,各种刷单各种抢枪抢又是怎么实现的。 

什么是javascript注入攻击?

1.每当接受用户输入的内容并重新显示这些内容时,网站就很容易遭受 JavaScript 注入攻击。让我们研究一个容易遭受 JavaScript 注入攻击的具体应用程序。假设已经创建了一个客户反馈网站。客户可以访问网站并输入对产品的反馈信息。当客户提交反馈时,反馈信息重新显示在反馈页面上。
客户反馈网站是一个简单的网站。不幸的是,此网站容易遭受 JavaScript 注入攻击。
假设正在将以下文本输入到客户反馈表单中: 

<script>alert(“Attack!”)</script> 

此文本表示显示警告消息框的 JavaScript 脚本。在某人将此脚本提交到客户反馈表单后,消息Attack! 会在将来任何人访问客户反馈网站时显示。

2.还有一种就是在浏览器地址栏中输入一段js代码,用来改变页面js变量、页面标签的内容。 

使用Javascript注入,用户不需要关闭或保存网页就可以改变其内容,这是在浏览器的地址栏上完成的。命令的语法如下: 

javascript:alert(#command#)

例如,如果你想在http://www.example.com站点上看到一个alert警告框,那么首先在地址栏上输入URL并等待页面加载完成,然后删掉URL并输入: 

javascript:alert("Hello World")

作为新的URL。这将弹出一个“Hello World”警告框,使用这一技术几乎可以改变网页的任何内容,例如一张图片。假设有一张网站logo图片,我们通过查看页面源文件找到其中一段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="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 脚本。而是显示无害的页面。 

方法二:

除了在视图中显示数据时使用 HTML 编码数据,还可以在将数据提交到数据库之前使用 HTML 编码数据。 

StringEscapeUtils.escapeHtml("前台提交的数据"); 

通常,人们喜欢使用本教程中讨论的第一种方法,而不喜欢使用第二种方法。第二种方法的问题在于在数据库中最终会保留 HTML 编码的数据。换言之,数据库中的数据会包含奇怪的字符。这有什么坏处呢?如果需要用除网页以外的形式显示数据库数据,则将遇到问题。例如,不能轻易在 Windows Forms 应用程序中显示数据。

感谢网友分享:http://zxf-noimp.iteye.com/blog/1130771

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 三种创建对象的方法
Oct 16 Javascript
js判断输入是否为数字的具体实例
Aug 03 Javascript
JavaScript 动态加载脚本和样式的方法
Apr 13 Javascript
JavaScript基本语法学习教程
Jan 14 Javascript
JQuery日历插件My97DatePicker日期范围限制
Jan 20 Javascript
js去字符串前后空格的实现方法
Feb 26 Javascript
返回函数的JavaScript函数
Jun 14 Javascript
Vue.js render方法使用详解
Apr 05 Javascript
JS非空验证及邮箱验证的实例
Aug 11 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
Sep 25 Javascript
关于vue的npm run dev和npm run build的区别介绍
Jan 14 Javascript
vue+swiper实现左右滑动的测试题功能
Oct 30 Javascript
AngularJS 模块化详解及实例代码
Sep 14 #Javascript
AngularJS 过滤与排序详解及实例代码
Sep 14 #Javascript
AngularJS  自定义指令详解及实例代码
Sep 14 #Javascript
AngularJS 自定义过滤器详解及实例代码
Sep 14 #Javascript
AngularJS 中的Promise --- $q服务详解
Sep 14 #Javascript
AngularJS bootstrap启动详解及实例代码
Sep 14 #Javascript
AngularJS equal比较对象实例详解
Sep 14 #Javascript
You might like
php之readdir函数用法实例
2014/11/13 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
python脚本替换指定行实现步骤
2017/07/11 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
用Django写天气预报查询网站
2018/10/21 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
python操作toml文件的示例代码
2020/11/27 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
性能服装:HYLETE
2018/08/14 全球购物
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
爱国卫生月实施方案
2014/02/21 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
javaScript Array api梳理
2021/03/31 Javascript
用Python创建简易网站图文教程
2021/06/11 Python
Python实现老照片修复之上色小技巧
2021/10/16 Python