.user.ini文件构成的PHP后门

phith0n 2014-10-30 10:51:00

0x00 背景


这个估计很多同学看了不屑,认为是烂大街的东西了:

.htaccess文件构成的PHP后门

那么我来个新的吧:.user.ini。它比.htaccess用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。我的nginx服务器全部是fpm/fastcgi,我的IIS php5.3以上的全部用的fastcgi/cgi,我win下的apache上也用的fcgi,可谓很广,不像.htaccess有局限性。

0x01 .user.ini


那么什么是.user.ini?

这得从php.ini说起了。php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:PHP_INI_SYSTEMPHP_INI_PERDIRPHP_INI_ALLPHP_INI_USER。 在此可以查看:http://php.net/manual/zh/ini.list.php这几种模式有什么区别?看看官方的解释:

其中就提到了,模式为PHP_INI_USER的配置项,可以在ini_set()函数中设置、注册表中设置,再就是.user.ini中设置。 这里就提到了.user.ini,那么这是个什么配置文件?那么官方文档在这里又解释了:

除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT']所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。

.user.ini风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_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来设置的。

而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说我修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

然后我们看到php.ini中的配置项,可惜我沮丧地发现,只要稍微敏感的配置项,都是PHP_INI_SYSTEM模式的(甚至是php.ini only的),包括disable_functionsextension_direnable_dl等。 不过,我们可以很容易地借助.user.ini文件来构造一个“后门”。

Php配置项中有两个比较有意思的项(下图第一、四个):

auto_append_fileauto_prepend_file,点开看看什么意思:

指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:

auto_prepend_file=01.gif

01.gif是要包含的文件。

所以,我们可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。

测试一下,我分别在IIS6.0+Fastcgi+PHP5.3和nginx+fpm+php5.3上测试。 目录下有.user.ini,和包含webshell的01.gif,和正常php文件echo.php:

访问echo.php即可看到后门:

Nginx下同样:

那么,我们可以猥琐地想一下,在哪些情况下可以用到这个姿势? 比如,某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。 再比如,你只是想隐藏个后门,这个方式是最方便的。

0x02 参考文献:


评论

L

laterain 2014-10-30 13:04:58

呀呀呀,屌飞了

J

justforfun 2014-10-30 14:05:06

好淫荡

L

luwikes 2014-10-30 15:28:19

好淫荡

路人甲 2014-10-30 15:49:47

猥琐流

P

pangshenjie 2014-10-30 16:47:36

JJ boom

_

_fd 2014-10-30 17:00:43

!

Knight 2014-10-30 19:20:53

够猥琐,我喜欢。

泳少 2014-10-30 23:35:36

还是不错的嘛

mramydnei 2014-10-31 02:51:06

再看了一遍。文章写的确实很有意思!非常支持这类的研究。

小森森 2014-10-31 08:36:20

厉害

N

Neeke 2014-10-31 19:55:27

这个好

乌帽子 2014-11-02 21:33:19

官方文档仔细看的人真不多!难得。

1

1ee 2014-11-03 10:36:40

wamp(php版本5.5.12)测试不通过。
lnmp(php版本PHP 5.3.28)测试通过。

phith0n 2014-11-03 12:55:18

wamp没有使用fastcgi解析php,所以没有这个选项。
windows+phpstudy下测试可以通过。
感谢测试,不过更希望您仔细看文章。

F

Fire ant 2014-12-14 13:10:33

略屌

_

_Evil 2015-01-14 17:02:30


M

mantis 2015-06-10 18:00:12

windows+phpnow(php-5.2.14-Win32)测试不成功,求指教

路人甲 2015-10-25 14:44:09

@mantis .user.ini 应该是从php5.3.0 起用,你可以升级下看看

phith0n

一个想当文人的黑客

随机分类

后门 文章:39 篇
运维安全 文章:62 篇
无线安全 文章:27 篇
前端安全 文章:29 篇
神器分享 文章:71 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录