我理解的回调与同源方法执行漏洞(SOME)浅析

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yanghuan313/article/details/53829453

0x00 before

以前一直对回调有些迷糊,似懂非懂,虽然能明白用法和原理,但总有些小疑问,比如,为啥偏要用回调。今天集中看了很多博客,再配合上SOME的理解,感觉收获颇多,故给大家一起分享。

0x01 什么是JS的回调函数

见网上有人说:函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调。

其实并不全对,函数a执行过程中执行了函数b,那也是回调。在我觉得回调的关键其实就是在正常处理的函数体中,去嵌套一个可变的灵活函数来辅助我们完成一些复杂的工作。

语言太乏力,代码见人心:

//这是一个正常函数
function people(weapon) {
    alert("我是一个兵!");
    weapon();
}
//准备回调的函数A
var A = function (){
    alert("我有一把手枪!");
}
//准备回调的函数B
var B = function (){
    alert("我有一挺机关枪!");
}

people(A)  //这是一个装备了手枪的士兵
people(B)  //这是一个装备了机关枪的士兵

上面就是一个最简单的回调。

以前我一直有个疑问,这不是多此一举吗,直接调用函数也可以办到啊!为什么要这么做呢?

其实回调的第一个好处就是:灵活! 你想想,如果你写死了代码,以后想为士兵换武器怎么办?在这里,将需要调用的函数当作参数传给一个”正常“的函数,我们就可以在不修改原功能代码的情况下,随意扩展!

仅仅是这样?那也只是按顺序执行了一个自定义的函数而已,感觉和回调这两个完全没有关系啊!

0x02 异步回调,方显真正威力

的确,上面的例子完全没有体现出回调的魅力,至少,回调中的”回”字,我们并没有一个直观的感受。

其实回调也分两种,同步回调和异步回调,刚刚的就是同步回调,函数按顺序执行,只不过是有一个自定义的函数功能,其它语言里指针和引用其实也可以做到类似的功能。

我觉得JS中的回调真正厉害的地方是异步的回调,它不仅让我们可以自定义处理的函数,还可以让我们决定什么时候触发这个函数,并且主进程不会因为这个函数而阻塞。

//当状态改变时触发回调函数
xmlhttp.onreadystatechange = function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    //do something
    }
  }
xmlhttp.open("GET","test.txt",true);
xmlhttp.send();

这是一部分最熟悉不过的AJAX代码,其中最核心的地方就是依靠onreadystatechange来触发回调函数,我们才可以异步的进行请求和处理,这一小段代码可是极大的推动了Web的发展。

而且从上面这段代码我们也可以看出来,整个流程不会因为回调函数而阻塞,会等到条件满足时(即状态改变时)再回过头来处理,JS为这些异步回调函数都新建线程,分别完成各自的事务。换做其它语言,你多半得自己进行多线程处理,监听状态,完成调用,还要考虑并发中的同步和互斥问题,想想就觉得是一场噩梦。

0x03 有个用来跨域的东西叫JSONP

跨域通信不过七大方法(document.domain、片段标识符、window.name、window.postMessage(包括读写LocalStorage)、WebSocket、CORS和JSONP),其中最为常用的便是JSONP,一般用它来配合AJAX跨域异步请求数据。它是普通AJAX的跨域改进型,除了多了跨域功能外,使用方法没有任何区别。它有个很大的优点,兼容!虽然CORS现在比它强大,但也不是所有站点和浏览器都支持。比如我在站点 a.test.com ,我现在需要向api.test.com 请求数据,这时一般会用到JSONP,方便,快捷。

下面是一个简单的例子:

function addScriptTag(src) {
  var script = document.createElement('script');
  script.src = src;
  document.body.appendChild(script);
}

window.onload = function () {
  addScriptTag('http://api.test.com/what?callback=evil');
}

function evil(data) {
  alert(data);
};

JSONP只支持GET请求,所以上面核心的地方很简单,就是在请求URL后加一个callback参数,告诉服务器和客户端,当得到响应的数据后,用哪个函数去解析它。

返回的数据类似于这样的:

evil({"a":1, "b":2})

