freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

《深入研究注入工具SqlMap内部结构和原理及其运行机制》系列(二):循序渐进——从sqlmapapi.py开始研究
R4be1 2022-03-06 00:13:51 218556
所属地 江西省

《深入研究注入工具SqlMap内部结构和原理及其运行机制》系列(二):循序渐进——从sqlmapapi.py开始研究

很多大佬开发的自动化工具都应用到了SQLMapApi,要控制sqlmapapi非常简单,只需要依靠Get/Post请求sqlmapapi所提供的接口即可完成启动sql注入扫描,检测扫描状态等等操作,国内已经有部分人对sqlmapapi有一定的了解了,很多大佬写的介绍sqlmapapi的文章也很不错,可惜就国内来说,了解的人还是不算特别多。其实我刚了解sqlmapapi的时候,觉得神器无疑,后面深入了解了sqlmapapi的底层运行逻辑,才发现,我的小可爱,原来就是通过调用系统命令行(那我还不如直接调用系统命令行来执行sqlmap命令,虽然少了优雅,不过方便快捷,工程量少)不过对于刚研究sqlmap内部结构的研究者来说,sqlmapapi绝对是个不错的选择,因为sqlmapapi工程量相对sqlmap主体来说较少,非常有利于对sqlmap整体架构意识的初步建立,同时由浅入深地了解整个sqlmap的思想。

研究环境

Python3.7
SQLMapApi
PyCharm 2021.3.2
sublimeText
屏幕截图 2022-02-05 165056.png


SqlMapApi源码分析(sqlmap/sqlmapapi.py)

初始化部分

屏幕截图 2022-02-05 165354.png

Main部分

屏幕截图 2022-02-05 165545.png

核心库:from lib.utils.api import server (32行)


初始化部分源码分析:

先从初始化部分开始分析(只分析该部分中的重点部分,很多是导入库不导入库的,没有值得探究的地方):

__import__相当于动态引入类,如果一个模块经常变化就可以使用__import__来动态载入。
则在第12行__import__("lib.utils.versioncheck") # this has to be the first non-standard import表示的是动态导入lib.utils.versioncheck库,该库是用来版本检查的.
所以整行代码翻译成人话就是动态引入版本检查文件

动态导入又是什么意思呢?
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。

Main部分源码分析:

先看两个函数dirtyPatches()(45行)和resolveCrossReferences()(96行)
emmmm......刚刚本来写了一些了,但是突然觉得这两个都不是重点,没必要逐行分析,我大概解释一下:
dirtyPatches函数:提高对环境的兼容性,其实就是个Patches

接受过长的结果行(例如 SQLi 导致 HTTP 标头响应)
在 sqlmap 分块的情况下防止双重分块编码(注意:如果缺少 'Content-length'标头,Python3 会自动执行此操作)
在python3环境下重新配置from thirdparty.six.moves import http_client as _http_client的HTTPConnection属性。
在 Windows 操作系统上添加对 inet_pton() 的支持
在response中不包含编码方式时就调用universaldetector第三方插件运用统计学来判断网页编码的方式

resolveCrossReferences函数:交叉引用解决方案的位置,换了一堆的函数

然后回到Main函数,到49行的logger.setLevel(logging.DEBUG)大意是设置默认日志级别为调试,它这个是from lib.core.data import logger过来的,在这个logger库里,应该是先配置了logging.getLogger(),然后再通过logger.setLevel()设置logger的级别为DEBUG。屏幕截图 2022-02-05 180136-16464625465232.png

再来分析Main函数54行之后:通过optparse库来获取命令行参数,最后把这些参数选项赋值给args
屏幕截图 2022-02-05 192451.png

本文最最核心的部分

屏幕截图 2022-02-05 195017.png
server和client函数都是由from lib.utils.api import server导入的。

不过平时我们其实用不到client部分,所以直入主题server函数。
我们先打开sqlmap/lib/utils/api.py,跳转到677行def server(host=RESTAPI_DEFAULT_ADDRESS, port=RESTAPI_DEFAULT_PORT, adapter=RESTAPI_DEFAULT_ADAPTER, username=None, password=None):
可以发现server函数的所有参数都是默认参数,我们再追到sqlmap/lib/core/settings.py文件里,这个文件存放了各种默认选项,包括sqlmap的版本号,项目地址等等。
在settings文件中找到server函数的3个默认参数分别是RESTAPI_DEFAULT_ADDRESS,RESTAPI_DEFAULT_PORT,RESTAPI_DEFAULT_ADAPTER。

在settings.py的811行可以找到RESTAPI_DEFAULT_ADDRESS变量的值为127.0.0.1,也就是说,在sqlmapapi没有-H或--host参数的情况下,**默认sqlmapapi的服务接口地址在127.0.0.1 **。

# Default REST-JSON API server listen address
RESTAPI_DEFAULT_ADDRESS = "127.0.0.1"

在settings.py的814行可以找到RESTAPI_DEFAULT_PORT变量的值为8775,也就是说,在sqlmapapi没有-p或--port参数的情况下,默认sqlmapapi的服务接口端口是8775

# Default REST-JSON API server listen port
RESTAPI_DEFAULT_PORT = 8775

在settings.py的808行可以找到RESTAPI_DEFAULT_ADAPTER变量的值为wsgiref,也就是说,在sqlmapapi没有指定服务器适配器参数--adapter的情况下,默认sqlmapapi使用的服务器适配器为wsgiref

# Default adapter to use for bottle server
RESTAPI_DEFAULT_ADAPTER = "wsgiref"
# SqlMap # web安全 # 工具分析 # 自动化渗透工具
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 R4be1 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
R4be1 LV.2
这家伙太懒了,还未填写个人描述!
  • 3 文章数
  • 10 关注者
《深入研究注入工具SqlMap内部结构和原理及其运行机制》系列(三):sqlmapapi的核心运行机制
2022-03-06
《深入研究注入工具SqlMap内部结构和原理及其运行机制》系列(一):SqlMap文件结构介绍
2022-02-10
文章目录