Django 初次尝试编写 Web 漏洞扫描器挖坑记录
字数 1291 2025-08-20 18:18:23
Django Web漏洞扫描器开发指南
技术栈选择
- Python 3.8.0: 支持高级特性,编写Web漏扫灵活
- Django 3: 文档全面,适合新手
- MySQL: 经典关系型数据库,Django支持良好
- H+ 4.1框架: 基于Bootstrap 3.3.6的开源前端框架
- ECharts: 百度开源的数据可视化JS图表插件
核心功能模块实现
漏洞检测模块
实现思路
- 使用AWVS 13 API进行目标资产爬取
- 将获取的信息转发给xray进行漏洞检测
- 利用xray的webhook功能获取漏洞信息
Django Webhook接口代码
import json
from django.shortcuts import render
from django.views.generic.base import View
from django.views.decorators.csrf import csrf_exempt
class WebHook(View):
@csrf_exempt
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def post(self, request):
vul_data = json.loads(request.body)
if 'detail' in str(request.body):
print('漏洞插件:', vul_data['plugin'])
print('漏洞位置:', vul_data['target']['url'])
print('漏洞分类:', vul_data['vuln_class'])
return render(request, 'test.html', {})
注意事项
- 使用
@csrf_exempt装饰器关闭CSRF检测 - 解析xray的POST请求中的漏洞数据
端口扫描模块
扫描策略
- 使用masscan进行网段粗略扫描
- 使用nmap进行详细扫描
IP归属地查询
ip_api_url = f'http://freeapi.ipip.net/{ip_addr}'
r = requests.get(url=ip_api_url)
addr_list = literal_eval(r.text)
addr = ' '.join(addr_list[:3])
指纹识别模块
技术组合
- Wappalyzer: 基本指纹探测
- TideFinger: 传统指纹识别(基于TideSec/TideFinger)
数据库模型设计
from django.db import models
from django.utils.html import format_html
class Component(models.Model):
name = models.CharField(max_length=200, verbose_name='组件名称')
desc = models.CharField(max_length=200, verbose_name='组件描述')
icon = models.FileField(upload_to='icons/', verbose_name='组件logo', max_length=100)
category = models.CharField(max_length=100, verbose_name='组件类别', blank=True)
def icon_data(self):
return format_html(
'',
self.icon,
)
icon_data.short_description = 'Logo'
Admin配置
from django.contrib import admin
from django.forms import TextInput
@admin.register(Component)
class ComponentAdmin(admin.ModelAdmin):
list_display = ('name', 'desc', 'category', 'icon_data')
search_fields = ('name', 'desc')
readonly_fields = ('icon_data',)
list_per_page = 20
fieldsets = (
('编辑组件', {
'fields': ('name', 'desc', 'category', 'icon', 'icon_data')
}),
)
formfield_overrides = {
models.CharField: {'widget': TextInput(attrs={'size': '59'})},
}
域名探测模块
使用API接口
- 爱站:
https://baidurank.aizhan.com/baidu/{domain}/ - 百度云观测:
http://ce.baidu.com/index/getRelatedSites?site_address={domain} - hackertarget:
https://api.hackertarget.com/hostsearch/?q={domain} - IP138:
https://site.ip138.com/{domain}/domain.htm - crt.sh SSL证书反查:
https://crt.sh/?q=%.{domain} - 千寻: POST请求到
https://www.dnsscan.cn/dns.html,数据为{"ecmsfrom": "8.8.8.8", "show": "none", "keywords": domain}
功能特点
- 自动过滤访问超时的域名
- 获取网页标题
- 支持域名监控,统计新增域名数量
目录扫描模块
- 集成Dirsearch工具
- 计划实现top 1000字典计数功能,记录高命中字典
小工具模块
包含功能
- IP提取
- 文本对比
- 批量获取网页标题
- SSH批量爆破验证
SSH批量爆破验证实现
import os
import pexpect
import progressbar
with open('22.txt') as f:
lines = f.readlines()
attack_ips = []
p = progressbar.ProgressBar()
for line in p(lines):
ssh = pexpect.spawn('ssh root@{ip}'.format(ip=line))
try:
flag = ssh.expect(['continue', 'password:'], timeout=3)
if str(flag).isnumeric():
attack_ips.append(line)
except pexpect.EOF:
ssh.close()
except pexpect.TIMEOUT:
ssh.close()
for ip in attack_ips:
with open('ssh.txt','a') as f:
f.write(ip)
优化方向
- Redis缓存加速: 提高系统响应速度
- WebSocket通信: 实现实时任务状态更新
- 前后端分离: 使用React/Vue等框架重构前端
- 代码优化: 重构变量命名和数据库结构
- 功能完善: 增加更多实用功能
资源链接
开发建议
- 充分利用Django Admin简化后台管理
- 使用Simple UI美化Admin界面
- 合理设计数据库模型,便于扩展
- 优先集成成熟工具,再考虑自主开发
- 注重前端用户体验,合理使用ECharts等可视化工具