Burpsuite 是我认为的Web安全方面最优秀的一款工具了,它的功能异常强大,几乎覆盖了Web渗透的方方面面
AWVS是我认为web漏洞扫描器中也是十分优秀的,不过是windows平台的,我不太常用
作为Web渗透的人员,掌握以上两款工具的使用是必须的
任何一款大型工具都是由细小的功能组成的,这次我打算从头写一款自己的web渗透的工具
一般人都会先做一个思维导图,之后按部就班,我的性格比较随性,就直接上手了,想到哪里做到哪里,会不会有结果也不一定
如果你愿意和我一起“冒险”,一起经历整个过程,那么你就接着往下面看吧!
我觉得渗透第一步是应该有渗透测试的目标,所以今天就来做一个URL采集的工具,搜索引擎使用的是百度的,编程语言是Python3
这种从百度搜索结果中获取URL肯定有前人写过啦,所以我们先百度搜索一下,看看其他人是这么写的
可以看到其实有很多结果,已经有很多人写过了,我们只需要根据我们渗透测试的特性进行修改就行了
我先把自己修改过后的代码发上来
# coding=utf-8
import requests
import sys
import queue
import threading
from bs4 import BeautifulSoup as bs
import lxml.html
import re
import lxml.etree
from urllib import parse
import time
headers = {
'Accept': 'text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, compress',
'Accept-Language': 'en-us;q=0.5,en;q=0.3',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'
}
def get_total_num(name):
r = requests.get('https://www.baidu.com/s?wd=%s'%name, headers=headers)
tree = lxml.html.fromstring(r.content)
search_result_class = tree.cssselect('span[class=nums_text]')[0]
search_result = lxml.etree.tostring(search_result_class, method='text', encoding="unicode")
num_list = re.findall(r'd{1,3}', search_result)
num = ''
for i in num_list:
num = i
num = int(num)
return num
class baiduSpider(threading.Thread):
def __init__(self, Queue, name):
threading.Thread.__init__(self)
self._queue = Queue
self._name = name
def run(self):
while not self._queue.empty():
url = self._queue.get()
try:
self.get_url(url)
except Exception as e:
print(e)
# 一定要异常处理!!!不然中途会停下,爬取的内容就不完整了!!!
def get_url(self, url):
r = requests.get(url=url, headers=headers)
soup = bs(r.content, "html.parser")
urls = soup.find_all(name='a', attrs={'href': re.compile(('.'))})
# for i in urls:
# print i
# 抓取百度搜索结果中的a标签,其中href是包含了百度的跳转地址
for i in urls:
if 'www.baidu.com/link?url=' in i['href']:
a = requests.get(url=i['href'], headers=headers)
time.sleep(0.5)
urlpro = parse.urlparse(a.url)
# 对跳转地址进行一次访问,返回访问的url就能得到我们需要抓取的url结果了
if a.status_code == 200 and not urlpro.path.endswith('/') and urlpro.path.split('.')[-1] not in ['htm','html','css','shtml'] and urlpro.netloc urlpro.path not in url_list:
url_list.append(urlpro.netloc urlpro.path)
with open('gotten_urls.txt','a ') as f:
print(a.url)
f.write(a.url 'n')
def main(keyword):
# 获取关键字
name = keyword
# 保存文件
f = open('gotten_urls.txt', 'w')
f.close()
myqueue = queue.Queue()
num = get_total_num(name)
finalnum = num - num
print(finalnum)
for i in range(0, finalnum, 10):
myqueue.put('http://www.baidu.com/s?wd=%s&pn=%s' % (keyword, str(i)))
threads = []
thread_count = 10
for i in range(thread_count):
spider = baiduSpider(myqueue, name)
threads.append(spider)
for i in threads:
i.start()
for i in threads:
i.join()
print("It's down,sir!")
if __name__ == '__main__':
if len(sys.argv) != 2:
'no keyword'
'Please enter keyword '
sys.exit(-1)
else:
url_list = []
main(sys.argv[1])
在公众号中代码可能变形了吧,这里我再附上图片
代码其实很简单,我就做简单的分析好了
这里就是简单的引包的过程,Python3不自带的包可以使用pip install 的方式安装
根据Python3的执行顺序,此处定义我们要发送HTTP包的Headers信息
之后来到这里,确保有一个参数,比如 python3 baiduso.py test
之后首先定义一个全局变量 url_list 为列表类型,之后来到main()函数
从此才是正文,首先我们应该思考一下URL采集的过程
- 百度搜索关键字
- 获取返回的页面
- 筛选出URL地址
其实这其中还是有一些细节的,我们接着说
代码首先定义好我们要保存结果的文件
之后定义一个队列来确保搜索结果每一页有序执行
下面是我写的一个获取总的搜索结果条数的函数,这个函数也十分简单
这个函数主要就是获取下面图片中的值
获取到这个值,再除以10就是总的页数了
main函数剩下的基本就是为每个创建的baiduSpider对象开启一个新的线程,从而完成多线程
那么我们再来看看baiduSpider这个类是如何写的吧
这个类中主要的函数就只有get_url这个函数,这个函数主要就是完成与百度搜索引擎交互的功能了,并且用bs 筛选出所有<a>标签中的href属性
获取其中的链接地址
获取到地址之后先判断是不是以htm,html,css,shtml结尾,如果不是再进行去重,将 http://www.test.com/index.php?id=1 和 http://www.test.com/index.php?id=2 这种链接做同化处理,只在文件中保存一个
最后写入去重后的url地址
怎么样,很简单吧,以后我就不再说得这么详细了
下面我们来测试一下吧
假如我们测试一下搜索所有url中含有 php?id= 的结果
可以看到一共有 10200000个结果,,由于我设置了每0.5秒访问一次,所以速度不至于被服务器封禁掉,大家可以按照自己的需求进行修改
下面我进行一个漏洞搜索吧,比如我们搜索 thinkphp曾经的一个远程代码执行吧
可以看到其中有2050个结果,此时我们再写一个批量脚本可能就可以筛选出这些结果中的存在漏洞的站点,之后批量获取shell了
最后附上文件
链接: https://pan.baidu.com/s/1m13WilN9xtRvvk6MdwiMOw 密码: di5c
这样一个URL采集工具就写好了,至于接下来写点什么,看心情吧!