神秘莫测的黑客世界
即使不是计算机相关专业的你,也一定听过XXX网站被黑掉的新闻吧?对此,你是作何感想呢?你或许会觉得那些黑客好厉害,仅凭一两个人的努力就让一个拥有数万人的大公司的网站陷于瘫痪,又或者你觉得那些黑客非常可恶,做的都是些损人利己的事。喜欢也好,讨厌也罢,你唯一不应该做的就是忽视他。你可能觉得黑客离你很远,而且自己长期用电脑,也没有发生过电脑被入侵隐私被窃取的事件。事实却是,几乎所有连上网的电脑都被入侵过,之所以很多人感觉不到自己的电脑被入侵过,是因为绝大多数的电脑用户都是普通人,在黑客看来,这些用户的个人电脑并没有多少有价值的信息,因此黑客仅仅是在你电脑上遛一圈就走了,几乎没有留下任何痕迹。如果你是明星,大腕,某某知名导演,情形就不太一样了,黑客就不会那么容易放过你。毫无夸张地说,电脑只要插上网线,就没有隐私可言。你觉得自己的电脑安全很可能是因为无知,枪曾经顶在你的后脑勺你却什么都不知道,因为杀手没有扣动扳机就消失在黑暗中了。
本文探讨如何通过跨站脚本实现拒绝服务攻击,由于黑客技术在国内属于灰色地带,因此本文也不会给出能用于实战的代码,以免给本人和读者造成不必要的麻烦,仅以一个入门级的demo演示其原理,希望你在学习其原理的过程中更深入地了解网络安全知识,让自己的生活更美好。那么,在此之前,你需要了解一些必要的理论知识,就从同源策略开始吧!
同源策略
网页的发明最初是为了取代报纸的,最初的网页排版和报纸几乎一摸一样,那时称之为静态网页。“无纸化办公”即是那时提出来的口号。事实证明,“纸面办公”有它的优势,不可能完全被取代,就像网店不可能完全取代实体店铺一样。在静态网页时代,网页请求协议非常简单,Http协议只需包含请求方法和文件路径就能获取网页。随后出现了动态网页,网页请求中附带上了Cookie。Cookie是动态网页的基石,是客户端的一个身份标识,服务器借此识别客户端身份并提供个性化服务。我们不妨将静态网页发展到动态网页的过程比喻为一家电影院的发展。早期的那种公共电影院,大礼堂一样的大厅,定期会播放电影,也不收费,大门敞着,人们随时进随时出。电影院播什么你就看什么,你自己想看什么是无法选择的。这就是静态网页的模式。到后来电影院进行了升级改造,开始收费了,不再进行公共播放了,而是将公共播放厅分割成了各个单独播放厅,各个播放厅播放不同电影,人们可以购买电影票选择不同的电影了。这就是动态网页模式。当你向电影院出现电影票的时候,就会享受到电影院为自己定制的服务。在动态网页技术中,我们称该电影票为Cookie。那么,很自然的,我们在A电影院买的票是不能到B电影院使用的,在动态网页技术中,我们把这种规定称之为同源策略。用专业术语表示为不同源的网页之间不能相互访问。同源指的是协议,主机,端口号都相同。在实际应用中,我们把向不同源的网页发起的请求称之为跨域请求。跨域请求在有些应用场景中是不可避免的,比如我们接下来要谈的跨域脚本。
跨站脚本
动态网页的特性一方面体现在服务器可以根据客户端信息提供定制化服务,另一方面体现在客户端可以在不提交服务器的情况下通过解释型脚本与用户进行动态交互,这极大的提升用户体验,也大大的缓解了服务器压力,因为很多以前在服务端进行的信息验证都交给客户端了,客户端只会提交合法的信息。需要注意的是,在网页的同源策略中,纯粹的脚本文件是没有源的,因为脱离网页的纯粹的脚本无法运行,脚本必须附加到网页中,和网页具有同一个源。尽管我们可以通过script标签引入一个外部脚本,但我们不能认为script标签的src属性所代表的就是该脚本的源。脚本是因为附加到网页中才具有源,它的源就是网页的源。我们以下面代码为例:
<html>
<head></head>
<body>
<script src = "http://www.baidu.com/XXXXX/testA.js"></script>
<script src = "http://www.google.com/XXXXX/testB.js"></script>
</body>
</html>
上述代码中,尽管testA.js和testB.js来自两个不同的域名,但是因为都嵌入在同一个网页中,因此它们是可以相互访问对方的内容的。我们再看下面的代码:
网页A:http://www.baidu.com/&&&&&/pageA.html
<html>
<head></head>
<body>
<script src = "http://www.baidu.com/XXXXX/testA.js"></script>
</body>
</html>
网页B:http://www.google.com/&&&&&/pageB.html
<html>
<head></head>
<body>
<script src = "http://www.baidu.com/XXXXX/testA.js"></script>
</body>
</html>
我们可以看到网页A和网页B的域名不一样,可以判断两个网页具有不同的源。尽管网页A和网页B的脚本都引自同一个Url,但因为嵌入的网页具有不同的源,因此它们之间不能相互访问。综上所述,我们需要记住,脚本本身没有源,当它附加到网页中时,就具有和网页一样的源。那么,从现在开始,我们就可以尝试往一个网页中注入远程脚本了。当我们的脚本注入成功,那么我们就可以想做什么就做什么了。今天,我们尝试做的就是,在注入的脚本中无限地消耗网页资源,致使服务器无法提供正常的网页服务,也就是比较著名的拒绝服务攻击。当然,这只是一个demo,不能用于实战。
脚本注入
脚本注入是一项非常古老的技术,由于它并非是利用了某软件或操作系统的漏洞,因此要彻底根除它几乎是不可能的。它的原理非常简单,即是在用户输入界面向后台传递一些脚本关键字或者特殊指令,这些关键字或指令很有可能在后台组合成一些让开发者意想不到的命令,而这些命令通常都是注入者处心积虑设计好的。这些命令,如果毫无防范地提交到后台执行,极有可能造成灾难性后果。比如很典型地SQL注入,我们进入某大型网站的查询页面,输入品名后继续输入“';delete from users where ''<>'”,我们就会像服务器注入一条删库的语句,这条语句若是在后台执行成功了,将造成灾难性的后果。当然,这样的注入方式太初级,基本不可能成功,脚本注入是一项非常复杂的技术,这里只是解释其原理,并不做复杂的探讨。基于同样的原理,我们可以向网页中注入网页标签或者JavaScript脚本。为了让代码更加简单,我们利用docoment.write()方法完成对目标脚本的注入。我们首先定义一个目标网页(要注入的页面),目标网页代码如下:
目标网页A:http://www.baidu.com/.../target.html
html>
<head></head>
<body>
<script>
var name = decodeURIComponent(window.location.search.substring(1)) || "";
document.write("hello " + name);
</script>
</body>
</html>
当我们在请求该网页时,输入正常的请求参数,比如:http://www.baidu.com/.../target.html?James,网页会显示“hello James”,这是正常的。但是如果我们输入一些关键字,并且附带上一些脚本,情况就不一样了。比如这样的:http://www.baidu.com/.../target.html?%3Cscript%3Ealert('James')%3Cscript%3E,网页上居然弹出了消息框。这个消息框并非是我们在目标网页中定义的,而是我们通过外部传参的形式注入的。这也就是说,我们可以通过传参的方式执行任何我们想执行的脚本代码。由于脚本本身没有源,可以注入任何外部脚本,那么,我们再进一步,对目标网页注入一个跨站脚本。
注入跨站脚本
跨站脚本利用了script标签跨域特性,将远程攻击脚本注入到目标页面中。我们再这里定义一个远程攻击脚本,在攻击脚本中并不做攻击操作,仅仅是写一行测试代码:
攻击脚本A:http://www.baidu.com/.../attack.js
alert('James');
然后我们将脚本注入到目标页面中,在浏览器中输入:http://www.baidu.com/.../target.html?%3Cscript src = 'http://www.baidu.com/.../attack.js'%3E%3Cscript%3E,网页如果弹出消息框,则注入成功。完成了这一步,则目标网页已经是你的囊中之物了,你就可以为所欲为了。比如,我们下一步要做的,拒绝服务攻击。
拒绝服务攻击
拒绝服务攻击原理非常简单,其攻击手法非常暴力。就是粗暴地毫无意义地消耗你的计算机资源,致使正常的网页代码根本没有机会执行。服务器无法提供给客户端正常的服务。在用户看来,就好像服务器拒绝服务一样。实际上,服务器返回的正常页面被人中途篡改了。注入的脚本霸占了所有资源,比如你看到网页一片空白,页面卡死,页面无限弹出毫无意义的窗口。那么,我们将攻击脚本稍作修改,即可实现一个拒绝服务攻击:
while(true)
{
alert('James');
}
有些现代浏览器会自动检测死循环,并会提示用户是否要手动终止,这种方式不一定能达到很好的攻击效果。有些恶意脚本会尝试用window.setInterval(),通过在setInterval的回调中分配大块的内存来攻击你的系统,具体的这里不多做介绍。
好了,就到这里吧,本文示例代码非常简单,只为演示背后的原理,并不能用于实战。那么,从脚本注入,到跨站脚本,再到拒绝服务攻击,你是否理清了它们之间的关系了呢?
网友评论