安全测试工具,自动发现网站所有URL!

news2025/1/23 7:19:26

作为一个安全测试人员来说,首先要拿到网站所有url,然后根据拿到的url进行渗透测试进行漏洞挖掘。本文给大家介绍的是如何拿到一个网站所有的url。

深度爬取层级控制

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036【暗号:csdn999】

整体架构图

相信大家对深度控制和架构已经有基本了解,剩下的代码大家直接来看。非常易懂,不妨来试试。(下一次来给大家说一下代理池的创建,让你的Spider不被封)、

from lxml import html
import requests
import re
import pymysql

from search_ip import search_ip
###############代理###########

def get_proxy():
    return requests.get("http://127.0.0.1:5010/get/").content

def delete_proxy(proxy):
    requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))

def html_prase(url):
    r = requests.get(url).content
    return html.fromstring(r)



def url_is_correct():
    '''
    使用requests.get方法判断url是否正确,并返回url
    :return:
    '''
    url = "https://www.wuage.com" #网站入口
    requests.get(url)
    return url

url = url_is_correct()   #将验证为正确的url地址赋值给url

def url_protocol(url):
    '''
    获取输入的url地址的协议,是http、https等
    '''
    print('该站使用的协议是:' + re.findall(r'.*(?=://)',url)[0])
    return re.findall(r'.*(?=://)',url)[0]

urlprotocol = url_protocol(url)

def same_url(url):
    '''
    处理输入的url,判断是否为同一站点做准备,爬取的时候不能爬到其它站
    '''
    #将完整的url中的http://删除
    url = url.replace(urlprotocol + '://','')

    if re.findall(r'^www',url) == []:
        sameurl = 'www.' + url
        if sameurl.find('/') != -1:
            sameurl = re.findall(r'(?<=www.).*?(?=/)', sameurl)[0]
        else:
            sameurl = sameurl + '/'
            sameurl = re.findall(r'(?<=www.).*?(?=/)', sameurl)[0]
    else:
        if url.find('/') != -1:
            sameurl = re.findall(r'(?<=www.).*?(?=/)', url)[0]
        else:
            sameurl = url + '/'
            sameurl = re.findall(r'(?<=www.).*?(?=/)', sameurl)[0]
    #print('同站域名地址:' + sameurl)
    return sameurl

domain_url = url



'''
处理url的类,对已访问过的和未访问过的进行记录,待后续使用
'''
class linkQuence:
    def __init__(self):
        self.visited = []    #已访问过的url初始化列表
        self.unvisited = []  #未访问过的url初始化列表

    def getVisitedUrl(self):  #获取已访问过的url
        return self.visited
    def getUnvisitedUrl(self):  #获取未访问过的url
        return self.unvisited
    def addVisitedUrl(self,url):  #添加已访问过的url
        return self.visited.append(url)
    def addUnvisitedUrl(self,url):   #添加未访问过的url
        if url != '' and url not in self.visited and url not in self.unvisited:
            return self.unvisited.insert(0,url)

    def removeVisited(self,url):
        return self.visited.remove(url)
    def popUnvisitedUrl(self):    #从未访问过的url中取出一个url
        try:                      #pop动作会报错终止操作,所以需要使用try进行异常处理
            return self.unvisited.pop()
        except:
            return None
    def unvisitedUrlEmpty(self):   #判断未访问过列表是不是为空
        return len(self.unvisited)


