环境
git下载好源码后,可以方便查看记录
-
git tag 查看版本
然后用 git checkout 1.0 切换到1.0的版本
编辑器使用的是vscode + python插件
初步
最直观的感受,相比最初的版本,sqlmap以及有了大致的雏形。目录也丰富了许多
也加入了sqlmapapi,文件的数量和内容相比之前有了明显的增加,到底增加了什么呢,带着这个疑问,继续看源码。
注入流程
还是从sqlmap最精华的注入流程看起。启动流程和最初版本差不多,先检测各种变量,初始化各种变量,然后便“开始”了。为什么“开始”要打上引号呢,这其实是sqlmap中的一个start()
函数,这个函数的作用是检测一个URL的稳定性,然后测试GET、POST、Cookie、和User-Agent参数是否动态和sql注入。
在start()
函数中,首先肯定是将这些要检测的数据(get参数、post参数、cookie等)分离出来,如果该链接中含有表单的话,还会询问你是否解析表单。
接着会创建一些文件和数据库来存储这次结果。即setupTargetEnv()
函数所做的,但具体存储哪些,没有细究,之后再看吧。
接着检测连通性(checkConnection()
函数所做的),就是访问一次网页,存储最初访问的时间和访问网页返回的数据。
然后便检测waf了。
WAF的检测
既然到了WAF的检测,我们就好好说说这个。在这个版本1.0
默认是不会检测waf的,需要加上--identify-waf
才会检测。
在初始化的时候,有一个函数专门用来加载检测waf
的脚本。
先遍历出waf目录下的py脚本,分离出目录名和文件名,排除__init__.py
的文件名。若目录名不在python的环境变量下则加入进去且放到第一位,然后用__import__
动态加载waf模块,和python中使用import
原理类似,当然,引入的时候不能要.py
这个后缀,所以用[:-3]
来过滤掉。
加载的模块会检测是否有detect
这个函数,没有回抛出异常。简单来说,加载waf模块就这么几个步骤。
所以初始化的时候所有waf脚本就加载进来了,要使用的时候循环遍历脚本即可。
附waf脚本demo -> 360.py
#!/usr/bin/env python
"""
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
"""
import re
from lib.core.settings import WAF_ATTACK_VECTORS
__product__ = "360 Web Application Firewall (360)"
def detect(get_page):
retval = False
for vector in WAF_ATTACK_VECTORS:
_, headers, _ = get_page(get=vector)
retval = re.search(r"wangzhan\.360\.cn", headers.get("X-Powered-By-360wzb", ""), re.I) is not None
if retval:
break
return retval
看到这个脚本,我想就有几个问题需要我们解决了,首先WAF_ATTACK_VECTORS
定义的是什么?
通过查看定义,得到了它的定义。
# Payload used for checking of existence of IDS/WAF (dummier the better)
IDS_WAF_CHECK_PAYLOAD = "AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1--