目录扫描脚本更新
做了一点修改,有的网站有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()
由于加了判定数,也可以通过修改判定数来防止误判。后续碰到问题再进行完善。