中间的数据就是服务器返回的json数据,我们用回调的话相当于把数据当作对象处理(JS一切都是对象嘛),然后免去了手动解析json的步骤,简直方便好用,代码还很少。

0x04 滥用回调造成的SOME

什么是SOME?

同源 方法执行漏洞,注意我的断句,意思就是利用同源页面的callback回调缺陷,来执行一些用户不愿意执行的敏感操作。这听起来其实有点像CSRF,但它比CSRF更进一步,用它执行的敏感操作和正常的操作没什么两样。

通俗一点来解释,当我们完成了某个操作请求,浏览器执行回调函数时,执行的函数名就是请求中callback参数对应的值,这个GET请求一般是由页面中的JS发出的,但如果我们能够控制callback参数的值,想想会发生什么?

举个例子:

http://test.com/login?callback=show/

这是一个常见的登陆URL,用户用这个URL完成登陆以后,跳转到首页,此时服务器返回如下响应:

......
......
<script src="http://api.test.com/profile?userid=123465&callback=show"></script>
<script>function show(data){ ...do something ...}</script>
......
......

上面是一个JSONP的跨域请求,看起来没有什么不对,服务器返回数据以后就会执行show函数直接解析数据,这一切都很美好。

但当我们把最开始callback参数改一下会有什么影响?
1. 如果服务器直接拼接用户输入的参数到响应中,我们可以XSS。
2. 即使它做了过滤,我们可以把函数改为本页面中的一些敏感函数。
3. 就算没有敏感函数,我们还可以利用JS的DOM操作来完成对该页面上任意节点的访问(比如某个重要按钮的click点击事件)。

感觉这种情况不太容易让用户上当?或者这种情况不太常见?

0x05 我来帮你打开页面

浏览器中window对象下有个属性叫opener,假如在A页面中点击链接或者用JS的window.open方法打开了一个新标签页面B,那么B页面此时就可以用window.opener.document来操纵A页面了(当然大前提是同源),不同源的话依旧可以对A页面的location进行写操作。

有了以上基础,我们的利用场景变宽了许多。

此时假设我们有一个页面A,当用户点击时,先打开一个我们的页面B,再导航到一个想操纵的敏感页面:

页面A:

<script>
function evil() {
 window.open("B.html");
 location.replace("http://secrect.com/action/");
}
setTimeout(evil,1000);
</script>

敏感页面:

<html>
<head>
</head>
<body>
<form action="...">
<input type="submit" value="敏感操作">
</form>
</body>
</html>

此时页面B将等待页面A成功导航到敏感页以后,自己导航到一个存在SOME漏洞的页面:

页面B:

<script>
function waitForA() {
      location.replace("http://secrect.com/vulnerability?callback=window.opener.document.body.firstChild.firstChild.click");    
}
setTimeout(waitForA,3000);
</script>

请求响应成功后,页面A的敏感操作被执行。

在3秒钟内,用户最开始只是点了一个页面A的链接,接着便通过SOME漏洞完成了敏感操作。

0x06 小结

写这篇博客就是想对回调和SOME做一个简单的总结,印象深刻一些,同时自己的理解也能更进一步。

如果有不对之处,还望大家指出。

参考:
http://www.2cto.com/article/201607/528197.html
http://www.mottoin.com/91299.html
http://bobao.360.cn/learning/detail/463.html
http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html

展开阅读全文

Linux内核漏洞浅析

10-05

创建时间:2004-10-26rn文章属性:转载rn文章提交:sunwear (btwlu_at_163.com)rnrn与Windows 相比,Linux被认为具有更好的安全性和其他扩展性能。这些特性使得Linux在操作系统领域异军突起,得到越来越多的重视。随着Linux应用量的增加,其安全性也逐渐受到了公众甚或黑客的关注。那么,Linux是否真的如其支持厂商们所宣称的那样安全呢?本期我们请到了启明星辰信息技术有限公司积极防御实验室工程师赵伟,对Linux进行专业的漏洞技术分析。rnrnrnLinux内核精短、稳定性高、可扩展性好、硬件需求低、免费、网络功能丰富、适用于多种cpu等特性,使之在操作系统领域异军突起。其独特的魅力使它不仅在pc机上占据一定的份额,而且越来越多地被使用在各种嵌入式设备中,并被当作专业的路由器,防火墙,或者高端的服务器OS来使用。各种类型的 Linux发行版本也如雨后春笋般冒了出来,国内更是掀起了Linux的使用热潮,很多政府部门因安全需要也被要求使用Linux。正是因为Linux被越来越多地使用,其安全性也渐渐受到了公众的关注,当然,也更多地受到了黑客的关注。通常,我们讨论Linux系统安全都是从Linux安全配置的角度或者Linux的安全特性等方面来讨论的,而这一次我们转换一下视角,从Linux系统中存在的漏洞与这些漏洞产生的影响来讨论Linux的安全性。rnrnrn首先来说明一下这次我们讨论Linux系统安全的范围,其实通常我们所说的Linux是指GNU/Linux系统,Linux是系统中使用的操作系统内核。这一次我们重点从Linux系统内核中存在的几类非常有特点的漏洞来讨论Linux系统的安全性。rnrnrnrn权限提升类漏洞rnrnrn一般来说,利用系统上一些程序的逻辑缺陷或缓冲区溢出的手段,攻击者很容易在本地获得Linux服务器上管理员权限root;在一些远程的情况下,攻击者会利用一些以root身份执行的有缺陷的系统守护进程来取得root权限,或利用有缺陷的服务进程漏洞来取得普通用户权限用以远程登录服务器。目前很多 Linux服务器都用关闭各种不需要的服务和进程的方式来提升自身的安全性,但是只要这个服务器上运行着某些服务,攻击者就可以找到权限提升的途径。下面是一个比较新的导致权限提升的漏洞。rnrnrndo_brk()边界检查不充分漏洞在2003年9月份被Linux内核开发人员发现,并在9月底发布的Linux kernel 2.6.0-test6中对其进行了修补。但是Linux内核开发人员并没有意识到此漏洞的威胁,所以没有做任何通报,一些安全专家与黑客却看到了此漏洞蕴涵的巨大威力。在2003年11月黑客利用rsync中一个未公开的堆溢出与此漏洞配合,成功地攻击了多台Debian与Gentoo Linux的服务器。rnrnrn下面让我们简单描述一下该漏洞。该漏洞被发现于brk系统调用中。brk系统调用可以对用户进程的堆的大小进行操作,使堆扩展或者缩小。而brk内部就是直接使用do_brk()函数来做具体的操作, do_brk()函数在调整进程堆的大小时既没有对参数len进行任何检查(不检查大小也不检查正负),也没有对addr+len是否超过 TASK_SIZE做检查。这样我们就可以向它提交任意大小的参数len,使用户进程的大小任意改变以至可以超过TASK_SIZE的限制,使系统认为内核范围的内存空间也是可以被用户访问的,这样的话普通用户就可以访问到内核的内存区域。通过一定的操作,攻击者就可以获得管理员权限。这个漏洞极其危险,利用这个漏洞可以使攻击者直接对内核区域操作,可以绕过很多Linux系统下的安全保护模块。rnrnrn此漏洞的发现提出了一种新的漏洞概念,即通过扩展用户的内存空间到系统内核的内存空间来提升权限。当发现这种漏洞时,通过研究我们就认为内核中一定还会存在类似的漏洞,果然几个月后黑客们又在Linux内核中发现与brk相似的漏洞。通过这次成功的预测,更证实了对这种新型的概念型漏洞进行研究很有助于安全人员在系统中发现新的漏洞。rnrnrnrn拒绝服务类漏洞rnrnrn拒绝服务攻击是目前比较流行的攻击方式,它并不取得服务器权限,而是使服务器崩溃或失去响应。对Linux的拒绝服务大多数都无须登录即可对系统发起拒绝服务攻击,使系统或相关的应用程序崩溃或失去响应能力,这种方式属于利用系统本身漏洞或其守护进程缺陷及不正确设置进行攻击。rnrnrn另外一种情况,攻击者登录到Linux系统后,利用这类漏洞,也可以使系统本身或应用程序崩溃。这种漏洞主要由程序对意外情况的处理失误引起,如写临时文件之前不检查文件是否存在,盲目跟随链接等。rnrnrn下面,我们简单描述一下Linux在处理intel IA386 CPU中的寄存器时发生错误而产生的拒绝服务漏洞。该漏洞是因为IA386多媒体指令使用的寄存器MXCSR的特性导致的。由于IA386 CPU规定MXCSR寄存器的高16位不能有任何位被置位,否则CPU就会报错导致系统崩溃。为了保证系统正常运转,在linux系统中有一段代码专门对 MXCSR的这个特性作处理,而这一段代码在特定的情况下会出现错误,导致MXCSR中的高16位没有被清零,使系统崩溃。如果攻击者制造了这种“极限” 的内存情况就会对系统产生DoS效果。rnrnrn攻击者通过调用get_fpxregs函数可以读取多媒体寄存器至用户空间,这样用户就可以取得MXCSR寄存器的值。调用set_fpxregs函数可以使用用户空间提供的数据对MXCSR寄存器进行赋值。通过对MXCSR的高16位进行清0,就保证了IA386 CPU的这个特性。如果产生一种极限效果使程序跳过这一行,使MXCSR寄存器的高16位没有被清0,一旦MXCSR寄存器的高16位有任何位被置位,系统就会立即崩溃!rnrnrn因为利用这个漏洞攻击者还需要登录到系统,这个漏洞也不能使攻击者提升权限,只能达到DoS的效果,所以这个漏洞的危害还是比较小的。但是分析这个漏洞就没有意义了吗?其实由分析这个漏洞可以看出:Linux内核开发成员对这种内存拷贝时出现错误的情况没有进行考虑,以至造成了这个漏洞,分析了解了这个漏洞后,在漏洞挖掘方面也出现了一种新的类型,使我们在以后的开发中可以尽量避免这种情况。rnrnrn接下来让我们看一种Linux内核算法上出现的漏洞。先来简单介绍一下这个漏洞,当Linux系统接收到攻击者经过特殊构造的包后,会引起hash表产生冲突导致服务器资源被耗尽。这里所说的hash冲突就是指:许多数值经过某种hash算法运算以后得出的值相同,并且这些值都被储存在同一个hash槽内,这就使hash表变成了一个单向链表。而对此hash表的插入操作会从原来的复杂度O(n)变为O(n*n)。这样就会导致系统消耗巨大的cpu资源,从而产生了DoS攻击效果。rnrn我们先看一下在linux中使用的hash算法,这个算法用在对Linux route catch的索引与分片重组的操作中。在今年五月Rice University计算机科学系的Scott A. Crosby与Dan S. Wallach提出了一种新的低带宽的DoS攻击方法,即针对应用程序所使用的hash算法的脆弱性进行攻击。这种方法提出:如果应用程序使用的hash 算法存在弱点,也就是说hash算法不能有效地把数据进行散列,攻击者就可以通过构造特殊的值使hash算法产生冲突引起DoS攻击。rnrnrn202rnrn203 static __inline__ unsigned rt_hash_code(u32 daddr, u32 saddr, u8 tos)rnrn204 rnrn205 unsigned hash = ((daddr & 0xF0F0F0F0) >> 4) │rnrn206 ((daddr & 0x0F0F0F0F) << 4);rnrn207 hash ^= saddr ^ tos;rnrn208 hash ^= (hash >> 16);rnrn209 return (hash ^ (hash >> 8)) & rt_hash_mask;rnrn210 rnrnrn以上的代码就是Linux对ip包进行路由或者重组时使用的算法。此算法由于过于简单而不能把route缓存进行有效的散列,从而产生了DoS漏洞。下面我们来分析一下此函数。rnrnrn203行为此函数的函数名与入口参数,u32 daddr为32位的目的地址,而u32 saddr为32位的原地址,tos为协议。rnrn205行-206行是把目标地址前后字节进行转换。rnrn207行把原地址与tos进行异或后再与hash异或然后再赋值给hash。rnrn208行把hash的值向右偏移16位然后与hash异或再赋值给hash。rnrn209行是此函数返回hash与它本身向右偏移8位的值异或,然后再跟rt_hash_mask进行与操作的值。rnrnrn这种攻击是一种较为少见的拒绝服务方式,因为它利用了系统本身的算法中的漏洞。该漏洞也代表了一种新的漏洞发掘的方向,就是针对应用软件或者系统使用的 hash算法进行漏洞挖掘。因此,这种针对hash表攻击的方法对不仅对Linux,而且会对很多应用软件产生影响,比如说Perl5在这个perl的版本中使用的hash算法就容易使攻击者利用精心筛选的数据,使用perl5进行编程的应用程序使用的hash表产生hash冲突,包括一些代理服务器软件,甚至一些IDS软件,防火墙等,因使用的是Linux内核都会被此种攻击影响。rnrnrnrnLinux内核中的整数溢出漏洞rnrnrnLinux Kernel 2.4 NFSv3 XDR处理器例程远程拒绝服务漏洞在2003年7月29日公布,影响Linux Kernel 2.4.21以下的所有Linux内核版本。rnrnrn该漏洞存在于XDR处理器例程中,相关内核源代码文件为nfs3xdr.c. 此漏洞是由于一个整形漏洞引起的(正数/负数不匹配)。攻击者可以构造一个特殊的XDR头(通过设置变量int size为负数)发送给Linux系统即可触发此漏洞。当Linux系统的NFSv3 XDR处理程序收到这个被特殊构造的包时,程序中的检测语句会错误地判断包的大小,从而在内核中拷贝巨大的内存,导致内核数据被破坏,致使Linux系统崩溃。rnrnrn漏洞代码:rnrnstatic inline u32 *rnrndecode_fh(u32 *p, struct svc_fh *fhp)rnrnrnrnint size;rnrnfh_init(fhp, NFS3_FHSIZE);rnrnsize = ntohl(*p++);rnrnif (size > NFS3_FHSIZE)rnrnreturn NULL;rnrnrnmemcpy(&fhp->fh_handle.fh_base, p, size); fhp->fh_handle.fh_size = size;rnrnreturn p + XDR_QUADLEN(size);rnrnrnrnrn因为此内存拷贝时在内核内存区域中进行,会破坏内核中的数据导致内核崩溃,所以此漏洞并没有证实可以用来远程获取权限,而且利用此漏洞时攻击者必须可以mount此系统上的目录,更为利用此漏洞增加了困难。rnrn我们的目的在于通过这个漏洞的特点来寻找此种类型的漏洞并更好地修补它。大家可以看到,该漏洞是一个非常典型的整数溢出漏洞,如果在内核中存在这样的漏洞是非常危险的。所以Linux的内核开发人员对Linux内核中关于数据大小的变量都作了处理(使用了unsigned int),这样就避免了再次出现这种典型的整数溢出。通过对这种特别典型的漏洞原理进行分析,开发人员可以在以后的开发中避免出现这种漏洞。rnrnrnrnIP地址欺骗类漏洞rnrnrn由于tcp/ip本身的缺陷,导致很多操作系统都存在tcp/ip堆栈漏洞,使攻击者进行ip地址欺骗非常容易实现。Linux也不例外。虽然IP地址欺骗不会对Linux服务器本身造成很严重的影响,但是对很多利用Linux为操作系统的防火墙和IDS产品来说,这个漏洞却是致命的。rnrnrnIP地址欺骗是很多攻击的基础,之所以使用这个方法,是因为IP自身的缺点。IP协议依据IP头中的目的地址项来发送IP数据包。如果目的地址是本地网络内的地址,该IP包就被直接发送到目的地。如果目的地址不在本地网络内,该IP包就会被发送到网关,再由网关决定将其发送到何处。这是IP路由IP包的方法。IP路由IP包时对IP头中提供的IP源地址不做任何检查,认为IP头中的IP源地址即为发送该包的机器的IP地址。当接收到该包的目的主机要与源主机进行通信时,它以接收到的IP包的IP头中IP源地址作为其发送的IP包的目的地址,来与源主机进行数据通信。IP的这种数据通信方式虽然非常简单和高效,但它同时也是IP的一个安全隐患,很多网络安全事故都是由IP的这个缺点而引发的。rnrnrn黑客或入侵者利用伪造的IP发送地址产生虚假的数据分组,乔装成来自内部站的分组过滤器,这种类型的攻击是非常危险的。关于涉及到的分组真正是内部的,还是外部的分组被包装得看起来像内部分组的种种迹象都已丧失殆尽。只要系统发现发送地址在自己的范围之内,就把该分组按内部通信对待并让其通过。rnrnrn通常主机A与主机B的TCP连接是通过主机A向主机B提出请求建立起来的,而其间A和B的确认仅仅根据由主机A产生并经主机B验证的初始序列号ISN。具体分三个步骤。rnrnrn主机A产生它的ISN,传送给主机B,请求建立连接;B接收到来自A的带有SYN标志的ISN后,将自己本身的ISN连同应答信息ACK一同返回给A;A再将B传送来的ISN及应答信息ACK返回给B。至此,正常情况下,主机A与B的TCP连接就建立起来了。rnrnrnB ---- SYN ----> ArnrnB <---- SYN+ACK ---- ArnrnB ---- ACK ----> Arnrnrn假设C企图攻击A,因为A和B是相互信任的,如果C已经知道了被A信任的B,那么就要想办法使得B的网络功能瘫痪,防止别的东西干扰自己的攻击。在这里普遍使用的是SYN flood。攻击者向被攻击主机发送许多TCP- SYN包。这些TCP-SYN包的源地址并不是攻击者所在主机的IP地址,而是攻击者自己填入的IP地址。当被攻击主机接收到攻击者发送来的TCP- SYN包后,会为一个TCP连接分配一定的资源,并且会以接收到的数据包中的源地址(即攻击者自己伪造的IP地址)为目的地址向目的主机发送TCP- (SYN+ACK)应答包。由于攻击者自己伪造的IP地址一定是精心选择的不存在的地址,所以被攻击主机永远也不可能收到它发送出去的TCP-(SYN+ ACK)包的应答包,因而被攻击主机的TCP状态机处于等待状态。如果被攻击主机的TCP状态机有超时控制的话,直到超时,为该连接分配的资源才会被回收。因此如果攻击者向被攻击主机发送足够多的TCP-SYN包,并且足够快,被攻击主机的TCP模块肯定会因为无法为新的TCP连接分配到系统资源而处于服务拒绝状态。即使被攻击主机所在网络的管理员监听到了攻击者的数据包也无法依据IP头的源地址信息判定攻击者是谁。rnrnrn当B的网络功能暂时瘫痪时, C必须想方设法确定A当前的ISN。首先连向25端口,因为SMTP是没有安全校验机制的,与前面类似,不过这次需要记录A的ISN,以及C到A的大致的 RTT(round trip time)。这个步骤要重复多次以便求出RTT的平均值。一旦C知道了A的ISN基值和增加规律,就可以计算出从C到A需要RTT/2 的时间。然后立即进入攻击,否则在这之间有其他主机与A连接,ISN将比预料的多。rnrnrnC向A发送带有SYN标志的数据段请求连接,只是信源IP改成了B。A向B回送SYN+ACK数据段,B已经无法响应,B的TCP层只是简单地丢弃A的回送数据段。这个时候C需要暂停一小会儿,让A有足够时间发送SYN+ACK,因为C看不到这个包。然后C再次伪装成B向A发送ACK,此时发送的数据段带有C预测的A的ISN+1。如果预测准确,连接建立,数据传送开始。问题在于即使连接建立,A仍然会向B发送数据,而不是C,C仍然无法看到A发往B的数据段,C必须蒙着头按照协议标准假冒B向A发送命令,于是攻击完成。如果预测不准确,A将发送一个带有RST标志的数据段异常终止连接,C只有从头再来。随着不断地纠正预测的ISN,攻击者最终会与目标主机建立一个会晤。通过这种方式,攻击者以合法用户的身份登录到目标主机而不需进一步的确认。如果反复试验使得目标主机能够接收对网络的ROOT登录,那么就可以完全控制整个网络。rnrnrnC(B) ---- SYN ----> ArnrnB <---- SYN+ACK ---- ArnrnC(B) ---- ACK ----> ArnrnC(B) ---- PSH ----> ArnrnrnIP欺骗攻击利用了RPC服务器仅仅依赖于信源IP地址进行安全校验的特性,攻击最困难的地方在于预测A的ISN。攻击难度比较大,但成功的可能性也很大。C必须精确地预见可能从A发往B的信息,以及A期待来自B的什么应答信息,这要求攻击者对协议本身相当熟悉。同时需要明白,这种攻击根本不可能在交互状态下完成,必须写程序完成。当然在准备阶段可以用netxray之类的工具进行协议分析。rnrnrnrn总 结rnrnrn通过分析上面的几个漏洞大家也可以看到Linux并不是完美的,还有很多的地方需要完善。有些漏洞极大地影响了Linux的推广和使用,例如上面那个 Linux hash表冲突的漏洞,因为一些IDS厂商和防火墙厂商就是基于Linux内核来开发自己的产品,如果还是使用的Linux本身的hash算法就会受到这种漏洞的影响,极易被攻击者进行DoS攻击。因为防火墙、IDS本身就是安全产品,如果它们被攻击就会使用户产生极大的损失,所以我们需要对这些漏洞进行跟踪分析,并通过了解它们的特性以避免在系统中再次产生这些类型的漏洞,通过对这些类型的漏洞进行预测挖掘,使我们能积极地防御黑客的攻击破坏。rnrnrn作者简介rnrnrn赵伟 2003年就职于启明星辰积极防御实验室,SST成员,国家计算机网络安全事件应急小组(CNCERT/CC)成员。主要研究方向:Unix/Linux 漏洞挖掘,Unix/Linux应用系统安全,Linux内核漏洞挖掘,Linux HIDS的开发和事件研究,XML相关安全。参与过多项计算机犯罪取证,计算机容灾系统等相关的国家项目与863项目。 论坛

