目录扫描脚本更新 Fay·D·Flourite

目录扫描脚本更新

做了一点修改,有的网站有url转发,将所有不存在的网站转到一个地址上(比如主页),导致所有不存在的地址返回的状态码都是200。卢姥爷给了点思路,把所有返回内容相同的界面过滤掉,于是根据这个思路改了改脚本。另外查了一查确实是存在404界面返回200状态码的情况的,将相同界面的删掉理论上来说能过滤掉不少意外情况。且实际情况中应该不会又那么多不同的界面有相同的内容。

另外也有429状态码(too many requests 请求过多)的情况,也改了一下,把429返回码的内容回炉重造,重新过一遍扫描。

新脚本如下:

import requests
import linecache
import re
import threading
import time

url=input(' [+] 输入要扫描的网址(有https://或http://)>>:')

threadnum=int(input(" [+] 输入线程数>>:"))

allnum=int(len(open('./dir.txt','r',encoding='utf-8').readlines()))

global lenth_array

lenth_array=[]

def getdir(num):
    dir_=linecache.getline('D:/script/dir.txt',num)
    scannerdir=''.join(str(s) for s in dir_)
    scannerdir=scannerdir.replace("\n", "")
    return scannerdir


def getpayload(dirname,url):
    payload=url+dirname
    return payload


#扫描并返回状态码为的目录
def scanner(url):
    r=requests.get(url)
    code=r.status_code
    #新加内容,判断响应长度,如果相同的太多就把后续相同的ban掉,防止url转发导致所有不存在的页面都返回200状态码
    
    text_lenth=len(r.text)

    if lenth_scan(text_lenth):

        #新增,判定状态码429后停止几秒再运行
        if code == 429:
            time.sleep(2)
            scanner(url)

        if code == 200 or code == 403:
            print(' [+] '+url+'-=-=-'+str(code)+'-=-=-'+str(text_lenth))


def lenth_scan(text_lenth):
    times=0
    for i in lenth_array:
        if i == text_lenth:
            times = times + 1
        #根据情况修改判断相同长度返回false的次数
        if times > 3:
            return False
    lenth_array.append(text_lenth)
    return True



#线程任务分配
def thread_distribute(num,threadnum,allnum):
    t=[]
    a=int(int(allnum)/int(threadnum))
    for i in range(0,a+1):
        number=int(num)+threadnum*i
        if number <= int(allnum):
            t.append(number)
    return t

def startscan(t,url):
    for i in t:
        it=getdir(i)
        targeturl=getpayload(it,url)
        scanner(targeturl)


def main():
    threads=[]
    for i in range(1,threadnum+1):
        _list=thread_distribute(i,threadnum,allnum)
        intolist=threading.Thread(target=startscan,args=(_list,url))
        threads.append(intolist)

    #开始线程
    for t in range(threadnum):
        threads[t].start()
        time.sleep(2)

    #主线程等待分线程
    for t in range(threadnum):
        threads[t].join()
        time.sleep(2)
    
    print("扫描完成")




if __name__ == "__main__":
    main()

由于加了判定数,也可以通过修改判定数来防止误判。后续碰到问题再进行完善。