session.upload_progress
在php的配置文件中,有个session.upload_progress的配置项,相关参数的配置如下
1 | session.upload_progress.enabled = on |
enabled=on
表示当向服务器上传文件时,php会把该文件上传的相关进度信息存储在session中;cleanup=on
这代表当POST上传的文件完成上传时,上述存储在session中的上传进度信息便会被清除掉prefix
该参数的值是作为文件上传进度的键的前缀,默认值为”upload_progress_”name
该参数的值是作为上传进度信息的键,默认名为”PHP_SESSION_UPLOAD_PROGRESS”,它的值紧跟在prefix
后面,如果上传文件时没有传递该参数名的值,那么上传的进度将不会被记录。
综上也就是说在上传文件时,若PHP检测到了PHP_SESSION_UPLOAD_PROGRESS
变量,它会在session中创建一个由prefix
和name
连接起来的值作为索引,接着就会记录文件上传的进度信息。
例如上传文件时,同时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 | session.auto_start On |
那么利用上面说的原理,我们可以像服务器上传一个文件,并且同时将PHP_SESSION_UPLOAD_PROGRESS
的值设为一句话木马传过去,然后再去访问session文件,就可以getshell了。
不过还有个问题就是,session文件的内容当文件上传完成后便会立刻清空,正常来说是无法成功访问有效文件的,所以这里需要条件竞争,写个脚本不断上传文件,只要上传频率够快,一定会成功访问地到,下面给出十分简单的脚本。
1 | import requests; |
让脚本不断上传文件,一边打开蚁剑去连接shell
可能会连接失败,但是多尝试几次,就可以连上,如图
- 个人体会:
- 学习永远都是不简单的事,需要耐心、时间还有坚持