自研安全工具之网页全链接爬取

时间:2022-07-23
本文章向大家介绍自研安全工具之网页全链接爬取,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

"我写工具不是为了超越哪一款工具,现在burpsuite已经趋近完美了。

不过有一些角落但很重要的东西还是需要我去填补"


这次给大家带来的小工具是一个网站全链接爬取的工具的基础版本,大家可以拿回去在这基础上继续开发

还是顺着我们之前的思路,已经确定了目标(URl采集)

接下来我们有针对性的对一些目标进行渗透测试

今天给大家带来的是一个对目标进行爬取全站链接的工具


前几天对一个办公系统(有授权)进行渗透测试的时候发现,这种系统并不是说像我们所说的门户网站那样,大致功能都可以看到

这种系统表现出来的只是一部分,更多的普通访问时无法访问到的,所以我用了暴力破解的方式获取了更多的网站目录结构,从而发现了更多的漏洞

我开始意识到你能获取到多少目录结构决定了你的攻击面有多大,所以我才决定写这样的一个工具

PS:这个工具只能获取能访问到url,一些在页面中没有的url是无法获取到的,需要暴力破解

一、安装第三方模块

requets、bs4

二、使用方法

Usage: xxx.py https://www.baidu.com

记得带上http 或 https

三、注意事项

这个脚本没有使用代理,大家可以自己加,就几行代码

偶尔会发生内存溢出的问题,这个我也不知道为什么

四、开发建议

后期我肯定会把各种脚本综合起来做成一个自动化工具,到时候应该不会发布出来

大家开发时候可以做成一个类,将这个脚本里面的函数都变成类函数

代码如下:

import requests
import sys
from urllib import parse
import time
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import re


# def getUrladdr():
#     if not len(sys.argv) == 2:
#         print('Usage: xxx.py https://www.baidu.com')
#     else:
#         url = sys.argv[1]
#         return url

def getRobots(robots_url):
   url = url_parts.scheme + '://' +url_parts.netloc+ '/robots.txt'
   # print(url)
   headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate',
        'Connection': 'close',
        'Upgrade-Insecure-Requests': '1'
    }
   r = requests.get(url, headers=headers)
   if r.status_code == 200:
      for i in re.findall(r'/.+', r.text):
         # print(i)
         url = urljoin(url_parts.scheme + '://' +url_parts.netloc, i.strip())
         print(url)
         getLinks(url)


def get_Full_Path(one_url, orl_url):
    # 这个函数是用来获取绝对url的

    url = one_url.strip()
    if not url.startswith('http') and not url.startswith('javascript') and not url.startswith(
            'mail') and not url.startswith('#') and not url.startswith('https*'):
        url = urljoin(orl_url.strip(), url)
    elif url.startswith('http') or url.startswith('https'):
        url = url
    else:
        url = None
    return url


def del_url(one_url):
    # 这个函数用来处理url的存储问题

    script_type_list = ['asp', 'aspx', 'html', 'php', 'jsp', 'css', 'js', 'ashx', 'txt', 'config', 'conf', 'inc', 'htm', 'action']
    # 遇到这些结尾的url才做爬取

    urlparsed = parse.urlparse(one_url)
    script_type = urlparsed.path.split(r'.')[-1]
    domain = urlparsed.netloc

    if domain == url_parts.netloc:
        if script_type in script_type_list or script_type.endswith('/'):
            if one_url not in url_set:
                url_set.add(one_url)
                with open('urls.txt', 'a+') as f:
                    print(one_url)
                    f.write(one_url + 'n')
                getLinks(one_url)



def getLinks(url):
    urlparsed = parse.urlparse(url)
    # domain = urlparsed.netloc
    orl_url = urlparsed.scheme + '://' + urlparsed.netloc + urlparsed.path
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate',
        'Connection': 'close',
        'Upgrade-Insecure-Requests': '1'
    }
    try:
        req = requests.get(url, headers=headers)
        time.sleep(0.2)
        soup = BeautifulSoup(req.text, 'html.parser')
        for a_mark in soup.find_all('a'):
            one_url = a_mark['href']
            if one_url != None:
                one_url = get_Full_Path(one_url, orl_url)

                # sprint(one_url)
                if one_url:
                    del_url(one_url)
    except Exception as e:
        print('出现了异常')


def main():
    getRobots(url_parts)
    getLinks(url)



if __name__ == '__main__':
    url_set = set()
    # set用来去重

    if not len(sys.argv) == 2:
        print('Usage: xxx.py https://www.baidu.com')
        exit(0)
    else:
        url = sys.argv[1]
    url_parts = parse.urlparse(url)
    main()
else:
    url_set = set()