zoukankan      html  css  js  c++  java
  • 攻防世界-web-blgdel(.htaccess文件上传、上传+包含漏洞)

    题目来源:CISCN-2018-Final
    题目描述:暂无

    打开页面,是一个购物网站,可以注册、登录、添加购物车、购买商品等。

    扫描目录

    发现robots.txt

    打开/config.txt,发现是源码

    代码审计(我给加了一些注释,方便理解)

    <?php
    
    class master
    {
        private $path;
        private $name;
        
        function __construct()
        {
            
        }
        
        function stream_open($path) #对path的传参和name的传参从字符串到变量,做了一个方法对应。
        {
            if(!preg_match('/(.*)/(.*)$/s',$path,$array,0,9))
                return 1;
            $a=$array[1];
            parse_str($array[2],$array);#parse_str() 函数把查询字符串解析到变量中。
            
            if(isset($array['path']))
            {
                $this->path=$array['path'];
            }
            else
                return 1;
            if(isset($array['name']))
            {
                $this->name=$array['name'];
            }
            else
                return 1;
            
            if($a==='upload')
            {
                return $this->upload($this->path,$this->name);
            }
            elseif($a==='search')
            {
                return $this->search($this->path,$this->name);
            }
            else 
                return 1;
        }
        function upload($path,$name) #过滤了文件内容。
        {
            if(!preg_match('/^uploads/[a-z]{10}/$/is',$path)||empty($_FILES[$name]['tmp_name']))
                return 1;
            
            $filename=$_FILES[$name]['name'];
            echo $filename;
            
            $file=file_get_contents($_FILES[$name]['tmp_name']);
            
            #将文件内容中的< " ' .都替换成!
            $file=str_replace('<','!',$file); 
            $file=str_replace(urldecode('%03'),'!',$file);
            $file=str_replace('"','!',$file);
            $file=str_replace("'",'!',$file);
            $file=str_replace('.','!',$file);
            
            #过滤文件内容中的file:、http和pre
            if(preg_match('/file:|http|pre|etc/is',$file)) #/i不区分大小写,/s单行模式匹配
            {
                echo 'illegalbbbbbb!';
                return 1;
            }
            
            file_put_contents($path.$filename,$file); #将过滤后的文件内容写回文件中
            file_put_contents($path.'user.jpg',$file); #将过滤后的文件内容写入user.jpg中
            
            
            echo 'upload success!';
            return 1;
        }
        
        #判断是否存在path路径,对当前目录进行遍历,存在和name相同的文件或者目录替换为空 并列出当前目录。
        function search($path,$name)
        {
            if(!is_dir($path))
            {
                echo 'illegal!';
                return 1;
            }
            $files=scandir($path);
            echo '</br>';
            foreach($files as $k=>$v)
            {
                if(str_ireplace($name,'',$v)!==$v)
                {
                    echo $v.'</br>';
                }
            }
            
            return 1;
        }
        
        function stream_eof()
        {
            return true;
        }
        function stream_read()
        {
            return '';
        }
        function stream_stat()
        {
            return '';
        }
        
    }
    
    stream_wrapper_unregister('php');
    stream_wrapper_unregister('phar');
    stream_wrapper_unregister('zip');
    stream_wrapper_register('master','master');
    
    ?>

    注册并登陆一个用户,进入个人中心,发现有上传点

     

    点击上传一个头像,系统提示级别过低

    估计要拿一个高分的账户

    后面注意到注册页面有个推荐人,试了一下,注册一个新账户给10个积分

    到达100积分的时候可以上传文件

    尝试上传木马,失败。

    但是上传一个正常的php文件是可以的

    从刚开始目录扫描的结果,我们知道,存在uploads目录,找到hacker.php文件并在浏览器打开

    发现<已被替换成了!,无法执行。

    继续尝试,我们发现.htaccess可以被上传,意味着我们可以包含文件。

    首先,通过构造master协议来搜索文件

    构造 php_value auto_append_file master://search/path=%2fhome%2f&name=flag

    放进.htaccess里面,上传

    访问hacker.php,在同目录下的 php文件中读取到flag名字文件。

    然后,直接将flag文件内容包含进来

    构造 php_value auto_append_file /home/hiahiahia_flag

    放进.htaccess里面,上传

    访问hacker.php,得到flag。

    这道题太难了,附上官方的wp参考

    首先可以对本系统进行常规测试,发现没有注入,xss等常见漏洞,接着观察系统在基本功能要求之外的功能,即一个上传点(上传头像图片),和一个搜索点(搜索以前头像)或许就是突破口,需要积分,注册10个新用户,得到100分即可到达这个level,然后目录通过用户图片位置得到 还发现了robots.txt,其中有一个提示config.txt,访问config.txt得到config.php的源码,发现常规的伪协议如php,zip,phar都被注销掉了,但是新注册了一个master协议 根据源码和测试,发现经过上传点上传的文件目录不可控,同时文件内容中的<被过滤掉了,观察源码,搜索点是根据分配给用户的目录搜索的,不能控制,而文件名也是通过匹配得到的,不是通过命令执行什么的得到的,所以也没办法控制。 因为给了每个用户单独目录,所以可以尝试着上传一个.htaccess,其中可以写入php_value auto_prepend_file 1 这种语句,即通过上传漏洞,上传一个包含点上去,将上传漏洞变为上传+包含漏洞 通过测试,可以发现php,zip,phar都不能使用,而结合上传时pre为黑名单,可以想到此时的网站auto_prepend_file为这个config.php,无法修改,即无法替换auto_prepend_file而使用php,zip等伪协议 所以只能考虑远程包含,和新注册的master协议,远程包含失败,只能考虑master协议 分析协议的构成,发现如果我们可以控制协议,则可以给任意目录上传/搜索文件,而协议流程和对象注入差不多,先是执行__construct,再是stream_open,upload/search,stream_read...主要是upload和search,其余方法都做了处理,可以不管。 而上传目录被限制了,但我们可以搜索文件 通过上传.htaccess,内容为php_value auto_append_file master://search/path={}&name={},可以在任意目录下搜索文件,此时注意/要替换为%2f,否则不能成功 搜索结果可以通过上传并访问一个test.php看到 通过几次简单测试,可以得到在payload为php_value auto_append_file master://search/path=%2fhome%2f&name=flag时,找到了hiahiahia_flag文件 此时我们再上传一个.htaccess,内容为php_value auto_append_file /home/hiahiahia_flag即包含flag 再访问test.php,可以看到flag。

    参考:https://www.cnblogs.com/mke2fs/p/11569913.html

  • 相关阅读:
    回文子序列数 编程之美 hihocoder 资格赛 第二题 2015年
    斐波那契数列 加速 骨牌覆盖 mod 19999997
    编程语言发展史
    document.getElementById和document.write
    正则表达式验证
    reg-replace
    正则表达式
    DOM&BOM
    pseudo-class与pseudo-element的相同点与不同点
    网格(grid)
  • 原文地址:https://www.cnblogs.com/zhengna/p/14004836.html
Copyright © 2011-2022 走看看