Web安全

Bypass disable_functions

Bypass disable_functions

目录

 

环境搭建

docker:https://hub.docker.com/r/boosen/lnmp/tags
版本:ubuntu 14.04 + php5.6 + mysql 5.5 + nginx1.8

  1. sudo wget -qO- https://get.docker.com|sh 安装docker 最新版
  2. vim /etc/docker/daemon.json 写入 { "registry-mirrors": ["https://registry.docker-cn.com"] } 换源
  3. docker pull boosen/lnmp 拉取lnmp环境
  4. docker container run -d -it -p 8081:80 --name xxx boosen/lnmp 开启容器
  5. docker exec -it id /bin/bash 进入容器

Bypass disable_functions

1. imap_open (CVE-2018-19518) 绕过

1.安装imap_open 扩展

2.简单分析
根据https://lab.wallarm.com/rce-in-php-or-how-to-bypass-disable-functions-in-php-installations-6ccdbf4f52bbhttps://www.codercto.com/a/43774.html

  1. 当能够使用ssh时,imap会启动一个预认证模式,使用ssh协议进行认证,如果认证成功就不会建立一个imap连接,而是继续执行。
  2. 基于预认证模式,我们就可以通过ssh进行参数传递,这个参数就是mailbox,而ssh中有一个参数-o,这个参数可以指定连接时的参数选项,如果我们指定ssh的另一个参数ProxyCommand,就可以通过这个参数执行命令。

3.payload构造


4.修复

  1. php版本符合以下可以在php.ini设置:

这样就可以禁止不安全的预认证

  1. 禁用imap_open函数

2. ImageMagick(CVE-2016-3714)绕过

1.环境要求
imagick 版本<=6.9.3-9

2.简单分析
根据http://www.zerokeeper.com/vul-analysis/ImageMagick-CVE-2016-3714.html简单分析:

  1. Imagick是一个图形处理库,支持的语言非常多,通过这个库可以对web图片进行裁剪、翻转等操作,但是由于其对https文件处理不当,导致我们可以执行命令。
  2. /etc/ImageMagick-6/delegates.xml

如果对https形式的资源进行处理,导致我们可以通过命令拼接的方式command=curl -s -k -L -o "%o" "https:%M",通过|&、`的方式进行命令的拼接,其中%M是占位符:

3.payload构造

  1. vim poc.png 写入以下内容
  1. 写一个上传页面upload.php(主要是用来调用Imagick类的)
  1. 上传文件

3.修复方法

  1. 升级Imagick到6.9.3-10及以上
  2. 使用 policy file 来防御这个漏洞,这个文件默认位置在 /etc/ImageMagick-6/policy.xml ,我们通过配置如下的 xml 来禁止解析 https 等敏感操作:

3. mail()函数

1. 环境要求
参考:https://xz.aliyun.com/t/3937

  1. cve-2014-6271(bash 破壳漏洞),不过太老了,这种 bash软件的漏洞发行版基本上痘修复了,所以不考虑
  2. mail()、putenv()以及getenv()可用

2. payload构造

  1. 生成evil.so,上传到/tmp/evil.so

若是没启用或者不存在/usr/bin/sendmail这样的功能,还可以利用GCC的扩展修饰符:
若函数被设定为constructor属性,则该函数会在main()函数执行之前被自动的执行。类似的,若函数被设定为destructor属性,则该函数会在main()函数执行之后或者exit()被调用后被自动的执行,而在PHP这里执行的前提是,我们需要新启动一个进程,因为共享库不是被系统自动加载的,而是新进程要求加载的

  1. shell.php

3. 修复方法
禁用putenv

5. error_log

1. 介绍
error_log 用来将错误消息发送到web日志或者系统文件中,但是有趣的地方在于该函数的第二个参数:message_type,根据官方文档描述:当message_type为1时,就会使用邮件发送消息,而使用的邮件也就是sendmail,所以这方法就和上一个:mail有点像了

2. payload构造
将共享库evil.so上传到/tmp目录 shell.php:

5. Imagick 结合LD_PRELOAD的另一种用法

1. 介绍 Imagick在处理ffpemg类型的文件时,会去调用外部处理程序,在对利用了Imagick的php文件进行strace追踪后,发现调用栈里面除了/usr/bin/php这个php的解释器外,还调用了/bin/sh来执行ffpemg命令,那么我们便可以劫持/bin/sh加载的共享对象了:

6. pcntl_exec

1. 环境要求
phpinfo()中,编译带有--enable-pcntl

2. payload构造

3. 修复方法
禁用pcntl_exec

7. Bypass with via mod_cgi

1. 环境要求
参考:http://0cx.cc/bypass_disabled_via_mod_cgi.jspx

  1. apache 服务器
  2. .htaccess文件可写
  3. mod_cgi 模块启用
  4. chmod() 没被禁用

2. payload构造

 

8. bypass with via LD_PRELOAD (感觉是最强大的方法)

https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
已经够详细了,就不画蛇添足了

 

9. COM 组件 (WINDOWS 专属)

1. 环境要求

  1. extension = php_com_dotnet.dll
  2. 搜索 phpinfo() 是否有 com_dotnet

2. payload构造

3. 修复方法
禁用 COM组件:注释extension = php_com_dotnet.dll

 

10. 终极大杀器(自动化傻瓜,只支持类unix) 蚁剑扩展

https://github.com/AntSword-Store/as_bypass_php_disable_functions

 


2020年7月10更新

10. php7.0-7.3垃圾回收器bug,适用于*inx

11. json serializer UAF ,*nix

 

12. debug_backtrace uaf,应用于php7.0-7.4的*nix系统

 

 

 

13. php7.4 ffi.enable=true

无回显

 

 


 

2022年1月12日更新

14. PHP 7.0-8.0 user_filter

利用的是php的一个bug:https://bugs.php.net/bug.php?id=54350

影响版本:

  • 5.* – exploitable with minor changes to the PoC
  • 7.0 – all versions to date
  • 7.1 – all versions to date
  • 7.2 – all versions to date
  • 7.3 – all versions to date
  • 7.4 < 7.4.26
  • 8.0 < 8.0.13

 

 

15. PHP 7.3-8.1 concat_function

该漏洞利用了处理字符串连接的函数中的错误。如果满足某些条件,a.b 之类的语句可能会导致内存损坏。

影响版本:

  • 7.3 – all versions to date
  • 7.4 – all versions to date
  • 8.0 – all versions to date
  • 8.1 – all versions to date

 

Reference

  1. Pwn stuff
  2. 一个各种方式突破Disable_functions达到命令执行的shell

 

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注