一、实验介绍
扫描器需要实现功能的思维导图:
1.1 实验内容
编写一个简单的多线程爬虫,用于对网站地址进行爬取,编写一个简单的sql注入工具,用于对网站地址进行sql注入的检测。
1.2 实验知识点
- 多线程的使用
- 网站爬虫的基本知识
- SQL注入的基本原理
- SQL检测工具编写,多参数URL的sql注入检测
- 正则表达式的基本知识
1.3 实验环境
- Python 2.7
- Win10
- PyCharm
二、实验原理
简单的扫描器雏形编写,爬虫+sql判断程序,后续优化以此雏形为基础。
2.1 爬虫编写思路
爬虫的作用是收集网站的链接,我们需要记录一下已经爬取的链接和待爬取的链接,并且去重复,去重复使用python的 set()
就可以解决,大概流程是:
- 输入url
- 下载解析出url
- url去重,判断是否为本站
- 加入到待爬去列表
- 重复循环即可
2.2 SQL判断思路
- 通过在url 后面加上
AND %d=%d
或者OR NOT (%d>%d)
%d
后门的数字是随机可变的- 然后搜索网页中特殊关键词,比如:
mysql中是 SQL syntax.*MySQL
Microsoft SQL Server是 Warning.*mssql_
Microsoft Access 是 Microsoft Access Driver
Oracle 是 Oracle error
IBM DB2 是 DB2 SQL error
SQLite 是 SQLite.Exception 等等....
- 通过这些关键词就可以判断出所用的数据库
- 我们还要判断一下waf之类的东西,有这种东西就直接停止
- 简单的方法就是用特定的url访问,如果出现了像 ip banned ,firewall之类的关键词,可以判断出是waf了
- 具体的正则表达式是
(?i)(\A|\b)IP\b.*\b(banned|blocked|bl(a|o)ck\s?list|firewall)
- 当然我们只是简单的来判断是否有注入,用这个思路写个脚本,非常简单
三、开发准备
在线环境已经安装好了这些库,如果不是用的在线环境,请先安装这些库
pip install requests
pip install beautifulsoup4
requests是一个友好可靠的网络访问库,beautifulsoup4是用于解析html标签的库。 同时创建个wgdscan文件夹,里面的目录结构如下:
/wgd.py //项目启动主文件
/lib/core //核心文件存放目录
/lib/core/config.py //配置文件
/script //插件存放
/exp //exp和poc存放
四、实验步骤
4.1 sql检测脚本编写
用一个字典存储数据库特征:
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.*"),
}
通过正则,如果发现我们的正则语句,就可以判断出是哪个数据库了。
for (dbms, regex) in ((dbms, regex) for dbms in DBMS_ERRORS for regex in DBMS_ERRORS[dbms]):
if(re.search(regex,_content)):
return True
这个是我们的测试语句[payload]。
BOOLEAN_TESTS = (" AND %d=%d", " OR NOT (%d=%d)")
用报错语句返回正确的内容和错误的内容进行对比。
for test_payload