.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM