利用Python进行Web渗透测试(九):添加渗透测试探测器结果截图(转载)
本篇将会涉及:
- Selenium与PhantomJS
- 为渗透测试探测器添加截图功能
- 测试新功能
在前面文章中,我们使用Python编写了一个渗透测试探测器,从fuzz数据库中获取字典信息,利用requests模块请求拼接组装的URL,从而获得URL的响应内容,并借助termcolor模块将整理后的信息打印出来。
现在我们又有了一个不成熟的想法,不知道当不当说。
在正常的Web渗透测试中,我们在探测完一个网站,获取到所有的探测结果之后,肯定要看看请求成功的链接的网页是长什么样子的。如果URL过多,一个一个去点击的话,就太浪费时间了。所以我们需要获取到网页的截图,方便探测完之后,查看网页。
文章目录 [隐藏]
Selenium与PhantomJS
要对请求的网页进行截图,这样的操作,requests大概是没辙了。这时候,我们需要使用到另一个工具——Selenium,一个专门用于Web自动化测试的模块。
其能够借助浏览器内核驱动,实现浏览器的各种动作。在Python中,我们通过pip可以轻易的进行安装:
pip install selenium
Selenium可以使用多种浏览器内核,比如主流的Chrome、 Firefox等,但在这里,我们使用另一个非主流的浏览器——PhantomJS,一个无头浏览器。除了没有图形界面外,拥有其他主流浏览器的所有功能。
![](http://upload-images.jianshu.io/upload_images/38544-ea438968cb11a6ea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我们可以在命令行使用phantomjs,自然也可以在Python中使用Selenium来调用phantomjs:
from selenium import webdriver
driver = webdriver.PhantomJS(executable_path=r"D:\phantomjs.exe")
这样,就实现了使用PhantomJS作为Selenium调用的浏览器内核了。
在实例化一个webdriver后,使用get()方法,可以访问一个URL:
driver.get("http://bxu2713810459.my3w.com")
使用save_screenshot()方法,可以保存页面的截图。
driver.save_screenshot("zmister.com.png")
关于Selenium的其他运用,可以参见博客的其他文章,或是网络上的资料。在此,我们主要使用到这两个方法。
添加网页截图功能
了解到使用Selenium进行网页请求和截图的方法后,我们就可以为我们的渗透测试探测器添加新功能了。
当然,肯定不是每个页面都需要保存网页的截图,我们对请求成功的页面进行截图,也就是响应的状态码大于等于200小于300的网页才需要截图。
下面修改一下request_performer()类中的run()方法:
def run(self):
try:
r = requests.get(self.url)
# 统计网页行数
lines = str(r.text.count("\n"))
# 统计网页字符数
charts = str(len(r.text))
# 统计网页词数
words = str(len(re.findall(r"\S+", r.text)))
# 哈希值
hashs = str(hashlib.md5(r.content).hexdigest())
# 状态码
scode = str(r.status_code)
if scode != str(self.hidecode):
if '200' <= scode < '300':
driver = webdriver.PhantomJS(executable_path=r"D:\phantomjs.exe")
driver.get(self.url)
time.sleep(3)
driver.set_window_size(1024,768)
driver.save_screenshot(self.word+".png")
print(colored(scode,'green') + "\t" + charts + " \t" + lines + " \t" + words+" \t"+hashs+"\t"+self.url)
elif '400' <= scode < '500':
print(colored(scode,'red') + "\t" + charts + " \t" + lines + " \t" + words+" \t"+hashs+"\t"+self.url)
elif '300' <= scode < '400':
print(colored(scode,'blue') + "\t" + charts + " \t" + lines + " \t" + words+" \t"+hashs+"\t"+self.url)
else:
print(colored(scode,'yellow') + "\t" + charts + " \t" + lines + " \t" + words+" \t"+hashs+"\t"+self.url)
i[0] = i[0] -1
except Exception as e:
print(e)
我们主要添加了4行代码:
driver = webdriver.PhantomJS(executable_path=r"D:\phantomjs.exe")
driver.get(self.url)
time.sleep(3)
driver.set_window_size(1024,768)
driver.save_screenshot(self.word+".png")
实例化一个webdriver,请求url,等待3秒,设置浏览器窗口大小,保存网页截图。
测试网页截图功能
修改好代码之后,我们可以测试一下我们的第4版本的渗透测试探测器了。
在命令行终端运行命令:
python3 bruteforce4.py -w http://www.scruffybank.com/FUZZ -t 5 -f common.txt -c 404
![](http://upload-images.jianshu.io/upload_images/38544-dff5b2cb622bca9e.gif?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
运行完成,我们看看我们的文件夹:
![](http://upload-images.jianshu.io/upload_images/38544-1550d059a22f0196.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
多出了5个图片,我们打开一个看看:
![](http://upload-images.jianshu.io/upload_images/38544-244d3655aec54491.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
与浏览器打开的是一样的:
![](http://upload-images.jianshu.io/upload_images/38544-52d37013f8d89b3d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这样我们使用Python编写的渗透测试探测器就基本完善好了。
接下来,我们将会介绍Python Web渗透测试之密码攻击!
文章版权所有:州的先生博客,转载必须保留出处及原文链接
原文地址:https://zmister.com/archives/185.html
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# coding:utf-8 import requests from threading import Thread import sys import getopt from termcolor import colored, cprint import re import hashlib from selenium import webdriver import time # 程序标识 def banner(): print("\n********************") name = ''' ______ _ _ |___ / (_) | | / / _ __ ___ _ ___| |_ ___ _ __ / / | '_ ` _ \| / __| __/ _ \ '__| / /__| | | | | | \__ \ || __/ | /_____|_| |_| |_|_|___/\__\___|_| ''' print(name) print("州的先生-暴力发掘器 v0.1") print("***********************") # 程序用法 def usage(): print("用法:") print(" -w:网址 (http://wensite.com/FUZZ)") print(" -t:线程数") print(" -f:字典文件") print("例子:bruteforcer.py -w http://bxu2713810459.my3w.com/FUZZ -t 5 -f commom.txt") class request_performer(Thread): def __init__(self, word, url): Thread.__init__(self) try: self.word = word.split("\n")[0] self.urly = url.replace('FUZZ', self.word) self.url = self.urly except Exception as e: print(e) def run(self): try: r = requests.get(self.url) # 统计网页行数 lines = r.text.count("\n") # 统计网页字符数 charts = len(r._content) # 统计网页词数 words = len(re.findall(r"\S+", r.text)) # 哈希值 hashs = str(hashlib.md5(r.content).hexdigest()) scode = r.status_code if 200 <= scode and scode < 300: driver = webdriver.PhantomJS(executable_path=r"D:\phantomjs-2.1.1-windows\bin\phantomjs.exe") driver.get(self.url) time.sleep(3) driver.set_window_size(1024, 768) driver.save_screenshot(self.word + ".png") print( colored(scode, 'green') + "\t" + " \t" + str(lines) + " \t" + str(words) + " \t" + hashs + "\t" + self.url) elif 400 <= scode and scode < 500: print(colored(scode,'red') + "\t" + charts + " \t" + str(lines) + " \t" + str(words) + " \t" + hashs + "\t" + self.url) elif 300 <= scode and scode < 400: print(colored(scode,'blue') + "\t" + charts + " \t" + str(lines) + " \t" + str(words) + " \t" + hashs + "\t" + self.url) else: print(colored(scode, 'yellow') + "\t" + charts + " \t" + str(lines) + " \t" + str(words) + " \t" + hashs + "\t" + self.url) i[0] = i[0] - 1 except Exception as e: print(e) def launcher_thread(names, th, url): global i i = [] resultlist = [] i.append(0) while len(names): try: # if i[0] > th: n = names.pop(0) i[0] = i[0] + 1 thread = request_performer(n, url) thread.start() except KeyboardInterrupt: print("用户停止了程序运行。完成探测") sys.exit() return True def start(argv): banner() if len(sys.argv)>5: usage() #sys.exit() try: opts, args = getopt.getopt(sys.argv[1:], "w:t:f:") except getopt.GetoptError: print("错误的参数") sys.exit() for opt, arg in opts: if opt == '-w': url = arg elif opt == '-f': dicts = arg elif opt == '-t': threads = int(arg) try: f = open(dicts, 'r') words = f.readlines() print(words) except Exception as e: print("打开文件错误:", dicts, "\n") print(e) sys.exit() launcher_thread(words, threads, url) if __name__ == '__main__': try: start(sys.argv[1:]) except KeyboardInterrupt: print("用户停止了程序运行。完成探测")