class Spider():
    '''
    爬取程序
    '''
    def __init__(self,url):
        self.linkQuence = linkQuence()   #引入linkQuence类
        self.linkQuence.addUnvisitedUrl(url)   #并将需要爬取的url添加进linkQuence对列中
        self.current_deepth = 1    #设置爬取的深度

    def getPageLinks(self,url):
        '''
        获取页面中的所有链接
        '''
        sel = html_prase(url)
        pageLinks = sel.xpath('//a/@href')
        return pageLinks
    def processUrl(self,url):
        '''
        处理相对路径为正确的完整url
        '''
        true_url = []
        for l in self.getPageLinks(url):
            if re.findall(r'//',l):
                if re.findall('https://',l) or re.findall('http://',l):
                    true_url.append(l)
                elif not re.findall('@',l):
                    #true_url.append(urlprotocol + '://' + domain_url + l)
                    true_url.append(urlprotocol+':' + l)
        # for l in true_url:
        #     print(l)
        return true_url

    def sameTargetUrl(self,url):
        '''
        判断是否为同一站点链接,防止爬出站外。
        '''
        same_target_url = []
        for l in self.processUrl(url):
            if re.findall(domain_url,l):
                same_target_url.append(l)
        #print(self.same_target_url)
        return same_target_url

    def unrepectUrl(self,url):
        '''
        删除重复url,排除指定域名
        '''
        unrepect_url = []
        expect_domain = ['s.wuage.com','static.wuage.com',
                         'shop.wuage.com','img.wuage.com','medici.wuage.com',
                         'buyer.wuage.com','item.wuage.com']
        for l in self.sameTargetUrl(url):
            if l not in unrepect_url and l.split('//')[1].split('/')[0] not in expect_domain:
                unrepect_url.append(l)

        return unrepect_url

    def crawler(self,crawl_deepth=1):
        '''
        依据深度进行爬取层级控制
        '''
        #while self.current_deepth <= crawl_deepth:
        while self.current_deepth <= crawl_deepth:
            visitedUrl = self.linkQuence.popUnvisitedUrl()
            if visitedUrl is None or visitedUrl == '':
                continue
            self.getPageLinks(visitedUrl)
            links = self.unrepectUrl(visitedUrl)
            self.linkQuence.addVisitedUrl(visitedUrl)
            for link in links:
                sel_link = html_prase(link)
                print(link)
                self.linkQuence.addUnvisitedUrl(link)
            self.current_deepth += 1

        return self.linkQuence.visited


if __name__ == '__main__':
    spider = Spider(url)
    spider.crawler(3)

作者:胡歌,互联网公司运维技术负责人,拥有10年的互联网开发和运维经验。一直致力于运维工具的开发和运维专家服务的推进,赋能开发,提高效能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1289915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Glide自定义AppCompatImageView切分成若干小格子,每个小格子onDraw绘制Bitmap,Kotlin(1)

Android Glide自定义AppCompatImageView切分成若干小格子&#xff0c;每个小格子onDraw绘制Bitmap&#xff0c;Kotlin&#xff08;1&#xff09; 垂直方向的RecyclerView&#xff0c;每行一个AppCompatImageView&#xff0c;每个AppCompatImageView被均匀切割成n个小格子&#…

求职招聘小程序源码系统 全开源源代码:找工作+招人才 平台级别运营版 附带完整的搭建教程

在当前的求职招聘市场中&#xff0c;尽管存在大量的求职者和招聘者&#xff0c;但依然存在着信息不对称、沟通不畅等问题。小编来给大家分享一款求职招聘小程序源码系统&#xff0c;旨在提供一个高效、便捷、安全的求职招聘平台。 以下是部分代码示例&#xff1a; 系统特色功能…

C#事件的本质

event字段本质就是对委托进行私有访问限制&#xff0c;事件的本质就是委托&#xff0c;只不过系统会对用event字段修饰的委托进行了特殊处理&#xff0c;比如自动生成一个私有的委托变量&#xff0c;添加两个事件访问器&#xff0c;同时禁止外部类对事件的Invoke等方法调用。 …

Android的前台服务

概述 前台服务是用户主动意识到的一种服务&#xff0c;因此在内存不足时&#xff0c;系统也不会考虑将其终止。前台服务必须为状态栏提供通知&#xff0c;将其放在运行中的标题下方。这意味着除非将服务停止或从前台移除&#xff0c;否则不能清除该通知。 在 Android 8.0&…

用100ask 6ull配合 飞凌 elf1的教程进行学习的记录 - ap3216

100ask板子 不用改 ap3216.c "ap3216creg.h" 添加到drivers/misc 从这抄的: https://gitee.com/flameboyence/linux_driver_example/tree/master/22_i2c #include <linux/types.h> #include <linux/kernel.h> #include <linux/delay.h> #includ…

java第三十课

电商项目&#xff08;前台&#xff09;&#xff1a; 登录接口 注册接口后台&#xff1a; 注册审核&#xff1a;建一个线程类 注意程序中的一个问题。 这里是 5 条记录&#xff0c;2 条记录显示应该是 3 页&#xff0c;实际操作过程 有审核机制&#xff0c;出现了数据记录动态变…

H5ke13-1浏览器处理异常

window对应的error没有event对象 window对应的error他接收三个参数,msg,url,行号 return false return true 1就不会返回错误 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Title</title>&…

基于Java SSM框架实现超市进销存购物商城管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现超市进销存购物商城管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;社区生活超市管理系统当然也不能排除在外。社区生活超市管理系统…

