forked from Trietptm-on-Security/WooYun-2
-
Notifications
You must be signed in to change notification settings - Fork 7
/
.user.ini文件构成的PHP后门.html
95 lines (54 loc) · 117 KB
/
.user.ini文件构成的PHP后门.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<html>
<head>
<title>.user.ini文件构成的PHP后门 - phith0n</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>原文地址:<a href="http://drops.wooyun.org/tips/3424">http://drops.wooyun.org/tips/3424</a></h1>
<p>
<h2>0x00 背景</h2>
<hr />
<p>这个估计很多同学看了不屑,认为是烂大街的东西了:</p>
<p><a href="http://zone.wooyun.org/content/16114">.htaccess文件构成的PHP后门</a></p>
<p>那么我来个新的吧:<code>.user.ini</code>。它比<code>.htaccess</code>用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。我的nginx服务器全部是fpm/fastcgi,我的IIS php5.3以上的全部用的fastcgi/cgi,我win下的apache上也用的fcgi,可谓很广,不像.htaccess有局限性。</p>
<h2>0x01 .user.ini</h2>
<hr />
<p>那么什么是.user.ini?</p>
<p>这得从php.ini说起了。php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:<code>PHP_INI_SYSTEM</code>、<code>PHP_INI_PERDIR</code>、<code>PHP_INI_ALL</code>、<code>PHP_INI_USER</code>。 在此可以查看:<a href="http://php.net/manual/zh/ini.list.php">http://php.net/manual/zh/ini.list.php</a> 这几种模式有什么区别?看看官方的解释:</p>
<!--more-->
<p><img src="http://static.wooyun.org/20141030/2014103002272568560.png" alt="enter image description here" /></p>
<p>其中就提到了,模式为PHP_INI_USER的配置项,可以在ini_set()函数中设置、注册表中设置,再就是.user.ini中设置。 这里就提到了.user.ini,那么这是个什么配置文件?那么官方文档在<a href="http://php.net/manual/zh/configuration.file.per-user.php">这里</a>又解释了:</p>
<p>除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录(<code>$_SERVER['DOCUMENT_ROOT']</code> 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。</p>
<p>在 <code>.user.ini</code> 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。</p>
<p>这里就很清楚了,<code>.user.ini</code>实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。(上面表格中没有提到的PHP_INI_PERDIR也可以在.user.ini中设置)</p>
<p>实际上,除了<code>PHP_INI_SYSTEM</code>以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。</p>
<p>而且,和<code>php.ini</code>不同的是,<code>.user.ini</code>是一个能被动态加载的ini文件。也就是说我修改了<code>.user.ini</code>后,不需要重启服务器中间件,只需要等待<code>user_ini.cache_ttl</code>所设置的时间(默认为300秒),即可被重新加载。</p>
<p>然后我们看到php.ini中的配置项,可惜我沮丧地发现,只要稍微敏感的配置项,都是<code>PHP_INI_SYSTEM</code>模式的(甚至是php.ini only的),包括<code>disable_functions</code>、<code>extension_dir</code>、<code>enable_dl</code>等。 不过,我们可以很容易地借助<code>.user.ini</code>文件来构造一个“后门”。</p>
<p>Php配置项中有两个比较有意思的项(下图第一、四个):</p>
<p><img src="http://static.wooyun.org/20141030/2014103002272554789.png" alt="enter image description here" /></p>
<p><code>auto_append_file</code>、<code>auto_prepend_file</code>,点开看看什么意思:</p>
<p><img src="http://static.wooyun.org/20141030/2014103002272569525.png" alt="enter image description here" /></p>
<p>指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:</p>
<pre><code>auto_prepend_file=01.gif
</code></pre>
<p>01.gif是要包含的文件。</p>
<p>所以,我们可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。</p>
<p>测试一下,我分别在IIS6.0+Fastcgi+PHP5.3和nginx+fpm+php5.3上测试。 目录下有.user.ini,和包含webshell的01.gif,和正常php文件echo.php:</p>
<p><img src="http://static.wooyun.org/20141030/2014103002272563350.png" alt="enter image description here" /></p>
<p><img src="http://static.wooyun.org/20141030/2014103002272650870.png" alt="enter image description here" /></p>
<p>访问echo.php即可看到后门:</p>
<p><img src="http://static.wooyun.org/20141030/2014103002272652570.png" alt="enter image description here" /></p>
<p>Nginx下同样:</p>
<p><img src="http://static.wooyun.org/20141030/2014103002272682946.png" alt="enter image description here" /></p>
<p><img src="http://static.wooyun.org/20141030/2014103002272674827.png" alt="enter image description here" /></p>
<p>那么,我们可以猥琐地想一下,在哪些情况下可以用到这个姿势? 比如,某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。 再比如,你只是想隐藏个后门,这个方式是最方便的。</p>
<h2>0x02 参考文献:</h2>
<hr />
<ul>
<li><a href="http://php.net/manual/zh/ini.list.php">http://php.net/manual/zh/ini.list.php</a></li>
<li><a href="http://php.net/manual/zh/configuration.changes.modes.php">http://php.net/manual/zh/configuration.changes.modes.php</a></li>
<li><a href="http://php.net/manual/zh/configuration.file.per-user.php">http://php.net/manual/zh/configuration.file.per-user.php</a></li>
<li><a href="http://php.net/manual/zh/configuration.changes.php">http://php.net/manual/zh/configuration.changes.php</a></li>
</ul> </p>
</body>
</html>