浅析ASP上传漏洞

09-26

这两天连续两个大维护的大的网站被黑,都是由上传漏洞所引起的。rn所以特来发贴[color=#FF0000]讨论[/color] ASP上传漏洞。rnrn 对于上传漏洞的查找,仍是从源文件入手,目标有两个,一个是FilePath(文件路径),另一个则是FileName(文件名称)。 rn我看了有关的资料,主要也就是通过以下要过滤的字符下手。rn[code=VBScript]rnPrivate Function FixName(Byval UpFileExt) '第一步的过滤函数,过滤特殊扩展名。 rnIf IsEmpty(UpFileExt) Then Exit Function '如扩展名为空就退出交互 rnFixName = Lcase(UpFileExt) '将扩展名转换为小写字符。 rnFixName = Replace(FixName,Chr(0),"") '将二进制的00空字符过滤为空 rnFixName = Replace(FixName,".","") '将单引号过滤为空,下同。 jmdcw rnFixName = Replace(FixName,"'","") rnFixName = Replace(FixName,"asp","") rnFixName = Replace(FixName,"asa","") rnFixName = Replace(FixName,"aspx","") rnFixName = Replace(FixName,"cer","") rnFixName = Replace(FixName,"cdx","") rnFixName = Replace(FixName,"htr","") rnFixName = Replace(FixName,"shtml","") rnEnd Function rn[/code]rnrn第一关就是过滤上面的字符,rn第二关rn[code=VBScript]rnif fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then ' 第二关,验证fileEXT是否为asp、asa、aspx扩展名。rnEnableUpload=false '果属于这三项之一,那么EnableUpload就定义为假,上传文件扩展名不合法。end if rn[/code]rn第三关rn[code=VBScript]rnif EnableUpload=false then '第三关,验证关。如果传递到此的EnableUpload变量为假,则说明上传文件扩展名不合法。 rnmsg="这种文件类型不允许上传!\n\n只允许上传这几种文件类型:" & UpFileType rnFoundErr=true '注意:因为文件名不合法,就更改了FoundErr值,由初始的false改为true。 rnend if rn[/code]rn第四关rn[code=VBScript]rnif FoundErr<>true then '第四关,上传关。如果FoundErr不等于true才可以上传。rn[/code]rnrn上面的方法可以说是很严密了,但是我在我的网站里看了后缀为jpg的文件,就是上传上出的,改变后缀一看代码如下:rn[code=HTML]rnhtml> rnrn rn[/code]rnrn那我就在想jpg格式是允许上传的,那这样防来防去不是白忙一场,本人想知道怎么样避免这种问题,还有就是大家来讨论一下asp的上传漏洞,大家互相提高 论坛

没有更多推荐了,返回首页