BUU_Web [SUCTF 2019]CheckIn
打开解题网址,一看就是文件上传:
这里首先尝试了上传 一句话 php, 以及文本,测试后发现需要上传 jpg 格式图片,并且文件中不能含有 <? ,文件后缀不能是 php文件的所有后缀;到这里,涉及知识盲区了;翻看大佬wp 才明白这道上传题没有之前的那么简单;
-
需要利用到一个 .user.ini 文件,以及利用GIF 文件头绕过exif_imagetype()检测;
-
知识点
.user.ini 文件 -
.user.ini文件是相当于由客户端控制的一个 php.ini文件,系统在执行php代码之前,会先对目录进行扫描,发现 .ini文件,则先执行 .ini文件,再执行php代码;
-
利用:在.user.ini 文件中写入 auto_prepend_file函数或者 auto_append_file 函数;这两个函数的作用就是将 一个文件 例如 1.jpg包含到接下来要执行的php文件中去(如index.php),相当在 PHP文件中插入了一条 require(./1.jpg);
-
.user.ini利用条件
1,服务器使用 CGI/FastCGI 模式
2,对应目录下有可执行的php文件
3,open_basedir没有被限制 -
auto_prepend_file 与 auto_append_file的区别
auto_prepend_file 是在php文件加载前将 文件包含进 php文件最前面;
auto_append_file 是在php文件加载后将文件包含进php文件末尾,(并且当文件调用了exit()时,该设置无效);
因此通常使用 auto_prepend_file ;
解题:
既然php所有格式无法上传,只能是 jpg格式,并且不能包含 <? ,所以,可以制作一个图片马,实际上只是后缀为 jpg格式,并加上 GIF89a 文件头绕过exif_imagetype()检测:
同样,写一个 .user.ini文件,利用 auto_prepend_file 设置将 webshell.jpg 包含在index.php的最开头(注意这个.user.ini文件同样需要绕过 exif_imagetype()的检测):
然后,开始上传文件,首先上传 .user.ini 文件:
上传之后,将图片马(一句话)上传:
访问 它给出的文件存放路径:
看到我们写入显示的文件头了,上传成功;
到这里,有两种方法获取flag:
第一种 方法:
因为是 我的一句话木马是get方式获取参数,参数名为 cmd,所以可以构造payload:
?cmd=system('ls /');
?cmd=system('cat /flag');
或者 ?cmd=var_dump(file_get_contents('/flag'));
直接在页面获取flag;
第二种方法
需要一句话木马是POST方式获取参数;
连接蚁剑,右键虚拟终端获取;