WAFW00F waf识别工具 源码学习
我实习工作的第一个任务根据已有的java waf识别工具 实现了一个python的waf识别工具
代码结构非常乱 仅仅达到了能用的水平。
顶头svp推荐这个项目当时我已经写好了开始用了自己的
稍微看了一个这个项目其实之前我就用过指纹库比较老了可能都需要自己来收集
我自己实现的识别工具都是 正则 该工具使用了py程序作为动态加载的插件库
从公司返校一直打算 研究一下这个源码 一直咯咯咯到现在
Github:https://github.com/EnableSecurity/wafw00f
wafw00f是个通过http返回报文来判断waf的识别工具,他发送一个普通的HTTP 请求并分析响应如果不成功,它会发送一些(可能是恶意的)HTTP 请求并使用简单的逻辑来推断它是哪个 WAF,如果这也不成功,它会分析先前返回的响应,并使用另一种简单的算法来猜测 WAF 或安全解决方案是否正在积极响应我们的攻击。
依赖库
1.https://github.com/psf/requests
- 最流行的http请求库不用说了
2.https://github.com/mitsuhiko/pluginbase
- 一个简单但灵活的 Python 插件系统。用来动态加载第三方插件
- 在pocsuite3中也实现了一个类似的插件库 https://github.com/knownsec/pocsuite3/blob/5a82de0a4dab7bc309a95f5fb2a147f41d057de9/pocsuite3/lib/core/register.py 可以通过GitHub远程加载插件 看了一下没太看懂
WAFW00F
在实习工作里我也实现了一个类似的工具,主要通过正则来识别 。也碰到了一些问题比如多条正则每次匹配一条所需要的时间特别长我通过 将所有正则进行联用初筛如果发现命中了某条规则再用折半查找来匹配到具体的规则,还发现了一种通过cname来识别云防御的方案不需要攻击行为,甚至不需要进行http请求只需要dns 查询即可。
关于waf00f我们主要关注
- 动态加载插件
- 判断waf存在
- 插件(识别规则)

目录结构
├── __init__.py
├── bin
│ └── wafw00f
├── lib
│ ├── __init__.py
│ ├── asciiarts.py # banner logo等
│ └── evillib.py # http请求构造发起等
├── main.py #主程序
├── manager.py #加载插件
├── plugins #规则库插件目录
└── wafprio.py #优先级检查列表
静态配置
# payload
xsstring = '<script>alert("XSS");</script>'
sqlistring = "UNION SELECT ALL FROM information_schema AND ' or SLEEP(5) or '"
lfistring = '../../../../etc/passwd'
rcestring = '/bin/cat /etc/passwd; ping 127.0.0.1; curl google.com'
xxestring = '<!ENTITY xxe SYSTEM "file:///etc/shadow">]><pwn>&hack;</pwn>'
# headers
def_headers = {'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.9',
'DNT' : '1', # Do Not Track request header 要求服务器程序不要跟踪记录用户信息
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3770.100 Safari/537.36',
'Upgrade-Insecure-Requests': '1' #
}
插件规则
也是通过正则进行匹配 通过any()或者all()进行规则匹配并命中
这里self.matchCookie self.matchHeader 默认是不进行攻击
#!/usr/bin/env python
'''
Copyright (C) 2020, WAFW00F Developers.
See the LICENSE file for copying permission.
'''
NAME = 'DenyALL (Rohde & Schwarz CyberSecurity)'
def is_waf(self):
schemes = [
self.matchStatus(200),
self.matchReason('Condition Intercepted')
self.matchHeader(('cf-ray', r'.+?')),
self.matchCookie(r'^crawlprotecttag='),
self.matchContent(r'<title>crawlprotect'),
]
if all(i for i in schemes):
return True
return False

