|
<%=(int(rnd()*1)+1)%>您当前的位置:中国安全在线cnsafer.com 请进入[技术论坛]发表评论 阅读提示:
在网络安全方面原理性的东西看起来都是很高深的,而且很枯燥,不及做试验那么爽,那么直观、刺激,其实仔细总结一下收获也是很大的。如果看完下面的能给你一点启发,我的口水也会很欣慰的流下了!以下仅代表本人观点。
一、变量过滤的重要性
变量过滤在网络安全中起着越来越重要的作用,一次次令忽略它的人付出了惨痛的代价。从几个例子来看一下,注意文中提到的变量。
先提一下时下很流行的脚本。两个重大的发现:注入和上传漏洞。从本质上看两者都是一样的――变量过滤不严,只是变量有所不同,被注入的变量有数字型和字符型之分,上传漏洞中利用的主要是上传路径这个变量。下面是几个典型的注入语句: (1) http://domain name/list.asp?ID=1 and 1=1(数字型) (2) http://domain name/list.asp?Class=喜剧片 and ‘1’=’1’(字符型) (3) http://domain name/list.asp?ID=1 and exists (select * from admin) …… 从这些语句中可以看出变量过滤不严与函数是紧密相关的。list.asp处理ID的函数一定对ID未做充分的过滤。语句(1)中是把 ”1 and 1=1”做为一个变量,程序会把这个畸形的ID带到函数里面来处理,list.asp?ID=1的同时执行了后面的查询语句如(3)所示。如果list.asp?ID=1和后面的查询语句都正确的时候才会在IE里显示正确的页面。我们只要验证一下ID是否为数字型就可以避免了,对于字符型的(2)我们就可以采用长度过滤来做限制。难道对程序员来说实现过滤有这么难吗?应该是程序员的一时疏忽而已,换个角度看其实这种疏忽带来的危害,恰恰激励了程序员以后可以写出更好的程序来。
上传变量的利用就更巧妙了,我在这里佩服一下先!有编程基础的朋友都知道\0在一个数组中的含义,C中的定义数组为:char filepath[ ]=”\uploadface\myface.gif”,若我们定义char filepath[ ]=”\uploadface\0myface.gif”会怎么样?\0就是数组结束的标志,不管是什么语言在解释后都会在数组后面自动加\0用来给系统识别结束的位置,而\0也可以我们自己加进去。在ASP脚本中由于数据的未被封装,我们就可以对数据进行随意改动然后在交给函数处理(其实封装了的同样可以提交非法数据)。在上传文件脚本中的保存文件的典型语句是:Filename=Filepath&Data&Filetype如果前面对Filepath变量未作任何处理,显然我们在给www服务器发送数据时提交一个假的Filepath为”/newmm.asp\0”,那么Filename数组就会变为”/newmm.asp\0”+”20041001”+”.gif”既然\0是结束的标志系统读到\0时就不再往后读数据了那么Filename就是=”/newmm.asp\0”。。。怎么样? HO…HO…再佩服一下。同样的道理后面的Filetype处理不好的话同样后果严重。对付这个过滤不严跟前面的注入不相同,我们即不能用长度filepath来限制,也不能用简单的数字或者字符验证来草率处理。那怎么办?既然是过滤不严,当然就要好好过滤一番了,最好方法的就是锁定Filepath,再加上原有的filetype的处理。看你还能怎么样?
在脚本安全中变量过滤这么重要,其他方面呢?这在看看”溢出”,一个可爱又可恨的字眼。微软可能现在还没从RPC的恶梦中回过神来。REMOTE PROCEDURE CALL (RPC)是运用于WINDOWS操作系统上的一种协议,它提供相互处理通信机制,允许运行该程序的计算机在一个远程系统上执行代码。RPC协议本身源于OSF (OPEN SOFTWARE FOUNDATION) RPC协议,后来又另外增加了一些MICROSOFT专用扩展功能。 其中RPC的DCOM接口用来处理由客户端机器发送给服务器的DCOM对象激活请求(如UNC路径)。WINDOWS RPC在通过TCP/IP进行信息交换过程时,在为DCOM服务提供__REMOTEGETCLASSOBJECT接口时,未对数据包中的结构指针参数做有效性检查,因此收到的数据包中该指针为NULL的时未能正确处理,导致系统直接引用此地址(已经为NULL)做读写操作,导致内存访问违例,RPC服务进程崩溃。而RPC服务是MS WINDOWS中一个重要的服务,他开放的135端口用于DCOM的认证、EPMAPPER管道用于RPC端点的映射,并默认为系统信任,如果一个攻击者能够以低权限在被攻击机器上运行一个程序,在RPC服务崩溃以后,就可以通过劫持EPMAPPER管道和135端口的方法来提升权限或获得DCOM客户端认证的信息。至于怎么抓包、提交数据,当然不会用我们的NC了,但是原理是一样的,就是给其中处理不当的变量赋特殊值(千万你不要根我说你想加 ”\0” 哦!),然后提交给目标机来处理就OK了,只是网上比较多的是别人编译好的程序,它已经把抓包、提交的功能合在一起了,建议大家看一下程序的源码,肯定受益非浅啊!还是要说一下过滤这个变量就那么难吗?微软的程序员不会连IF (??!=NULL)都不知道吧?也许是程序员疏忽而已(不知道会不会被BILL开除,呵呵。。。)后来又发现的超长文件名溢出的问题,变量过滤不严的毛病就更明显了,还有现在的JPEG漏洞,我虽然没有看到详细的说明,但是可以推测肯定又是对WINDOWS对JPEG格式的文件处理时某个变量又出了问题。。。HO...HO,微软又要做恶梦了,阿弥陀佛!!!。再比如SERV-U MDTM命令,格式:MDTM filename,当我们提交后面的FILENAME为超长时,就会溢出,特殊构造的话就会有更大的威胁。。。。。。这个怎么利用,大家肯定比我更清楚,由于我们这里主要不是说如何溢出所以就点到为止了
二、引申一下
还有其他很多的问题仔细分析的话都会发现归根结底就是程序作者忽略了某个变量的过滤或者说是处理吧,引起的问题小的可以导致DDOS,大的可以溢出得到系统权限实在是可怕啊!以后我们自己写程序的时候千万要注意思维的严密性啊!其实不管什么程序,它们最终处理的只有一样东西就是变量,对于操作系统或者应用软件、脚本系统等等,只要我们从最基本的变量入手,就一定能找出问题来,因为世上没有不透风的墙,大不了就是问题轻点而已。然而对于不同的系统我们又有不同的方法,像Linux、unix操作系统,BBS、ArticleSystem、DownloadSystem等等开放源码的,我们直接看源码肯定是最好的选择,而对Windows、以及Win下的一些GUI的软件我们就只能从我们观察到的现象来推测系统的处理机制,这个显然就难多了。然而就算我们有了Linux那样的源码,如果没有扎实的系统、网络、编程的基础,想发现一个所谓的BUG几乎是不可能的! 作为一个思想积极的是菜鸟,我提点建议对网络安全感兴趣的兄弟姐妹们可以参考一下: 注意事项:看文章时不要乱扔东西(砸我)
(1) 我虽然不懂原理,但是我会把原理性的文章Copy下来以后看的懂的时候再看, 就是要做尽可能多的试验,并慢慢的学会总结; (2) 加QQ群交流也许有用,但是。。。唉,我觉得养成独立思考的习惯还是比较重要; 都在瞎掰(我就是这样),真正有用的意见很少,高手不说话,菜鸟又乱叫! (3) 如果你还没有入门,只是浓厚的的兴趣,那就太好了,去学一门计算机语言吧。 或者加入什么会员学点东西。
(4)还有。。。?没了,我就知道这么多啦,等俺不是菜鸟了,一定告诉你 三、还是有个结尾比较好
还是。。。回到主题——变量过滤
数据封装的概念大家一定很熟悉吧?就算不熟悉也听说过吧?关键就是程序中的private,保护了部分数据。像VC++、Delphi、VB都是支持数据封装开发的典型,我所知道的脚本中的ASP.NET就有数据封装(其他的我也不知道)。数据封装无疑是对变量过滤不严的最好的缓兵之计,说是缓兵之计是因为我们现在看到对于Windows的BUG的研究就是在数据保护下发现的,只要你的变量处理有问题,保护有什么用? 那么我们早晚会找到,何况现在ASP.net的平台都有问题。想想Windows的代码有几百万行,里面有多少个变量?? 而且是很多人分工协作完成的,接口真的做的那么好?Billgates敢说变量的处理都没有问题?他敢说我们也不信啊!!
计算机语言从汇编发展到B、到C,再到现在C++,一直都是以变量做为处理的对象 万一不小心,像Windows 的一个RPCDCOM一个接口没处理好,整个系统大打折扣;DvBBS也因为filepath一个变量的疏忽弄的人人心惶惶。。。我们不防大胆想多点:下一代计算机语言是什么样子?下一代脚本又是什么样?
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力 |