第二章 浏览器安全
同源策略
1、同源策略,
它是由Netscape提出的一个著名的安全策略。
所有支持JavaScript的浏览器都会使用这个策略。
同源是指,域名,协议,端口相同。
当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。
如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。
同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收。
影响“源”的因素有:host(域名或IP地址,如果是IP地址则看做一个根域名)、子域名、端口、协议。 注:对于当前页面来说,页面内存放JavaScript文件的域并不重要,重要的是加载JavaScript页面所在的域是什么。
2、存在问题
浏览器的同源策略也有可能被绕过,成为跨域漏洞。eg:
www.a.com/test.html:
<body>
{ }body{font-family:
bbbbbbbbbbbbbb
</body>
www.b.com/test2.html:
<style>
@import url("http://www.a.com/test.html");
</style>
<script>
setTimeout(function(){
var t=document.body.currentStyle.fontFamily;
alert(t);
},2000);
</script>
3、
1、在网页中插入一段恶意代码,利用浏览器漏洞执行任意代码的攻击方式,形象的成为“挂马”。
针对“挂马”的方法:1、浏览器结合一些操作系统提供保护技术,对抗内存攻击。2、浏览器的多进程架构( 相对于单进程浏览器,在发生崩溃时多进程浏览器只会崩当前Tab页,而单进程整个浏览进程会崩 )。
2、Sandbox(沙箱):泛指“资源隔离类模块”的代名词。
目的:为了让不可信任的代码运行在一定的环境中,限制不可信任的代码访问隔离区之外的资源。如果必须跨过Sandbox边界产生数据交换,则只能通过指定的数据通道。
4、恶意网址拦截
1、恶意网址拦截的工作原理:
一般都是浏览器周期性地从服务器端获取一份最新的恶意网址黑名单,如果用户上网时访问的网址存在于此黑名单中,浏览器就会弹出一个警告页面。
2、常见的恶意网址分为两类:
一类是挂马网站,这些网站通常包含有恶意的脚本如JavaScript或Flash,通过利用浏览器的漏洞(包括一些插件、控件漏洞)执行shellcode1 ,在用户电脑中植入木马
另一类是钓鱼网站,通过模仿知名网站的相似页面来欺骗用户。
3、浏览器目前只以推送恶意网址黑名单为主,浏览器收到黑名单后对用户访问的黑名单进行拦截而很少直接从浏览器收集数据,或者在客户端建立模型。原因是:
(1)要识别这两种网站,需要建立许多基于页面特征的模型,而这些模型显然是不适合放在客户端的,因为这会让攻击者得以分析、研究并绕过这些规则。
(2)对于用户基数巨大的浏览器来说,收集用户访问过的历史记录也是一种侵犯隐私的行为,且数目过于庞大。
PhishTank是互联网上免费提供恶意网址黑名单的组织之一,它的黑名单由世界各地的志愿者提供,且更新频繁。
除了恶意网址黑名单拦截功能外,主流浏览器都开始支持EV SSL证书(Extented Validation SSL Certificate),以增强对安全网站的识别。
微软在IE8中推出了XSS Filter功能,当用户访问的URL(统一资源定位符:是Internet上标准资源的地址。URL指示资源的位置以及用于访问它的协议。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的具体位置。)中包含了XSS攻击的脚本时,IE就会修改其中的关键字符使得攻击无法成功完成,并对用户弹出提示框。
第三章 跨站脚本攻击(XSS)
1:简介
跨站脚本攻击(Cross Site Script),XSS攻击,通常指黑客通过“HTML注入”篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
XSS长期以来是Web的“头号大敌”,因为XSS破坏力强大,且产生的场景复杂,难以一次性解决。
(针对各种不同场景产生的XSS,需要区分情景对待。即便如此,复杂的应用环境仍产生XSS)
假设一个页面把用户输入的参数直接输出到页面上:
<?php
$input=$_GET["param"];
echo"<div>";
?>
在正常情况下,用户向param提交的数据会展示到页面中,比如提交:
http://www.a.com/test.php?param=这是一个测试!
此时查看页面源代码,可以看到:
<div>这是一个测试!</div>
但是如果提交一段HTML代码:
http://www.a.com/test.php?param=<script>alert(/xss/)</script>
会发现alert(/xss/)在当前页面执行了“拦截”:包含了xss攻击的用户请求结果
再查看源代码:
<div><script>alert(/xss/)</script></div>
2、XSS类型
1、反射型XSS
反射型XSS只是简单地把用户输入的数据“反射“给浏览器看。也就是说,黑客往往需要诱使用户”点击“一个恶意链接,才能攻击成功。反射型XSS也叫作”非持久型XSS“(Non-persistent XSS)。
2、存储型XSS
存储型XSS会把用户输入的数据“存储“在服务器端。这种XSS具有很强的稳定性。
3、DOM Based XSS
实际上,这种类型的XSS并非按照“数据是否保存在服务器端”来划分,DOM Based XSS从效果上来说也是反射型XSS。
单独划分出来是因为DOM Based XSS的形成原因比较特别。
通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS。
c练习
1、我们要求找出具有下列性质数的个数(包含输入的自然数nnn):
先输入一个自然数nnn(n≤1000n \le 1000n≤1000),然后对此自然数按照如下方法进行处理:
(1)、不作任何处理;
(2)、在它的左边加上一个自然数,但该自然数不能超过原数的一半;
(3)、加上数后,继续按此规则进行处理,直到不能再加自然数为止.
#include <stdio.h>
int n,cnt=1;
void func(int x){
for(int i=1;i<=x/2;i++){
cnt++;
func(i);
}
}
int main(){
scanf("%d",&n);
func(n);
printf("%d\n",cnt);
}
2、有一个箱子容量为V,同时有n个物品,每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
#include <stdio.h>
int m,n;
int f[20010];
int w[40];
int main()
{
int i,j;
scanf("%d%d",&m,&n);
for(i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
for(i=1;i<=n;i++)
{
for(j=m;j>=w[i];j--)
{
if(f[j]<f[j-w[i]]+w[i])
{
f[j]=f[j-w[i]]+w[i];
}
}
}
printf("%d\n",m-f[m]);
}
3、大整数的加法
将一个有n位的大数存入数组,每个数组的一个元素表示一位十进制数,再按十进制由低到高逐位相加,同时考虑进位。
#include <stdio.h>
#include <string.h>
int main()
{
char a[201],b[201];//最长200位
int i,j,k,m,n;
scanf("%s",a);
scanf("%s",b);
m=strlen(a);
k=n=strlen(b);
if(m>k) k=m; //k是两个字符串长度的最大值
a[k+1]=0;
for(i=0;i<k;i++) a[k-i]=a[m-i-1];//使数组a的字符串以a[k]右对齐
for(i=0;i<=k-m;i++) a[i]='0';//使数组a的高位补
for(i=0;i<k;i++) b[k-i]=b[n-i-1];//使数组b的字符串以b[k]右对齐
for(i=0;i<=k-n;i++) b[i]='0';//使数组b的高位补
j=0;
for(i=0;i<k;i++)
{
j=(a[k-i]+b[k-i]+j-96); //数字字符转换为整形数据相加
a[k-i]=j%10+48;
j=j/10;
}
if(a[0]=='0')
printf("%s\n",a+1);
else
printf("%s\n",a);
}
——web安全内容参考《白帽子讲web安全》
Shellcode通过发信站漏洞来获取权限并且作为数据发送给受攻击服务的。
Shellcode是溢出程序和蠕虫病毒的核心,它攻击的主要是没有修补漏洞的电脑,所以漏洞修补对电脑保护还是很重要的。 ↩︎