web文件操纵常见安然漏洞(目次、文件名检测漏洞)

    添加时间:2013-6-7 点击量:

      做web开辟,我们经常会做代码走查,很多时辰,我们都邑抽查一些核心功能,或者常会呈现漏洞的逻辑。跟着技巧团队的强大,组员技巧日益成熟。 常见傻瓜型SQL注入漏洞、以及XSS漏洞。会越来越少,然则我们也会发明一些新兴的隐蔽性漏洞无领悟呈现。这些漏洞更多来自开辟人员,对一个函数、常见模块功能设计不足,遗留下的题目。以前我们可以或许完成一些功能模块,如今请求是要安然正确办法完成模块才行。 接下来,我会分享一些常见功能模块,因为设计原因导致漏洞呈现。下面,我们先看下,读取文件型功能漏洞。


      我们先看下下面一段代码,经由过程用户输入不合目次,包含不合文件



    <?php
    
    ///读取模块名称
    ¥mod = isset(¥_GET[m])?trim(¥_GET[m]):index;

    ///过滤目次名称不让跳转到上级目次
    ¥mod = str_replace(..,.,¥mod);

    ///获得文件
    ¥file = /home/www/blog/.¥mod..php;

    ///包含文件
    @include(¥file);


    
    

      这段代码,可能在很多伴侣做的法度里面有碰到过,对于新人来说,也是很轻易呈现如许题目,记得走查碰到该代码时辰,我问到,你这个代码安然方面能做到那些?


    答:1. 对”..”目次有做调换,是以用户传入模块名里面有有..目次都邑被调换掉了。


             2.机关拼接file名称,有前面貌录限制,有后面扩大名限制,包含文件就会限制在该目次了




    • 这段代码真的做到了目次安然检测吗?




    我们来测试下,若是¥mod传入这个值将会是什么样的成果。



    ¥mod 经由过程机关输?mod=…%2F…%2F…%2F…%2Fetc%2Fpasswd%00 ,我们算作果将是:



    居然include(“/etc/passwd”)文件了。




    • 怎么逃脱了我参数限制呢?




     


      起首:做参数过滤类型去限制用户输入底本就不是一个好办法,一般规矩是:可以或许做检测的,不要做调换 只如果检测不经由过程的,直接pass 掉!这是我们的一个原则。过滤失败景象,举不堪举,我们来看看,实际过程。


    1、输入”…/…/…/” 经由过程把”..” 调换为”.”后


    2、成果是”../../../” 就变成了这个了


    有伴侣就会说,若是我直接调换为空格是不是就好了?在这个里面确切可以调换掉。然则不代表今后你都调换为空格就好了。再举例子下。如:有人将字符串里面javascript调换掉。代码如下:



    ……


    ¥msg = str_replace(“javascript”,””,¥msg);



    看似不会呈现了javascript了,然则,若是输入:jjavascriptavascript 调换,会调换掉中心一个变为空后。前面的”j” 跟后面的会构成一个新的javascript了。


      其次:我们看看,怎么逃脱了,后面的.php 限制呢。用户输入的参数有:”etc/passwd\0” ,\0字符很是特别,一段连接后,文件名称变成了”……etc/passwd\0.php”,你打印出该变量时辰,还是正确的。然则,一段放入到文件读写操纵办法里面,\0后面会主动截断。操纵体系,只会读取……etc/passwd文件了。 “\0”会呈如今所有文件体系读写文件变量中。都邑同样处理惩罚。这根c说话\0作为字符串完全标识表记标帜有关系。


    经由过程上方解析,大师发明做文件类型操纵时辰,一不重视将产生大的漏洞。并且该漏洞就可能激发一系列安然题目。




    • 该怎么做文件类操纵呢?




      到这里,估计有人就会思虑这个,做文件读写操纵时辰,若是路径里面有变量时辰,我该怎么样做呢?有人会说,调换可以吗? “可以”,然则这个办法调换不严格,将会呈现很多题目。并且,对于初写伴侣,也很难杜绝。 做正确的工作,选择了正确的办法,会从本身杜绝题目呈现可能了。 这里,我建议:对于变量做白限制。



    1. 什么是白限制


      举例来说:


      ¥mod = isset(¥_GET[m])?trim(¥_GET[m]):’index’; ///读取模块名称后


      mod变量值局限若是是列举类型那么:


      if(!in_array(¥mod,array(‘user’,’index’,’add’,’edit’))) exit(‘err!!!’);


      完全限制了¥mod,只能在这个数组中,够狠!!!!















    2. 怎么做白限制







    经由过程刚才例子,我们知道若是是列举类型,直接将值放到list中即可,然则,有些时辰,如许不敷方面。我们还有别的一个白限制办法。就是限制字符局限



    举例来说:


    ¥mod = isset(¥_GET[m])?trim(¥_GET[m]):’index’; ///读取模块名称后


    我限制知道¥mod是个目次名称,对于一般站点来说,就是字母加数字下划线之类。


    if(!preg_match(“/^\w+¥/”,¥mod)) exit(‘err!!!’);


    字符只能是:[A-Za-z0-9_] 这些了。够狠!!!









    总结:是不是发明,白限制办法,做起来其实很简单,你知道那个处所要什么,就对输入检测必须是那些。并且,检测本身已知的,比调换那些未知的字符,是不是简单多了。 好了,先到这里,正确的解决题目办法,会让文件简单,并且更安然!!迎接交换!



    作者:chengmo  QQ:8292669 
    原文网址:http://blog.chacuo.net/152.html 
    订阅对峙存眷:http://blog.chacuo.net/feed 
    本文版权归作者所有,迎接转载,请务必添加原文链接。







    原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
    分享到: