安全-Pass12之白名单GET型00截断绕过(upload-labs)

Posted 小狐狸FM

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安全-Pass12之白名单GET型00截断绕过(upload-labs)相关的知识,希望对你有一定的参考价值。

前言

  • 00绕过需要有两个条件,一是magic_quotes_gpc状态为off,二是php的版本要小于5.3.4
  • phpHypertext Preprocessor超文本预处理器,多用于web后端
  • BUUCTF的upload-labs在线靶场和本地的靶场有点差别,如果用文章的方法没法绕过时,注意看一下源码是否一致

相关介绍

ASCII 百度百科

PHP 百度百科

PHP: PHP 手册 - Manual

Upload-labs Pass-11 Pass-12 截断漏洞

00截断上传绕过_文件上传漏洞“%00截断”绕过

文件上传绕过之00截断

upload-labs第11~12关 00截断

其他介绍

文件上传绕过思路集合

upload-labs靶场下载

upload-labs在线靶场-BUUCTF

蚁剑AntSword

菜刀Cknife

Seay

一、题目

php后端代码

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

二、WriteUp

[1]. 函数介绍

PHP函数介绍
date(格式)以固定的时间格式获取当前系统的时间
in_array(变量,数组)如果变量存在于数组就返回true,否则返回false
isset(变量)如果变量存在且值不为null返回true,否则返回false
move_uploaded_file(文件路径,文件夹路径)将文件移动到指定文件夹下
rand(数字1,数字2)从数字1到数字2的范围内生成随机数,两个数字都有包含在内
strrpos(字符串1,字符串2)计算字符串2在字符串1中最后一次出现的下标(下标从0开始)
substr(字符串,起始位置,子串长度)返回字符串的子串,未填写子串长度时表示截止到主串末尾

[2]. 源码审计

(1). 变量判断

  • php代码进行审计,if语句比较多最好从外往内分析
  • 第一条if语句只是判断了一下提交的post请求中submit参数是否被设置且非空
    PHP:isset - Manual

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {//第一条if语句
	//代码
}

(2). 白名单

$ext_arr是一个数组类型,当文件的后缀为其中的一个时才能上传

'jpg','png','gif'
//代码
if (xxx) {//第一条if语句
	$ext_arr = array('jpg','png','gif');
	//代码
}

(3). 获取文件后缀

假设文件名为test.php

传入的值返回的值代码代码作用
test.phptest.php$_FILES['upload_file']['name']获取上传的文件名
test.php4strrpos($_FILES['upload_file']['name'],".")获取小数点在文件名中的下标
45strrpos($_FILES['upload_file']['name'],".") + 1获取小数点右移一位的字符下标
test.phpphpsubstr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);获取文件的后缀名
//代码
if (xxx) {//第一条if语句
	//代码
	$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
	//代码
}

(4). 白名单过滤

$file_ext存储了文件的后缀名,当文件的后缀为$ext_arr中的值,才能进入if语句

'jpg','png','gif'
//代码
if (xxx) {//第一条if语句
	//代码
	if(in_array($file_ext,$ext_arr)){//第二条if语句
        //代码
    } else{//第二条if语句为假
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

(5). 文件存储路径设置

  • 在上传文件的时候,文件都会被存储在一个临时的文件夹下
    我们不需要知道具体路径,只需要通过tmp_name参数获取路径即可
  • save_path的值是通过GET的方式传入
    $file_ext是文件的后缀,不含小数点
    rand(10,99)则是从10到99数字中取随机数,范围左闭右闭
    date("YmdHis")用于获取当前的时间,以xxxxxxxxxxxxxx秒为格式
    两个字符串变量之间的连接用小数点
//代码
if (xxx) {//第一条if语句
	//代码
	if(xxx){//第二条if语句
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
    } else{//第二条if语句为假
        //代码
    }
}

(6). 移动临时文件

  • 剩余的代码仅是用于移动上传的文件,没有对文件进行过滤操作
//代码
if (xxx) {//第一条if语句
	//代码
	if(xxx){//第二条if语句
        //代码
        if(move_uploaded_file($temp_file,$img_path)){//第三条if语句
            $is_upload = true;
        } else {//第三条if语句为假
            $msg = '上传出错!';
        }
    } else{//第二条if语句为假
        //代码
    }
}

[3]. 00绕过

(1). 环境设置

00绕过的条件如下

条件版本/参数
php< 5.3.4
magic_quotes_gpcOff

先安装一个小于5.3.4版本的php,然后在网站中修改php版本

magic_quotes_gpcphp.ini文件中


(2). 绕过

下方表格来自ASCII 百度百科

修改文件后缀为白名单后缀.jpg

抓包修改save_path的值为../upload/test12.php%00


在服务端可以发现,成功上传了木马文件


(3). 访问测试

  • 复制图片地址后,发现后面增加了一些没用的字符信息
  • %EF%BF%BD是经过URL编码后的结果
    /7020210812144711.jpg是代码中添加的内容
http://127.0.0.1/upload-labs-master/upload/test12.php%EF%BF%BD/7020210812144711.jpg
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

直接删除.php之后的内容进行访问,访问成功表示文件被解析了

(4). 连接shell

使用蚁剑或菜刀连接木马


以上是关于安全-Pass12之白名单GET型00截断绕过(upload-labs)的主要内容,如果未能解决你的问题,请参考以下文章

WEB安全之文件上传--白名单绕过%00截断

文件上传 [upload-labs-master][Pass11-19]

文件上传漏洞之白名单

一道面试题引发的思考第一篇-文件上传白名单绕过

一道面试题引发的思考第一篇-文件上传白名单绕过

安全-Pass03之黑名单绕过(upload-labs)