1.浏览器缓存html
每次打开一个网站,网页的内容会缓存到用户的机器中。若是这些内容在其余网页中须要从新加载,浏览器加载的是缓存,而不是再次下载内容。若是一些Web应用商店以及显示用户敏感信息(好比地址,信用卡信息,用户名)这些信息也是会记录到缓存中的,所以能够经过检测浏览器缓存检索到这些信息的。chrome
在IE浏览器中这些信息存储在:数据库
C:\Users\<user_name>\AppData\Local\Microsoft\Windows\Temporary Internet Files
在Firefox浏览器:浏览器
C:\Users\<user_name>\AppData\Local\Mozilla\Firefox\Profiles\<profile-id>\Cache 或者在地址栏输入about:cache
在Chrome浏览器中的地址栏输入chrome://cache,其存储在缓存
C:\Users\<user_name>\AppData\Local\Google\Chrome\User Data\Default\Cache
验证安全
咱们在Mozilla Firefox 浏览器下实验,访问几个网页事后而后退出网站。在地址栏输入about:cache.这就能够显示在浏览器中的缓存信息了,经过缓存列表以及其中的内容选择你感兴趣的内容。服务器
下面的截图就显示了用户仪表盘,在用户仪表盘中可能含有高危敏感信息,好比地址,电话号码,信用卡信息,E-mail等等。工具
打开一个特定的缓存条目,在用户仪表盘中咱们能够看到地址,电话号码,订单历史等等网站
小贴士ui
这个问题能够经过在响应头中设置合适的缓存控制属性解决。
主要有如下两种缓存属性:
Cache-control: no-cache
no-cache属性表示,浏览器不使用特定的请求-响应缓存信息。浏览器存储缓存信息,而不是从缓存中读取内容,每一次都会向服务器发送请求。换句话来讲,缓存只是保留在浏览器中,对于攻击者或者恶意用来来讲就十分容易的读取到相关信息。
Cache-control: no-store
no-store属性表示,请求-响应不会被缓存或者存储到浏览器中。
使用HTML meta标签
你还可使用meta标签实现对缓存的控制,设置以下:
<meta http-equiv=”Cache-Control” content=”no-cache” /> <meta http-equiv=”Cache-Control” content=”no-store” />
若是在HTTP响应头中手动添加cache-control头,而且设置 no-cache。以下图所示,浏览器依旧会对页面进行缓存
若是访问浏览器缓存,那么咱们就能够在用户仪表盘中缓存页面中找到它。使用离线模式打开会显示详细的细节,以下图:
若是cache-control头设置为no-store, no-cache。咱们在用户仪表盘中就找不到了。
所以,开发者须要分析网页的内容以及调整适当的cache-control属性。
2. 浏览器内存中的密码
大多数的站点以及服务器使用hash或者Encrypt方式进行加密,但这种方式不适用于保存在浏览器内存中的密码。GET请求以及POST请求在浏览器内存中几乎就是透明的,攻击者可经过相似WinHex的工具查看到这些敏感信息。
验证
访问站点,输入有效的凭证,以下截图。
下面的截图显示了用户名以及密码传递给服务器
从网站中退出,但请不要关闭浏览器,而后打开相似WinHex的工具,定位到正确的路径。
首先打开内存
而后选择浏览器(本列中咱们使用的FireFox),选择全部内存
在数据中搜索用户名,咱们能够获取完整的登陆请求信息。
从这里开始,攻击者就能够盗取用户登陆凭证。
小贴士
这个问题出如今浏览器/本地机器上,使用SSL并不会下降危险性。用户并不能阻止浏览器记录密码或者其余一些敏感信息,这个问题的解决方法即是使用哈希加密。
下面是加盐哈希的工做流程:
存储在数据库中的MD5哈希密码。当一个用户请求登陆页面时,服务器随机生成一个数,这个数就被称为salt(盐)而后返回给用户的页面。一个Javascript脚本出如今用户机器上,对用户输入的密码进行MD5计算。接着加盐后再计算哈希值,这个哈希值会发送到服务器,服务器从数据库中选择密码的哈希值结合盐值并计算MD5值。若是这个值匹配,用户就成功登陆。
每一次的盐值都不尽相同,所以攻击者就算从浏览器中内存中获取到了哈希值,这个哈希值也是没用的。
另外一个实现方法,使用一个Javascript脚本实现当用户退出事后就强行关闭浏览器,这么作浏览器的内存就会被重置。
3. 返回刷新攻击
浏览器的返回功能,你们都熟悉。经过前进后退这个功能,咱们能够显示最近浏览的页面。此外,浏览器也会留意到像用户名,密码,银行卡帐号等变量。这是由于经过POST方式传送给服务器的同时对页面进行了抓取。若是用户登陆网站,执行一些操做事后退出了,攻击者在同一台机器上进行登陆,他是能够在浏览器窗口中看到注销页面的,而后他一直按后退按钮,直到显示成功登陆那个页面,而后单击刷新按钮,浏览器自动从新提交请求的全部信息。
验证
登陆到网页并进入修改密码的页面,输入当前密码,以及修改后的密码点击提交。
更改密码的一系列请求和响应,请看下面的截图
请求
响应
密码更改为功
浏览网页,而后注销,注销事后离开机器前没有关闭浏览器。若是攻击者能进行物理访问这台机器,只需简单的单击后退按钮的下拉菜单,只须要找到更改密码后的页面就好了。
当点击进入一个特殊的页面,浏览器会显示已通过期的警示页面。
此刻,攻击者就可使用浏览器代理工具,好比Burp并配置浏览器经过代理发送请求。
在错误页面中单击刷新按钮,浏览器会弹出一个提示窗口
使用配置好的代理工具,攻击者能够看到发送给服务器的请求,而且能够截取到用户的密码
变种攻击
网站成功登陆事后使用重定向,登陆页面含有验证码。若是用户使用正确的用户名及密码可是验证码错误,那么网站会返回到登陆页面,并提示用户错误信息。
在这种状况下,攻击者一样可使用后退和刷新功能盗取用户名密码。即便验证码错误,攻击者也可以获取像用户名以及密码这些敏感信息。
验证
访问网站的登陆页面,输入正确的用户名和错误的密码
对用户名以及密码验证事后,服务器响应“200 OK”和错误描述“用户名/密码错误”
单击后退按钮,访问之前可以正确登入的页面。
浏览器警告说,凭证过时了,同时要求用户从新发送数据到服务器。
在浏览器和服务器之间配置代理,对传输到服务器的数据进行拦截,而后点击发送按钮
用户的帐号密码能够经过明文显示给咱们
问题分析
在这个例子中,修改密码的页面为“changepass.aspx” 后面出现的页面是“changepass1.aspx”。“changepass1.aspx”页面是在提供当前密码以及新密码事后再出现的。因此,浏览器记录了发送到“changepass1.aspx”的请求。咱们来理一理整个顺序。
用户访问“changepass.aspx”页面。
用户输入当前密码,新的密码,最后确认新的密码。
密码以及提交请求发送到“changepass1.aspx”
用户在“changepass1.aspx”页面进行身份验证
当攻击者打开“changepass1.aspx”页面,请求就会发送到“changepass1.aspx”。这个请求里就包含了当前密码,新的密码以及确认的密码。
4. 自动保存
当用户提交帐号以及密码以后,浏览器会提示是否记住密码。若是用户单击“记住密码”,浏览器会存储密码,在下一次访问该站点时就会自动填写相关内容。这个功能确实是方便了用户,用户不须要记住过多的密码,可是若是用户是在公用机器上使用这个功能,那么后果又是怎样?攻击者能够十分轻松的找到帐号密码。
即便密码通过加密,或者是有一个主密码来保护(经过一个密码来访问存储的密码)。攻击者能够经过访问这个站点来检索存储在浏览器中的密码,攻击者只须要键入用户名,浏览器就会自动填充密码字段,只须要运行相似Burp的工具拦截浏览器请求就能够获取密码。
这里,输入用户名和密码以后,浏览器弹出提示咱们是否保存密码
若是用户确认保存密码以后,密码就会存储到浏览器中。在FireFox中你能够经过点击工具→选项→安全→保存的密码
如今假设浏览器中保存的密码有一个主密码来管理,只有经过密码验证以后才能看到上面截图中的信息
在这个例子中,攻击者须要一个中间代理工具来拦截传送到服务器的请求。
到站点中,双击用户名字段的表框,它就会显示存储的用户名列表。点击其中一个用户名,在密码字段浏览器就会自动填写了,从拦截请求中能够十分容易的找到帐号以及密码信息。
小贴士
在目前绝大多数浏览器产品的最新版本中,这个自动保存功能依旧存在。在这个特容易撞库的年代,密码多了确实很差记,这个就看你们本身的取舍了。
5. 浏览器历史记录
当用户提交数据的时候,不是GET请求就是POST请求。GET请求的话是能够经过观察URL自己发现端倪的,然而POST请求存在于请求的主体,如下两张截图就显示了GET请求以及POST请求的用户数据。
因此的GET请求均可以经过浏览器的历史记录以及缓存进行访问,即便注销并关闭浏览器,这些数据也是能够经过历史记录查看的。
GET request:
POST request:
验证
用户在填写了用户名和密码以后,点击登入按钮,这里会提交一个GET请求
使用Burp拦截请求,截图以下
因此,攻击者能够经过历史记录获取信息
一样的,若是站点经过GET方式发送敏感信息,攻击者也是能够经过浏览器历史查看到的。
小贴士
让不使用GET方式发送敏感信息,成为咱们不说的秘密!