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 触发HTML元素绑定的函数
Sep 11 Javascript
JS打开图片另存为对话框实现代码
Dec 26 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
Jan 23 Javascript
利用js实现选项卡的特别效果的实例
Mar 03 Javascript
JS随机生成不重复数据的实例方法
Jul 17 Javascript
cookie中的path与domain属性详解
Dec 18 Javascript
js判断是否为ie的方法小结
Jan 13 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
Feb 14 Javascript
分享javascript实现的冒泡排序代码并优化
Jun 05 Javascript
JavaScript实现图片拖曳效果
Sep 08 Javascript
layui的面包屑或者表单不显示的解决方法
Sep 05 Javascript
如何在JavaScript中等分数组的实现
Dec 13 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
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
jquery实现全选、反选、获得所有选中的checkbox
2020/09/13 Javascript
详谈javascript异步编程
2016/02/21 Javascript
jQuery使用经验小技巧(推荐)
2016/05/31 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
jQuery操作cookie
2016/08/08 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
浅谈react 同构之样式直出
2017/11/07 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
python实现简单图书管理系统
2019/11/22 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
室内设计专业毕业生求职信
2014/05/02 职场文书
师范生自荐信模板
2014/05/28 职场文书
花坛标语大全
2014/06/30 职场文书
党的群众路线调研报告
2014/11/03 职场文书
母亲去世追悼词
2015/06/23 职场文书
Python实现byte转integer
2021/06/03 Python
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android
MySQL详细讲解变量variables的用法
2022/06/21 MySQL