自研安全工具之网页全链接爬取
时间: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()
- libvirt-内存分配和内存热插拔
- selenium+python自动化79-文件下载(SendKeys)
- selenium+python自动化80-文件下载(不弹询问框)
- libvirt-cpu分配和cpu热插拔
- 如何使用curl调试openstack的api
- selenium+python自动化81-报告优化
- Selenium+python自动化82-只截某个元素的图
- libvirt-TLS加密
- 在openstck中配置使用cloud-init
- libvirt-使用cgroup做资源分割控制
- libvirt-usb设备透传给虚拟机
- Appium+python自动化22-Android夜神模拟器
- 每周学点大数据 | No.9递归——以阶乘为例
- appium+python自动化24-滑动方法封装(swipe)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring Boot 系列:最新版优雅停机详解
- 前端学数据结构与算法(八): 单词前缀匹配神器-Trie树的实现及其应用
- 突击并发编程JUC系列-Locksupport 与 Condition
- 01.视频播放器框架介绍
- C#扫描器编写各种问题荟萃
- JavaScript中的浅拷贝与深拷贝
- 自己实现一个VUE响应式--VUE响应式原理
- 各种CSS居中方案
- JavaScript的内存管理
- 实现自己的Vue Router -- Vue Router原理解析
- G级大文件分割器 + 核心源码
- 前端也能学算法:JS版常见排序算法-冒泡,插入,快排,归并
- 前端也能学算法:JS版链表
- 将二进制文件加入VC资源后释放执行
- JavaScript中的函数式编程