乌云知识库[day1]

Author Avatar
Tr0y 6月 11, 2018 16:08:54 本文共 716 字
  • 文为知己者书
  • 在其它设备中阅读本文章

.user.ini 文件构成的 PHP 后门 - web 安全 - phith0n

阅读笔记

0x00 背景

.user.ini.htaccess 用的更广,不管是 nginx/apache/IIS,只要是以 fastcgi 运行的 php 都可以用这个方法,不像.htaccess 有局限性。

0x01 .user.ini

  1. 什么是 .user.ini? 这得从 php.ini 说起了. php.ini 是 php 默认的配置文件, 这些配置中,又分为几种:PHP_INI_SYSTEMPHP_INI_PERDIRPHP_INI_ALLPHP_INI_USER
  2. 模式为 PHP_INI_USER 的配置项,可以在 ini_set() 函数中设置、注册表 中设置,再就是 .user.ini 中设置。 这里就提到了 .user.ini.
  3. 除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。而在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIRPHP_INI_USER 模式的 INI 设置可被识别。
  4. .user.ini 实际上就是一个可以由用户”自定义”的 php.ini. 按照表格来看, 能够自定义的设置是模式为 PHP_INI_PERDIRPHP_INI_USER 的设置. 实际上,除了 PHP_INI_SYSTEM 以外的模式(包括 PHP_INI_ALL)都是可以通过.user.ini 来设置的。
  5. php.ini 不同的是, .user.ini 是一个能被动态加载的 ini 文件. 修改了 .user.ini 后, 不需要重启服务器中间件, 只需要等待 user_ini.cache_ttl 所设置的时间(默认 300 秒), 即可被重新加载.
  6. 遗憾的是, 只要稍微敏感的配置项,都是 PHP_INI_SYSTEM 模式的(甚至是 php.ini only 的),包括 disable_functionsextension_direnable_dl 等。 不过,我们可以很容易地借助 .user.ini 文件来构造一个“后门”。

  7. 有哪些比较好玩的参数呢?

    auto_append_file, auto_prepend_file:

    指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了 require() 函数。而 auto_append_file 类似,只是在文件后面包含。 使用方法很简单,直接写在 .user.ini 中, 比如:
    auto_prepend_file=01.gif
    01.gif 是要包含的文件。
    所以,我们可以借助 .user.ini 轻松让所有 php 文件都“自动”包含某个文件,而这个文件可以是一个正常 php 文件,也可以是一个包含一句话的 webshell。

如果某网站限制不允许上传 .php 文件,你便可以上传一个 .user.ini,再上传一个图片马,包含起来进行 getshell。不过前提是含有 .user.ini 的文件夹下需要有正常的 php 文件,否则也不能包含了。再比如,你只是想隐藏个后门,这个方式是最方便的。

测试

环境 ubuntu+nginx+fpm+php7.2:
增加 .user.ini 后需要等待 5 分钟, 懒得等的话可以执行 sudo /etc/init.d/php7.2-fpm restart 让它重新载入.

文件内容如下:

结果如下:

Coooool~

End

What do you think?

本文标题: 乌云知识库[day1]
原始链接: http://www.tr0y.wang/2018/06/11/WooYunDay1/
发布时间: 2018.06.11-16:08
最后更新: 2018.11.03-21:08
版权声明: 本站文章均采用CC BY-NC-SA 4.0协议进行许可。转载请注明出处!