攻防世界-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 '
'; foreach($files as $k=>$v) { if(str_ireplace($name,'',$v)!==$v) { echo $v.'
'; } } 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