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知识库]代码审计之文件包含

0x00 文件包含

本地包含

本地文件包含(Local File Include)简称 LFI,文件包含在php中,一般涉及到的危险函数有include()include_once()require()require_once(),在包含文件名中存在可控变量的话就可能存在包含漏洞,由于这几个函数的特性也可能产生其他漏洞,后面一一讲到。

示例:

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

payload:

http://127.0.0.1/test.php?name=D:\phpstudy\PHPTutorial\MySQL\my.ini

这是个最简单的文件包含,没有任何过滤。但是一般程序不会这么写,一般会指定后缀,这样我们就需要截断来绕过了。

<?php
    $file = $_GET['name'];
    include($file . "html");
?>

在PHP5.2.x中我们可以通过使用%00来截断后面的内容、也可以使用路径长度截断,不过都在php5.3中被修复了。

payload:

http://127.0.0.1/test.php?name=D:\phpstudy\PHPTutorial\MySQL\my.ini%00

在这里插入图片描述
利用字符.或者/.或者./来截断。系统文件路径长度限制:windows 259个byteslinux 4096个bytes。

远程包含

远程文件包含漏洞(Remote File Inclusion)简称RFI,他需要我们的php.ini中配置allow_url_includeallow_url_fopen

1.包含远程文件

需要打开allow_url_include=Onallow_url_fopen = On
在这里插入图片描述
也可以利用?号截断,不受版本限制

payload:

http://127.0.0.1/test.php?name=http://127.0.0.1/1.txt?

2.伪协议

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

各种伪协议的使用方法网上很多,大家搜索一下吧。

实战审计

直接看主页index.php

<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>

他会包含files目录下的文件,因为他没有过滤…/所以可以包含任意目录下的文件,由于加了后缀所以漏洞存在于低版本php。
在这里插入图片描述

0x01 任意文件删除

任意文件删除审计一般来说我们都是搜索函数unlink 然后回溯去看。

inc\zzz_file.php
在这里插入图片描述
首先判断传入的参数是否为空,然后拼接路径,第516行中出现了一个函数ifstrin,我们跟进看看
在这里插入图片描述
只是个简单的判断没啥特殊情况,我们再来看看拿来调用了这个文件。
在这里插入图片描述

function file_path( $path ) {
    $list=array();
	$path= substr( $path, 0, strrpos( $path, '/' ));
    $list=splits($path,'/');
    return $list;
}

function arr_search($arr1, $arr2 ) {
    $result=false;
    foreach ( $arr1 as $v ) {
       if(in_array( $v,$arr2 )) return true;        
    }
    return $result;
}

获取参数,然后看看我们传入的路径是否存在这个数组里面的值,也就是基本上是没有过滤的,因为我们完全可以通过…/ 跳回去。

payload:

POST /zzzp6p/admin/save.php?act=delfile

path=/zzzp6p/upload/../install/1install.lock

这里我们走的下面的分支不能删除 array( 'php', 'db', 'mdb', 'tpl' ) 这个数组的文件。

要删除任意文件只需要使用

path=/zzzp6p/runtime/../install/1.db

ifstrin()为true走上面的分支即可。

一般来说我们任意文件删除 是配合删除install.lock来达到网站重装漏洞。

0x02 任意文件下载

任意文件下载常见于文件的显示和下载的地方,一般关注的文件是和下载有关的,比如download。当然你还可以搭建源码,来寻找能够下载的地方。

常见的下载或读取函数: file_get_contents()readfile()fopen()

在网上找到个别人审计的实例,结合起来审计一下,用到的源码是Ear_Music_20180820_UTF8

搜索down相关的词语,找到文件\template\default\source\down.php
在这里插入图片描述
我们看看$file参数怎么来的,先是调用函数getfield(),转到函数去看看
在这里插入图片描述
不出意外应该是从数据库中读取路径,再来看看geturl()函数
在这里插入图片描述
构造下载地址,这些地方没什么问题,我们来看看什么地方对储存地址的表中插入了数据,搜索表名lyric

\source\user\music\ajax.php
在这里插入图片描述我们看到$lyric经过 checkrenameSafeRequest这两个函数的清洗,先来转到函数SafeRequest
在这里插入图片描述我们传入的mode是get,然后经过addslashes()的转义,下面在替换为空,也就是我们基本上是不能使用\\了,我们在看看checkrename
在这里插入图片描述这里正则匹配了我们的

.\ 
?iframe=
.php?

这里完全看不懂他匹配后缀为php?这个的意义何在,直接php就绕过了。

所以综合起来就是不要带有\ 和 ./ 这里我们只要传入绝对路径就可以了

登陆前台找到上传歌曲的页面在歌词地址中插入payload

payload:

D:/phpstudy/PHPTutorial/WWW/Ear_Music/template/default/source/down.php

在这里插入图片描述

0x03 文件上传

文件上传只有一个函数 move_uploaded_file() 一般来说,我们就可以搜索这个函数来回溯,看他的验证方式,是黑名单还是白名单,是否是前端限制,是否只是简单的验证了文件头,是否是能绕过的正则匹配,是否渲染了图片。

结合zzzphp来审计一下文件上传,全局搜索move_uploaded_file

\zzzcms\inc\zzz_file.php
在这里插入图片描述
回溯看看那里调用了这个函数
在这里插入图片描述
典型的黑名单验证,可以使用asa绕过,只需要在后台添加这个扩展名
在这里插入图片描述
上传即可,当然也可以通过上图中的 switch分支,只要传入的 type不是他的类型就可以跳过后台添加这个步骤,
在这里插入图片描述

0x04 文末

对文件的操作还见于写入其他配置文件,典型的有thinkphp缓存文件写入。

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

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