zoukankan      html  css  js  c++  java
  • .user.ini导致文件上传绕过

    前言

    上周末有SUCTF,然而我却在摸鱼基本没看题,赛后看到队里的共享文档中有一道web的writeup,涉及到的知识点在特定的情况下很实用,因此复现一下(周内太忙了,拖到周五所有的)

    之前也在ciscn的华东北的线下赛遇到一道.htaccess绕过黑名单上传限制,达到getshell的效果的题目

    https://www.cnblogs.com/sijidou/p/13111905.html

    但是.htaccess只是适用于apache,如果变成niginx或者iis则不会被解析

    预备知识

    现在大部分网站都是用的fastcgi,这个东西我理解的是可以提供web服务器的一种api,而apache/nginx/iis这些服务器都会依靠这种api来运行

    而在服务器以fastcgi启动运行的时候,.user.ini也是php的一种配置文件,众所周知php.iniphp的配置文件,它可以做到显示报错,导入扩展,文件解析,web站点路径等等设置。但是如果想要把某个文件里面的配置与全局的php.ini不同,则可以在php文件中加上ini_set()来配置特定的配置变量。

    .user.ini.htaccess一样是对当前目录的所以php文件的配置设置,即写了.user.ini和它同目录的文件会优先使用.user.ini中设置的配置属性。

    但是不是php.ini中的每个变量都能通过ini_set()或者.user.ini.htaccess来设置,简单的来说每个变量有它所属于的模式,下面官方手册的四个模式

    https://www.php.net/manual/zh/configuration.changes.modes.php

    比如在PHP_INI_ALL模式下,而不在PHP_INI_PERDIR模式下的配置属性,则不能通过ini_set()来设置

    通过上表,看到PHP_INI_USER模式中提到,可以在.user.ini中设定。但实际上,只要不是PHP_INI_SYSTEM模式下的属性,均可以在.user.ini中设置,可以通过该表来查看哪些属性属于哪些模式

    https://www.php.net/manual/zh/ini.list.php

    有2个属性,它们的作用是,auto_append_filephp文件最后用require包含进指定文件,auto_prepend_file则是在php文件代码执行前用require包含进指定的文件

    它们在.user.ini中的语法十分的简单

    //.user.ini
    
    auto_prepend_file=top.html
    auto_append_file=down.html
    

    利用

    此时接着写的时候已经是周五了,比赛环境已经关了,于是本地写个demo复现一波

    本地写个简单的上传验证,简单过滤了 ph*.htaccess

    <?php
    	var_dump($_FILES);
    	$ext = @end(explode('.',$_FILES['file']['name']));
    	echo $ext;
    	if(preg_match("/ph.*|.htaccess/i", $ext) === 0){
    		move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']);
    	}
    	else{
    		die("disable upload");
    	}
    ?>
    
    <html>
    	<head>
    		<title>上传测试</title>
    		<meta charset="utf-8">
    	</head>
    	<body>
    		<form action="" method="POST" enctype="multipart/form-data">
    			<input type="file" name="file" id="file" /> 
    			<input type="submit" name="submit" value="Submit" />
    		</form>
    	</body>
    </html>
    

    这个明显是传不了php的脚本了的,但是利用.user.ini

    首先上传个1.jpg

    看下文件夹中是成功进去了

    直接访问肯定是不行的,接下来上传.user.ini

    成功上传进去了

    执行以下访问index.php,可以看到whoami已经打印出来了

    利用条件

    利用.user.ini上传条件需要是使用的是fastcgi,我的环境是phpstudyphp7.2, 之前使用php5.4失败

    注意server API 不一样

    还有啊,比赛的时候是进行了文件头检验的,所以要加个文件头,把auto_prepend_file=xxx换行,比如

    //.user.ini
    
    GIF89a
    auto_prepend_file=xxx
    

    它不像.htaccess,特别注重每行内容和格式

    参考文章

    https://wooyun.js.org/drops/user.ini文件构成的PHP后门.html?tdsourcetag=s_pcqq_aiomsg

  • 相关阅读:
    Hook钩子程序
    KMeans笔记 K值以及初始类簇中心点的选取
    自己用C#写的一个俄罗斯方块的小程序(附源代码)。
    那些帮助你成为优秀前端工程师的讲座——《JavaScript篇》
    Mac技巧合集第二期
    WCF增加UDP绑定(应用篇)
    第一个MVC4 Web应用程序
    jQuery的页面加载事件
    通过网页进行 iOS 应用内部分发
    sql count效率
  • 原文地址:https://www.cnblogs.com/sijidou/p/13121301.html
Copyright © 2011-2022 走看看