Python实现E-Mail收集插件实例教程


Posted in Python onFebruary 06, 2019

__import__函数

我们都知道import是导入模块的,但是其实import实际上是使用builtin函数import来工作的。在一些程序中,我们可以动态去调用函数,如果我们知道模块的名称(字符串)的时候,我们可以很方便的使用动态调用

def getfunctionbyname(module_name, function_name):
 module = __import__(module_name)
 return getattr(module, function_name)

通过这段代码,我们就可以简单调用一个模块的函数了

插件系统开发流程

一个插件系统运转工作,主要进行以下几个方面的操作

  • 获取插件,通过对一个目录里的.py文件扫描得到
  • 将插件目录加入到环境变量sys.path
  • 爬虫将扫描好的 URL 和网页源码传递给插件
  • 插件工作,工作完毕后将主动权还给扫描器

插件系统代码

在lib/core/plugin.py中创建一个spiderplus类,实现满足我们要求的代码

# __author__ = 'mathor'

import os
import sys
class spiderplus(object):
 def __init__(self, plugin, disallow = []):
  self.dir_exploit = []
  self.disallow = ['__init__']
  self.disallow.extend(disallow)
  self.plugin = os.getcwd() + '/' + plugin
  sys.path.append(plugin)
 
 def list_plusg(self):
  def filter_func(file):
   if not file.endswith('.py'):
    return False
   for disfile in self.disallow:
    if disfile in file:
     return False
   return True
  dir_exploit = filter(filter_func, os.listdir(self.plugin)
  return list(dir_exploit)
  
 def work(self, url, html):
  for _plugin in self.list_plusg():
   try:
    m = __import__(_plugin.split('.')[0])
    spider = getattr(m, 'spider')
    p = spider()
    s = p.run(url, html)
   except Exception as e:
    print (e)

work函数中需要传递 url,html,这个就是我们扫描器传给插件系统的,通过代码

spider = getattr(m, 'spider')
p = spider()
s = p.run(url, html)

我们定义插件必须使用class spider中的run方法调用

扫描器中调用插件

我们主要用爬虫调用插件,因为插件需要传递 url 和网页源码这两个参数,所以我们在爬虫获取到这两个的地方加入插件系统代码即可

首先打开Spider.py,在Spider.py文件开头加上

from lib.core import plugin

然后在文件的末尾加上

Python实现E-Mail收集插件实例教程

disallow = ['sqlcheck']
_plugin = plugin.spiderplus('script', disallow)
_plugin.work(_str['url'], _str['html'])

disallow是不允许的插件列表,为了方便测试,我们可以把 sqlcheck 填上

SQL 注入融入插件系统

其实非常简单,只需要修改script/sqlcheck.py为下面即可

关于Download模块,其实就是Downloader模块,把Downloader.py复制一份命名为Download.py就行

import re, random
from lib.core import Download

class spider:
 def run(self, url, html):
  if (not url.find("?")): # Pseudo-static page
   return false;
  Downloader = Download.Downloader()
  BOOLEAN_TESTS = (" AND %d=%d", " OR NOT (%d=%d)")
  DBMS_ERRORS = {
   # regular expressions used for DBMS recognition based on error message response
   "MySQL": (r"SQL syntax.*MySQL", r"Warning.*mysql_.*", r"valid MySQL result", r"MySqlClient\."),
   "PostgreSQL": (r"PostgreSQL.*ERROR", r"Warning.*\Wpg_.*", r"valid PostgreSQL result", r"Npgsql\."),
   "Microsoft SQL Server": (r"Driver.* SQL[\-\_\ ]*Server", r"OLE DB.* SQL Server", r"(\W|\A)SQL Server.*Driver", r"Warning.*mssql_.*", r"(\W|\A)SQL Server.*[0-9a-fA-F]{8}", r"(?s)Exception.*\WSystem\.Data\.SqlClient\.", r"(?s)Exception.*\WRoadhouse\.Cms\."),
   "Microsoft Access": (r"Microsoft Access Driver", r"JET Database Engine", r"Access Database Engine"),
   "Oracle": (r"\bORA-[0-9][0-9][0-9][0-9]", r"Oracle error", r"Oracle.*Driver", r"Warning.*\Woci_.*", r"Warning.*\Wora_.*"),
   "IBM DB2": (r"CLI Driver.*DB2", r"DB2 SQL error", r"\bdb2_\w+\("),
   "SQLite": (r"SQLite/JDBCDriver", r"SQLite.Exception", r"System.Data.SQLite.SQLiteException", r"Warning.*sqlite_.*", r"Warning.*SQLite3::", r"\[SQLITE_ERROR\]"),
   "Sybase": (r"(?i)Warning.*sybase.*", r"Sybase message", r"Sybase.*Server message.*"),
  }
  _url = url + "%29%28%22%27"
  _content = Downloader.get(_url)
  for (dbms, regex) in ((dbms, regex) for dbms in DBMS_ERRORS for regex in DBMS_ERRORS[dbms]):
   if (re.search(regex,_content)):
    return True
  content = {}
  content['origin'] = Downloader.get(_url)
  for test_payload in BOOLEAN_TESTS:
   # Right Page
   RANDINT = random.randint(1, 255)
   _url = url + test_payload % (RANDINT, RANDINT)
   content["true"] = Downloader.get(_url)
   _url = url + test_payload % (RANDINT, RANDINT + 1)
   content["false"] = Downloader.get(_url)
   if content["origin"] == content["true"] != content["false"]:
    return "sql found: %" % url

E-Mail 搜索插件

最后一个简单的例子,搜索网页中的 E-Mail,因为插件系统会传递网页源码,我们用一个正则表达式([\w-]+@[\w-]+\.[\w-]+)+搜索出所有的邮件。创建script/email_check.py文件

# __author__ = 'mathor'

import re
class spider():
 def run(self, url, html):
  #print(html)
  pattern = re.compile(r'([\w-]+@[\w-]+\.[\w-]+)+')
  email_list = re.findall(pattern, html)
  if (email_list):
   print(email_list)
   return True
  return False

运行python w8ay.py

Python实现E-Mail收集插件实例教程

可以看到网页中的邮箱都被采集到了

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
python 正则表达式 概述及常用字符
May 04 Python
Python实例一个类背后发生了什么
Feb 09 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
Python实现随机漫步功能
Jul 09 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 Python
Python 的演示平台支持 WSGI 接口的应用
Apr 20 Python
使用TensorFlow实现二分类的方法示例
Feb 05 #Python
Tensorflow分类器项目自定义数据读入的实现
Feb 05 #Python
在Python 字典中一键对应多个值的实例
Feb 03 #Python
Django csrf 两种方法设置form的实例
Feb 03 #Python
解决django前后端分离csrf验证的问题
Feb 03 #Python
Python利用heapq实现一个优先级队列的方法
Feb 03 #Python
对Python3中dict.keys()转换成list类型的方法详解
Feb 03 #Python
You might like
自己前几天写的无限分类类
2007/02/14 PHP
PHP5常用函数列表(分享)
2013/06/07 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
jQuery live
2009/05/15 Javascript
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
mui上拉加载功能实例详解
2017/04/13 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
[08:40]Navi Vs Newbee
2018/06/07 DOTA
Python判断字符串与大小写转换
2015/06/08 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
应聘自荐书
2013/10/08 职场文书
幼儿师范毕业生自荐信
2013/11/09 职场文书
大学生应聘推荐信范文
2013/11/19 职场文书
高中毕业自我鉴定
2013/12/19 职场文书
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
产品调价通知函
2015/04/20 职场文书
防汛通知
2015/04/25 职场文书
二年级数学教学反思
2016/02/16 职场文书