插件的加载使用对面向对象的运用都特别厉害
聊一聊有趣的地方吧
这款工具一个特别有趣的点是在于对未识别的waf判定
对于正则进行匹配识别指纹以及攻击对拦截页面识别都特别常见
而对不在规则库中的waf识别成为我工作的一大难题
这里
使用了5种方法对未收录指纹的waf的存在进行判断
依次是
- 使用无User-agent请求对目标进行请求
- 使用xss攻击触发waf
- 使用lfi攻击触发waf
- 使用sql注入触发waf
- 对比正常请求和攻击请求响应中的server 值
还有一个异常捕获 当任何一次请求出现错误 进行判定
在前4条中都使用了响应吗进行初步判断,而不是使用规则无脑进行匹配 这样可以省去一些时间
在第一条方法中的注释写上了 能检测几乎所有的waf很神奇我居然从来都没想到过
234都比较常见
第五条 也挺有意思 通过servername的值对比判断 这样的话是不是可以使用HADE请求来节省一部分时间
思考
在这款工具上居然丝毫没用到多线程异步等高性能 是没有对应场景吗
我认为可以通过 异步对插件库中的规则进行匹配 而不是使用优先级 甚至可是使用
如果对于我那种不管三七二十一直接打一个payload的方案甚至可以使用 functools中的cache装饰器进行加速毕竟相同waf拦截的页面都是相同的当然这个也是针对场景的 对于我需要的多站点可能存在 相同品牌的waf 比较合适
我一直在想办法 优化规则的匹配速度 ,直到被老大一句话点醒 现阶段最慢的不是硬盘io 而是网络io ,后来我使用了httpx加上异步进行处理结果速度快了一个量级。 感觉之前浪费了好多时间 有时候由于技术实力不够浪费的时间比摸鱼还要可怕。
由于我实在太菜,读这款工具花了我大概一周多的时间。然而还是囫囵吞枣 还是代码写的少了。
WAFW00F waf识别工具 源码学习的更多相关文章
- 用户代理字符串识别工具源码与slf4j日志使用
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等.UA也成为了, ...
- Java并发包源码学习系列:挂起与唤醒线程LockSupport工具类
目录 LockSupport概述 park与unpark相关方法 中断演示 blocker的作用 测试无blocker 测试带blocker JDK提供的demo 总结 参考阅读 系列传送门: Jav ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- 【iScroll源码学习04】分离IScroll核心
前言 最近几天我们前前后后基本将iScroll源码学的七七八八了,文章中未涉及的各位就要自己去看了 1. [iScroll源码学习03]iScroll事件机制与滚动条的实现 2. [iScroll源码 ...
- spring源码学习之路---IOC初探(二)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章当中我没有提及具体的搭 ...
- 【 js 基础 】【 源码学习 】源码设计 (持续更新)
学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:undersc ...
- Redis源码学习:Lua脚本
Redis源码学习:Lua脚本 1.Sublime Text配置 我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考<Sublime Text 3下C/C++开 ...
- Underscore.js 源码学习笔记(下)
上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...
随机推荐
- 内存泄漏避雷!你真的了解重写equals()和hashcode()方法的原因吗?
基本概念 要比较两个对象是否相等时需要调用对象的equals() 方法: 判断对象引用所指向的对象地址是否相等 对象地址相等时, 那么对象相关的数据也相等,包括: 对象句柄 对象头 对象实例数据 对象 ...
- Containing ViewControllers
Containing ViewControllers 转自:https://www.cocoanetics.com/2012/04/containing-viewcontrollers/ For a ...
- xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持
Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...
- 学习型的“文山表海无限发展公司”——《Office妖精是怎样炼成的》续1
本篇无故事情节版:https://www.cnblogs.com/officeplayer/p/14841590.html <Office妖精是怎样炼成的>http://blog.sina ...
- CF390A Inna and Alarm Clock 题解
Content 平面内有 \(n\) 个整点 \((x_i,y_i)\).每次可以去掉一行或一列的点,问最少去几次(按行去点或按列去点二者只能选择一种). 数据范围:\(1\leqslant n\le ...
- 【LeetCode】70. Climbing Stairs 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目大意 题目大意 解题方法 递归 记忆化搜索 动态规划 空间压缩DP 日期 [L ...
- 【LeetCode】979. Distribute Coins in Binary Tree 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...
- 【LeetCode】82. Remove Duplicates from Sorted List II 解题报告(Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/remove-du ...
- TKE 用户故事 - 作业帮 PB 级低成本日志检索服务
作者 吕亚霖,2019年加入作业帮,作业帮架构研发负责人,在作业帮期间主导了云原生架构演进.推动实施容器化改造.服务治理.GO微服务框架.DevOps的落地实践. 莫仁鹏,2020年加入作业帮,作业帮 ...
- <数据结构>hash进阶
hash函数构建 采取26进制 对于字符串str,令**H[i] = H[i-1]*26 + index(str[i]) **,最后H[i-1]就是str的hash值 问题:hash值过大,无法表式 ...