一直在想准备一系列 sqlmap 的文章,担心会不会因为太老太旧了被大家吐槽,思前想后也查了一些现有的资料,还是准备出一部分关于 sqlmap 关键技术细节的探讨。同时也在对其核心的讨论中,提炼出一些思想与方法。sqlmap 内核分析系列文章共三篇,本文为第一篇,敬请指正。
我相信在阅读本文的读者中,很大一部分人都是曾经尝试阅读过 sqlmap 源码的同学。但是在实际阅读的时候,我们发现大家总是存在各种各样奇葩的困难与困惑。
“SqlMap 源码为什么会有大几百行一千行的方法啊”“它里面 conf 和 kb 又是啥?这两个全局变量里面到底存了啥?”“为什么我直接把 sqlmap 的 xml 取出来,还是并不是特别方便使用他们的 payload”
我相信这些疑问大家肯定第一次在阅读这个项目的事,都会遇到。实际上,并不是因为 sqlmap 项目的水平高导致大家看不懂。而是由于项目背负了太多的历史包袱,导致在接近十年的发展中,开发者与后期维护者并没有对这款工具进行重构与大规模重写,反而是继续使用 python2 对其缝缝补补。
在本系列文章中,我们主要针对 sqlmap 的最核心的方方面面进行分析,本文主要针对基础流程进行介绍与描述,本文由非常细致的 sqlmap 源码解读,希望有需要的读者可以从中受益。
0x00 准备工作
想要阅读 sqlmap 源码我相信大家的选择肯定更多的是从 github 下直接 clone 代码到本地,直接使用本地编辑器或者 IDE 打开直接来分析。所以基本操作也就是
git clone https://github.com/sqlmapproject/sqlmap
cd sqlmap
进入 sqlmap 的 repos 下,直接打开编辑器吧!
当然很多读者是 Python3 用户,其实也没有必要费很大力气在本机上安装 Python2 然后再进行操作。笔者使用的环境是
- Mac OS X
- Pyenv
- VSCode
推荐使用 Pyenv(+virtualenv) 构建 Python 环境运行 sqlmap。
0x01 初始化与底层建筑
笔者当然可以直接指出所有的重要逻辑在什么位置,但是这样并不好。这样做的后果就是大家发出奇怪的疑问:
它里面 conf 和 kb 又是啥?这两个全局变量里面到底存了啥?
逐步熟悉整个项目的构建和项目中贯穿全局的两个奇怪的全局变量,对于加速理解 sqlmap 的核心逻辑起了很大的作用。在笔者的工作和实践中,确实是很有感触。
所以我们还是从头看起吧!
我们在上图中,可以找到很