Java动态代理实现与原理详细分析

Java动态代理实现与原理详细分析 关于Java中的动态代理&#xff0c;我们首先需要了解的是一种常用的设计模式–代理模式&#xff0c;而对于代理&#xff0c;根据创建代理类的 时间点&#xff0c;又可以分为静态代理和动态代理。 1、代理模式 代理模式是常用的java设计模式&…

线段树基础模板c++

线段树的基础模板代码 #include <bits/stdc.h> using namespace std; #define N 100005 #define int long long#define lc p << 1 // 2*i #define rc p << 1 | 1 // 2*i1int n, m; int w[N];struct node {int l, r, sum, add;} tr[N * 4]; // 构建线段树…

迅软DSE:为企业描绘安全蓝图,构建无忧网络办公天地

企业员工的不规范上网行为已成为管理人员面临的挑战&#xff0c;而利用上网行为管理软件则成为解决问题的最佳途径。 上网行为管理软件具备全面监控功能&#xff0c;可监控QQ、微信、电脑邮件、文件外发等行为&#xff0c;保证监控过程隐蔽而安全。通过实时屏幕监控功能&#…

智能优化算法应用:基于饥饿游戏算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于饥饿游戏算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于饥饿游戏算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.饥饿游戏算法4.实验参数设定5.算法结果6.参考…

【通信原理】数字基带信号传输和码间串扰

一、数字基带信号传输系统的组成二、无码间串扰的基带传输特性三、无码间串扰传输特性的设计

数据结构与算法编程题46

带权有向图邻接矩阵表示 //参考博客&#xff1a;https://blog.csdn.net/qq_54162207/article/details/117414707#include <iostream> using namespace std;#define Maxsize 100 #define VertexmMaxNum 20 #define ERROR 0 #define OK 1 typedef string VertexType; …

nginx遇到的问题和jks密码问题

1&#xff1a;nginx的配置&#xff1a; https 一定得配置 8080 ssl (我没有配置这个) 2&#xff1a;查看jks的密码 keytool -list -keystore secms.jks 让输入密码

【人体解剖学与组织胚胎学】练习二 重点知识点整理及对应习题

胃部 简答题 填空题 肝胆 简答题 填空题 消化道路径 简答题 牙位表示法 思考 [55, 85]都是乳牙&#xff0c;其它都是恒牙&#xff0c;考试中出现时&#xff0c;只需要画出十字&#xff0c;然后按上下对调&#xff0c;左右对调的角度进行观察

草柴返利APP领淘宝天猫优惠券拿购物返利 淘宝天猫订单如何隐藏删除订单记录?

草柴返利APP领淘宝天猫优惠券拿购物返利 手机安装「草柴」返利APP&#xff0c;复制要购买的商品链接到草柴&#xff0c;查询该商品淘宝天猫优惠券及购物返利&#xff0c;确认收货后到草柴返利APP提取返利&#xff1b; 淘宝天猫订单如何隐藏删除订单记录&#xff1f; 1、打开手…

【JavaEE进阶】 Spring 的创建和使⽤

文章目录 &#x1f334;前言&#x1f38b;创建 Spring 项⽬&#x1f6a9;创建⼀个 Maven 项⽬&#x1f6a9;添加 Spring 框架⽀持&#x1f6a9;添加启动类 &#x1f333;存储 Bean 对象&#x1f6a9;创建Bean&#x1f6a9;将 Bean 注册到容器 &#x1f332;获取并使⽤ Bean 对象…

Qt/C++音视频开发57-切换音视频轨道/切换节目流/分别切换音频视频轨道

一、前言 对各种音视频文件格式的支持&#xff0c;是一个播放器的基础功能。一般的音视频文件只有1路流&#xff0c;比如音频文件只有1路音频流&#xff0c;视频文件只有1路音频1路视频流&#xff0c;实践过程中发现&#xff0c;还有一种ts格式的文件&#xff0c;可能有多路流…

书-用数组给已知数组插入某个元素(3)

#include<stdio.h> int main(){int i ;int b[8]{99,65,87,23,44,55};//在87前面插入一个数int n6 ;// 长度for (in;i>3;i--)b[i]b[i-1]; //解释&#xff1a;原来23是第三个位置&#xff0c;但是插入数字后变成了第四个位置//就是把b[4]赋值给b[3];b[2]1000;nn1;//一定…