WAScan源码阅读
项目地址:https://github.com/m4ll0k/WAScan.git
README
- python2.7
整体功能
指纹识别
- cms系统 6
- web框架 22
- cookeis/headers安全
- 开发语言 9
- 操作系统 7
- 服务器 all
- 防火墙 50+
攻击
- Bash 命令注入
- SQL盲注
- 溢出
- CRLF
- 头部SQL注入
- 头部XSS
- HTML注入
- LDAP注入
- 本地文件包含
- 执行操作系统命令
- php 代码注入
- SQL注入
- 服务器端注入
- Xpath注入
- XSS
- XML注入
检查
- Apache状态检测
- 开放跳转
- phpinfo
- robots.txt
- xst
暴力攻击
- admin面板
- 后门
- 备份目录
- 备份文件
- 常规目录
- 常规文件
- 隐藏参数
信息搜集
- 信用卡信息
- 邮箱
- 私有ip
- 错误信息
- ssn
整体结构
类型 | 名 | 作用 |
---|---|---|
dir | lib | 扩展,攻击用到的一些字典等等 |
dir | plugin | 主要攻击脚本 |
dir | screen | 一些截图 |
file | .gitignore | 略 |
file | LICENSE | 许可证 |
file | README.md | 介绍 |
file | wascan.py | 主入口文件 |
所有文件
入口文件:wascan.py
主入口文件。会先初始化一些Usage
,接受命令行参数并进行相关的前期处理。然后根据参数开始进行扫描。
|
|
定义了一个wascan
类,通过getopt.getopt
接受命令行参数。对应代码如下:
|
|
scan
参数为扫描类型,对应如下:
scan值 | 扫描类型 |
---|---|
0 | 指纹Fingerprint |
1 | 攻击Attacks |
2 | 审计Audit |
3 | 爆破Brute |
4 | 信息搜集Disclosure |
5 | 全面扫描 |
对应代码如下:
lib/parser 文件夹
主要定义一些匹配模式,用于查找页面上的各种信息。
信用卡:lib/parser/getcc.py
获取信用卡信息
IP:lib/parser/getip.py
获取ip
邮箱:lib/parer/getmail.py
获取邮箱
US SSN: lib/parser/getssn.py
|
|
抓取解析: lib/parser/parse.py
parse
类,进行真正的信息搜集工作。定义了clean
方法,将响应中的各种标签,各种可能的符号直接replace
掉,然后再进行真正的搜索。简单粗暴。
lib/request 文件夹
主要是定义一些跟请求
相关的方法/类/功能
爬虫:lib/request/crawler.py
如名,爬虫。爬取页面上的所有连接。
接下来是爬虫类SCrawler
,它继承自Request
类。
User Agent: lib/request/ragent.py
生成随机的 User-Agent。命令行选项wascan.py --ragent
开启。
请求:lib/requests/request.py
基本请求。包括请求/代理认证,请求,重定向,响应的处理。
两个方法用于请求/代理认证
Request类,发送基本请求,处理头部参数,认证、代理、cookie、超时等问题。
NoRedirectHandler
,不进行跳转。
响应处理类。获取响应内容,响应url,响应的status_code,响应的头部。
lib/utils 文件夹
主要是定义一些小功能、小工具
package标识:lib/utils/init.py
无,跳过
基本检查:lib/utils/check.py
如名,主要进行一些前期的检查准备。
颜色常量定义: lib/utils/colors.py
定义一些颜色常量,略过。
列举py文件: lib/utils/dirs.py
定义了dirs
函数,用于列举出指定目录下,指定后缀名为py
,且不是__init__.py
的 py文件。
测试用例如下:
异常定义:lib/utils/exception.py
定义了几种可能出现的错误:
参数payload处理:lib/utils/params.py
定义了两个类,用于处理请求参数
和payload
的关系,替换和拼接。替换的场景,比如任意文件读取,?readfile=xx
可能替换成?readfile=/etc/passwd
。拼接的场景,比如SQL注入,?id=1
,可能拼接为 ?id=1'
或者 ?id=1" or 1=1
第一个类preplace
替换,用于把请求参数
的值替换为对应的payload
。存疑一:get请求中用sub(porignal,ppayload,self.url)
来处理,而post请求中用self.data.replace(porignal,ppayload
请求。
|
|
第二个类padd
,用于往请求参数中添加payload。
基本攻击payload: lib/utils/payload.py
整合了基本攻击的各种payload。对于每种攻击,返回list。结合前面整体功能 -> 攻击
章节:
类型 | 对应函数payload |
---|---|
Bash 命令注入 | bash() |
SQL盲注 | bsql() |
溢出 | None |
CRLF | crlfp() |
头部SQL注入 | None |
头部XSS | None |
HTML注入 | html() |
LDAP注入 | ldap() |
本地文件包含 | plfi() |
执行操作系统命令 | os() |
php 代码注入 | php() |
SQL注入 | sql() |
服务器端注入 | ssip() , pssi() |
Xpath注入 | xpath() |
XSS | pxss() |
XML注入 | xxep() |
头部SQL注入
、溢出
、头部XSS
在该文件中对应的payload似乎没有出现。payload的具体内容就这里不展开,具体等后文与调用代码结合解释。
|
|
格式化打印: lib/utils/printer.py
定义了各种打印输出方法,基本的格式化字符串、颜色、编码等等。
随机串生成: lib/utils/rand.py
定义两个函数。第一个是r_time
基于当前时间strftime('%y%m%d')
用来生成随机数字。
第二个是r_string
,用于生成指定长度为n
的包含大写或者小写字母的随机字符串。
文件读取操作:lib/utils/readfile.py
该文件定义了readfile
函数,用于基本的文件读取操作。首先判断路径是否为空,!=None
或者!=""
。利用列表生成器,line.strip()
在读取每一行后去除两边的空白符。:
基本设置:lib/utils/settings.py
|
|
编码: lib/utils/unicode.py
统一转换成utf-8
来处理
帮助信息:lib/utils/usage.py
用来输出一些帮助信息,全程一行行print
,简单粗暴。
lib/handler 文件夹
这里定义了几种扫描处理模式。回到主文件wascan.py
中,它真正开始扫描是后半部分代码,根据kwargs['brute']
或scan
的值去选择不同的模式,比如若指定了brute
,则会调用BruteParams
模式,其余类似。这些模式都整合在handler
目录下。
暴破:lib/handler/brute.py
第一种暴破指去爆破页面中的隐藏参数
。brute.py
对应代码如下:
其中params
类后文再详解。
主文件wascan.py
的调用入口:
第二种爆破指后台爆破、路径爆破。brute.py
对应代码如下:
主文件wascan.py
中两处入口:
指纹:lib/handler/fingerprint.py
指纹识别模式。fingerprint.py
代码中Fingerprint
类如下:
在探测server
时,由于WAScan
直接采用了返回头部中的server
字段,没有爆破处理。所以server
函数实际存放在plugins/fingerprint/server/server.py
。而其他类型的指纹,比如cms
、framework
、Language
、Os
、Waf
等,难以直接确定,需要多种脚本去尝试,所以这几种类型的指纹探测,都是在fingerprint.py
中定义了一个入口函数,用来导入`plugins/fingerprint/
目录下的相关探测模块。
|
|
在完成所有类型的探测后,wascan
在结尾调用了Headers(req.headers,req.content)
,这个根据响应来确定一些信息,具体作用等讲解plugins/fingerprint
时再详说。
在主文件wascan.py
中有两处入口,如下:
攻击:lib/handler/attacks.py
导入各种攻击的模块,然后调用运行
主文件wascan.py
中的入口:
审计:lib/handler/audit.py
载入各种审计的模块,然后调用运行。
主文件wascan.py
中的入口:
信息搜集:lib/handler/disclosure.py
载入各种信息搜集的模块,然后调用运行。
主文件wascan.py
中的入口:
爬虫:lib/handler/crawler.py
爬虫调用,在给定一个url后,在fullscan模式下会去爬去页面中所有的链接,然后进行检查。对应代码如下:
links
保存所有的url,一开始就一个。然后通过调用爬虫:lib/request/crawler.py
中的SCrawler
爬虫,不断地往links
中添加,然后不断爬取。
主文件的入口:
完整扫描: lib/handler/fullscan.py
实际代码如下:
主文件入口:
所以综上,fullscan
模式的整体流程如下:
Fingerprint()
Crawler()
FullScan()
Attacks()
Disclosure()
Audit()
Brute()
lib/db 文件夹
整合各种字典。先略过。
plugins/attacks
plugins/attacks/htmli.py
检查HTML代码注入。思路即:在参数值中添加进html代码,然后检查返回的响应,直接用search(payload,req.content)
来看能否检测到相应的模式,。若存在则保存URL
、DATA
、PAYLOAD
,然后输出。
|
|
plugins/attacks/phpi.py
检查PHP代码注入。采用的是 system("cat /etc/passwd")
类似的payload来检测在返回的响应中匹配的是 root: /bin/bash
字符串,或者通过system("echo")
输出随机字符串来匹配。个人看法,system
在许多情况下都是被禁用的,因此通过system
来检测成功率估计不高。另外/etc/passwd
只存在UNIX系统上,win需要其他方式来检查。如果用phpinfo()
可能会更好。
|
|
对应的payload 在 lib/utils/payload.py:68 :
plugins/attacks/ssi.py
因为这个情况往往存在UNIX系统中,win一般不存在该漏洞。所以payload中只尝试读取/etc/passwd
,然后检测响应。
|
|
对应payload:
plugins/attacks/bufferoverflow.py
溢出bufferoverflow的payload没有在lib/utils/payload.py
中出现,而是直接定义在了这里。几种可能的字符,然后三种可能的长度,发包检测响应。这里的serror
需要匹配的模式(lib/db/errors/buffer.json)如下:
bufferoverflow.py
plugins/attacks/lfi.py
代码结构和 bufferoverflow.py 大致相同。
真正的payload 在 lib/utils/payload.py:137:
用于匹配的模式 lib/db/errors/lfi.json:
plugins/attacks/xss.py
代码结构与 htmli.py 类似。
对应payload 在 lib/utils/payload.py:51:
plugins/attacks/xpathi.py
代码结构与 bufferoverflow.py 类似。
payload 在 lib/utils/payload.py:75:
用于匹配的模式在 lib/db/errors/xpath.json:
plugins/attacks/crlf.py
payload中注入的模式是Set-Cookie:crlf=injection
,在进行检测时把=injection
替换成随机字符串。然后在返回头的Set-Cookie
(若有)中检测注入的随机字符串。
|
|
对应payload 在 lib/utils/payload.py:21:
plugins/attacks/oscommand.py
代码结构与 htmli.py 类似。根据payload,直接在响应中去匹配特殊字符if search('{}'.format(payload.split('"')[1]),req.content):
。
对应payload在 lib/utils/payload.py:124
plugins/attacks/ldapi.py
代码结构与 bufferoverflow.py 类似。
payload 在 lib/utils/payload.py:197:
用于匹配的模式在 lib/db/errors/xpath.json:
plugins/attacks/headerxss.py
检查存在于头部字段的XSS,包括cookie
字段,referer
字段,useragent
字段。其实就是拿xss的payload放在对应的位置再打一圈。话说这个位置的xss危害不大吧。。
plugins/attacks/sqli.py
代码结构与 bufferoverflow.py 类似。
payload 在 lib/utils/payload.py:101:
用于匹配的模式在 lib/db/sqldberror/ 下。略过不提。
plugins/attacks/xxe.py
代码结构与 htmli.py 类似。发送请求,然后匹配if search(payload,req.content):
。个人看法,匹配效果较差。
payload在 lib/utils/payload.py:33:
plugins/attacks/bashi.py
bash注入,但是这里只检测了GET方法,POST请求并不检查!另外这里在 头部的User-Agent
、Referer
字段插入了payload。
|
|
payload定义在:
先休息一下。。