Hed9eh0g

前进的路上总是孤独的

从一道题学习.user.ini文件利用

本文共计有2183个字

前言

刚刚过去的SUCTF出现了一道利用.user.ini文件执行shell的题目,算是文件上传的一种绕过方式(upload-labs中并没有出现)。虽然这个知识点早在p牛的文章中提及,但是作为入圈不久的我来说还是一个新的知识点,借此机会结合相关文章学习一下。

.user.ini

来源

说到.user.ini文件之前先要提到php.ini,php.ini文件应该对大多数人来说不是很陌生,它是php默认的配置文件,其中包括了很多php的配置。这些配置中,又分为几种:PHP_INI_SYSTEM、PHP_INI_PERDIR、PHP_INI_ALL、PHP_INI_USER。《从一道题学习.user.ini文件利用》
其中就提到了,模式为PHP_INI_USER的配置项,可以在ini_set()函数中设置、注册表中设置以及.user.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来设置的)
个人认为.user.ini文件对php.ini某些配置的作用可以理解等同为.htaccess文件对于Apache解析某些文件的作用。

利用

对于.user.ini文件,存在两个配置有时可以被拿来利用,分别是:auto_append_file和auto_prepend_file。查看auto_prepend_file:《从一道题学习.user.ini文件利用》
大致意思是:指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中写入:

auto_prepend_file=01.gif      //01.gif是要包含的文件

所以,我们可以在01.gif中写入shell,然后再借助.user.ini轻松让所有php文件都“自动”包含01.gif这个文件,从而执行我们想要的shell。(这里的01.gif类似于图片马)

前提条件

能够利用这个漏洞也是有相关条件的,只是条件相对比较宽松:只要是以fastcgi运行的php都可以用这个方法,无论是IIS、Apache还是Nginx。可以看出.user.ini文件的利用比.htaccess文件的利用要广泛得多(后者必须在Apache内,而且还要求开启相关配置)

本地演示

我在php5.3.29 Apache上演示此文件的利用:
首先创建一个.user.ini文件,然后写入:《从一道题学习.user.ini文件利用》
然后在01.gif上写入shell:《从一道题学习.user.ini文件利用》
然后再创建一个任意的php文件:《从一道题学习.user.ini文件利用》
在浏览器执行echo.php文件,可以发现执行了我们所写的shell,也即01.gif被echo.php包含了(也就是auto_append_file的作用):《从一道题学习.user.ini文件利用》

SUCTF 2019 CheckIn

首先题目是一个简单的文件上传界面:

《从一道题学习.user.ini文件利用》
直接上传php文件被提示illegal,文件上传的常规思路都试一遍:首先改content-type、改后缀为php5、Php等都无法实现上传,看看是黑名单还是白名单检查:
后缀名改为aaa后上传,发现回显:&lt;? in contents!,说明文件内容不能包含<?,可以得知aaa后缀是可以通过的,只不过无法通过下一步的内容检查,说明它是黑名单检查。

《从一道题学习.user.ini文件利用》
我们再把文件内容换一下使其不包含<?,发现回显:exif_imagetype:not image!,猜测后端应该调用了php的exif_imagetype()函数,这个很好绕过,添加图片文件头就可以了。

《从一道题学习.user.ini文件利用》
我们添加最简单的gif文件头GIF89a,发现上传成功(注意到有一个index.php文件):

《从一道题学习.user.ini文件利用》
既然图片文件能够成功上传,那么首先想到的是通过上传.htaccess文件,使解析器把jpg文件解析为php文件,然而结果仍然无法实现,服务器是nginx 1.10.3,似乎版本较高,不存在解析漏洞。
这个时候根据刚才出现的index.php,想到了利用适用范围更广的.user.ini文件,通过执行index.php来把我们所上传的图片马给包含即可得到flag。所以上传一个.user.ini文件,其中写入:

GIF89a
auto_prepend_file=a.jpg

再上传a.jpg图片马,其中写入可以得到flag的shell:

GIF89a
<script language='php'>system('cat /flag');</script>   //为了绕过对<?的检查

两个文件都上传成功之后,即可通过访问index.php得到flag了。

后记

其实可以看出来.user.ini文件的利用也有相对的局限性,结合本题的突破口index.php可以知道:必须需要有一个任意的可以执行的php文件才可以被利用,一般情况下用来保存上传文件的目录下应该不会有这样一个index.php文件吧。
但是另一方面如果用它来作为留后门就相当隐蔽和方便了。

参考文章

1、p牛的文章
2、SUCTF checkin writeup

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注