攻防世界-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

posted @ 2020-11-23 15:27  zhengna  阅读(581)  评论(0编辑  收藏  举报