漏洞产生的缘由主要有系统机制和编码规范两方面,因为网络协议的开放性,目前以 Web 漏洞居多javascript
关于系统机制漏洞的典型有JavaScript/CSS history hack,而编码规范方面的漏洞典型有心血漏洞(Heart Bleed)。
在对漏洞概念有必定了解后,将搭建一个测试网站,对CSS欺骗、SQL注入与CSRF攻击进行实验测试。php
漏洞影响:攻击者可以获取用户浏览器的某些历史记录。css
攻击原理:利用浏览器自动查询历史记录,以及CSS对访问过的和未访问过超连接样式的不一样渲染。好比 百度 这个连接是紫色,由于你最近访问过百度。而 自建CA证书搭建https服务器 这个连接是黑色,由于你当前没有访问过我上一篇博客。若是是紫色,删除访问历史后刷新会变成黑色。html
攻击方法:因为JavaScript能够读取任何元素的CSS信息,因此能分辨浏览器应用了哪一种样式从而判断用户是否访问过该连接。攻击者能够搭建本身的网站,在上面定义一些网站的超连接。当其余用户访问该网站时,浏览器会自动根据用户的历史记录判断哪些网址曾经访问过,从而以不一样颜色呈现给用户。前端
攻击者的网站后台能够将用户访问过的网站发回给服务器,达到的效果是可以检测用户是否访问过某个网站,但并非直接获取用户访问的历史记录。java
该漏洞已被修复,现在虽然可以看到对超连接状态的不一样显示,可是js已没法获取到其中的颜色差别。mysql
又称为心脏出血漏洞,编号(CVE-2014-0160)程序员
漏洞由来:该漏洞由谷歌白帽子尼尔·梅塔(Neel Mehta)提出,他可从特定服务器上随机获取64k的工做日志,整个过程如同钓鱼,攻击能够一次次持续进行,大量敏感数据会泄露。web
产生缘由:编码时未能在memcpy()调用用户输入的内容前,对长度进行边界检查。攻击者能够输入超出范围的字节,再返回等长的缓存内容。sql
攻击方法:
OpenSSL有一个叫 Heartbeat(心跳检测)的拓展,所谓心跳检测,就是创建一个 Client Hello 问询来检测对方服务器是否是正常在线,服务器发回 Server hello,代表SSL通信正常。就像咱们打电话时会问对方 “喂听获得吗?”同样。
刚才测试超连接的博客有关于SSL与https的介绍
每次问询都会附加一个问询的字符长度,若是这个字符长度大于实际的长度,服务器还是会返回相同规模的字符信息,因而造成了内存里信息的越界访问。
漏洞影响:每发起一个心跳,服务器就能泄露一点点数据(理论上最多泄露 64K),这些数据里可能包括用户的登陆帐号密码、电子邮件甚至是加密密钥等信息,也可能并无包含这些信息,但攻击者能够不断利用 “心跳”来获取更多的信息。就这样,服务器一点一点泄露愈来愈多的信息,就像是心脏慢慢在出血,心脏出血的名字由此而来,漏洞目前已修复,但该漏洞被提出以前是否已被利用就不得而知。
以上是两种类型漏洞的简单介绍,如下将对CSS欺骗、SQL注入与CSRF攻击进行实验
正如名字同样,CSS欺骗主要是做为一种欺骗手段,给浏览器用户呈现出虚假信息。
虽然是很简单的手段,可是应用却十分普遍
欺骗原理:经过CSS定位方式和伪类,实现网页内容覆盖
html如人的骨骼,css是外表装饰,js控制页面的效果相似神经,CSS欺骗主要是利用CSS对页面的渲染。
CSS对网页元素的定位方式有如下四种:
经常使用定位方式:子绝父相
CSS伪类能够与 CSS 类配合使用,有anchor伪类、first-child伪类等。
如anchor伪类:
欺骗案例:早年的淘宝店铺装修直接使用css控制页面显示效果,有商户就此制做虚假店铺信息。
如下是2012年先后的一家店铺信息
图中所呈现的信息并不是真实的店铺信息。
30天销售量实际值为0,经过店铺装修时设置背景图,呈现出了580件的字样。
“购物须知”被背景图假装成了 “优质商家 7天无理由退换”。
评价详情与成交记录一样是使用背景图进行虚假宣传。
实际并无买家评价,只是添加了背景图片。
为何说CSS欺骗虽然简单可是应用普遍?
就我的网页浏览经历而言,在4G以前或者4G刚开始那个时候,这种利用图片作虚假页面是很常见的。
最近一次是2018年双十一时候,在某电商平台申请退款,商家一直不理会,在平台进行投诉时发现提交投诉的按钮怎么点都没反应。一开始觉得是手机显示不兼容,后来发现那个页面下半部分是张图片,提交按钮只是图片的一部分。
不过双十一也能够理解,可是就大多数没什么计算机基础的网民而言,CSS欺骗仍是颇有效的。
下面将会先介绍SQL注入,而后再将CSS欺骗与SQL注入结合,在搭建的测试网站上实现利用SQL注入前端代码进行CSS欺骗。
SQL注入便是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者能够在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的状况下实现非法操做,是目前最多见危险的漏洞之一。
SQL注入不是一个过时的安全问题,偏偏相反,它是一种很是容易被使用的攻击方式,SQL注入并不须要高深的攻击手段即可以轻易使敏感的数据库信息被非法浏览或删除。
通常注入过程:
若是有简单网站的搭建经验,只须要理解了SQL注入的原理,就能够构建本身的测试。
下图是搭建的测试网站的登录界面:
先注册一个userA的帐号并登陆:
网站有三个简单的页面,分别是Home、Users、Transfer:
如下有两种SQL注入可使得本身的zoobars变多:
注入代码:
userA的我的简介', Zoobars='20
保存我的简介后刷新页面,userA的zoobars变成了20,简介显示“userA的我的简介”:
这种方法直接改动了数据库数据,后台更新我的简介的php代码以下:
<?php if($_POST['profile_submit']) { // Check for profile submission $profile = $_POST['profile_update']; $sql = "UPDATE Person SET Profile='$profile' ". "WHERE PersonID=$user->id"; $db->executeQuery($sql); // Overwrite profile in database } $sql = "SELECT Profile FROM Person WHERE PersonID=$user->id"; $rs = $db->executeQuery($sql); $rs = mysqli_fetch_array($rs); echo $rs["Profile"]; ?>
第四、5行的$sql值是数据库要执行的语句,方法1使得实际执行的sql语句变成了:
UPDATE Person SET Profile='userA的我的简介', Zoobars='20' WHERE PersonID=userA
因为场景不一样,有时候会使用方法二注入,仅修改网页的显示进行CSS欺骗:
userA的zoobars数量是20,经过SQL注入前端代码,可使得这个网站的用户在搜索userA时看到的数量为200,这里为了方便观察,欺骗的字体设置了红色。
注入代码:
<span style="color:#000000;position:relative;left:60px;top:-54px;">0</span>
与以前介绍淘宝商家用CSS直接设置背景图片不一样,这里是经过SQL注入在我的简介里写了个相对定位的标签,当网站用户搜索userA的我的简介时,我的简介里的html代码会被浏览器解释渲染成数字0,并显示在zoobars数量的后面。
下面将介绍与浏览器机制相关的另外一种攻击方式。
CSRF(Cross-site request forgery),即跨站请求伪造。
引诱浏览器用户访问本身的攻击网站进行跨站访问,经过浏览器保存用户原网站cookie的机制,在攻击网站获取用户的身份权限并伪造请求进行攻击。
浏览器机制:
当用户登陆某一网站后,本地会保存一份cookie用于身份认证,若是cookie没有过时,就不须要反复进行登陆操做。
与JavaScript/CSS history hack不一样的是,CSRF暂时没法像修改CSS或JS引擎那样进行漏洞修补,由于目前的浏览器须要这种机制。
场景模拟:程序员登陆博客园浏览博客,发现一篇不错的博客后打算分享到朋友圈,但第一次分享时网页会要求先登陆朋友圈。当登陆分享成功后,没过多久程序员又发现一篇不错的博客,打算再次分享,以此往复循环,浏览器会怎么作?
目前浏览器的机制是会在第一次登录后保存用户的cookie,使得用户在有效期内没必要反复认证身份,因此后续的跨站不须要再登陆。(没有实际操做过,也可能博客园分享每次都须要登陆,只是举个例子模拟网页跨站情景)
浏览器保存cookie的机制是须要的,但同时给了攻击者可乘之机。
web中用户身份验证的漏洞:
简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求自己是用户自愿发出的。
也就是说,用户的浏览器发送了一条请求,同时浏览器的cookie也能证实用户身份,可是并不能保证这条请求是用户主动在原网站上进行的操做。
攻击步骤:
搭建网页
原网页与代码:
Transfer界面点击Send按钮会发送一条请求,执行转帐操做。
攻击者须要制做一个本身的网站,在网站上编写攻击操做。
这里直接将原网站的界面代码复制了一份,而后Send的金额写入默认值1,转帐对象默认设置成攻击者的userA帐户,再经过JS代码让网站在加载时自动执行Send按钮的提交操做。
攻击网页与代码:
虽然看上去同样,可是经过浏览器地址能够看出这个另外一个网页,用来模拟进行攻击的网站。
而后在我的简介里注入一个超连接:
<a href="https://localhost/myzoo/send.php">点击获取</a>
网址是攻击者本身的网站
这时其余用户搜索userA时,会看到以下简介:
目前userB的zoobars数量为9,若是点击一下这个连接,会跳转到攻击者网站并自动给userA转一个zoobar,以后userA的数量变成21个,userB只剩下8个。
攻击实际上就是经过用户浏览器保存的cookie认证,伪造出用户请求。
应对CSRF攻击的方法有不少,有一种是能够经过检查请求的Referer字段判断请求的来源网站,不过这是一个攻防的过程,攻击者也有可能进一步攻击篡改Referer字段。