戟星安全实验室
本文约1260字,阅读约需3分钟。
前言
事情起因是审计时挖到一个文件包含漏洞,正好没找到文件写入点。借此机会学习和复现一下PHP >= 5.4 利用“Session Upload Progress”无文件包含姿势。
内容可控
首先我挖到的文件包含漏洞可以包含任意路径的文件,因为没有可以写入文件的点就需要考虑无文件包含的姿势,然后便是利用了”Session Upload Progress“进行无文件包含的,这是5.4新增的一个功能用于监测文件上传的进度——使用后PHP会把该文件的详细信息(如上传时间、上传进度等)存储在session当中。现在介绍一下相关的PHP配置信息:
”session.upload_progress.enabled = On“时为开启”上传进度监测功能“;
session.upload_progress.cleanup= On“ 表示上传文件完毕后清除该SESSION文件;
session.upload_progress.name则表示当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在$_SESSION中获得,上传进度的 索引是 session.upload_progress.prefix 与 session.upload_progress.name拼接在一起的值,同时注意该值会保存在SESSION文件中(在我们浏览页面的时候登录一个账号就会创建一个会话,SESSION文件就是这个登陆后会话的文件形式),因此SESSION文件的内容有部分是我们可控的可以插入php代码,具体见下图:
1.这是session.upload_progress.prefix
2.这是session.upload_progress.name
两者拼接存入SESSION文件,经过php自己处理后的SESSION文件大概长这样,观察后半部分可以发现我们提交的恶意代码。这时候我们搞定了漏洞的三分之一:文件内容可控。
二.SESS文件名可控,SESS文件名在正常创建的时候可以发现不是规律的,我们文件包含漏洞没办法猜到该文件名。
但是在“session.use_strict_mode = 0”(默认为0)时是可控的,该配置项意味着用户可以控制自己的会话ID。提交参数”PHPSESSID=pikachu“,PHP程序会自动创建一个我们预期的SESSION文件,也就是”sess_pikachu
显然,文件包含的文件名也可以猜到了。那么我们可以直接“include('xxx/tmp/sess_pikachu')”了吗?很可惜的是,在文件上传完毕之后所有文件上传进度信息都会清除。
三.session.upload_progress.cleanup与条件竞争
”session.upload_progress.cleanup = on“时在文件上传完毕之后所有文件上传进度信息都会清除,因此要用到条件竞争的方式在清除内容之前占用该文件,就像平时删除文件的时候系统提示文件占用一样。
补充一下:生成恶意SESS文件不是无条件的,只有服务器那边开了会话我们提交PHPSESSID才会创建该文件比如在
1.代码这里开启:
2.配置文件里开启
接下来漏洞利用具体操作就是,我们一边不停的生成我们的恶意SESS文件,一边不停的尝试触发文件包含漏洞。
成功包含文件
往期回顾
声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,戟星安全实验室及文章作者不为此承担任何责任。
戟星安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经戟星安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
戟星安全实验室
# 长按二维码 || 点击下方名片 关注我们 #
原文始发于微信公众号(戟星安全实验室):干货|Session Upload Progress 无文件包含利用复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论