0x002 sqlmap的参数解析

ops/2024/10/22 23:42:49/

0x002 sqlmap的参数解析

重新看到cmdLineParser()​函数

首先检测是否存在argv​,如果没有则设置为系统默认的命令行参数

再调用checkSystemEncoding()​函数来检测系统的编码设置,确保后续能够正确的处理字符编码

调用os.path.basename(argv[0])​来获取脚本的文件名,再通过getUnicode()​函数来将其转换为合适的编码格式

构建命令行工具的使用说明usage​.根据当前环境的不同,将可执行文件的路径和脚本文件名组合成一个使用说明字符串

创建了参数解析器ArgumentParser​,设置了工具的使用说明为上一步构建的usage​字符串

再往下就是参数列表了(Target options​等等)

接下来我们回到init()​函数中

def init():"""Set attributes into both configuration and knowledge base singletonsbased upon command line and configuration file options."""_useWizardInterface()setVerbosity()  # 设置sqlmap输出的详细程度_saveConfig()   # 将命令行选项保存到sqlmap配置的ini文件中_setRequestFromFile()   # 从传入的文件中获取url_cleanupOptions()   # 清除配置文件_cleanupEnvironment()   # 清除环境变量_purge()    # 安全的删除sqlmap根目录下的数据_checkDependencies()    # 检查是否缺少依赖项_createHomeDirectories()_createTemporaryDirectory()_basicOptionValidation()_setProxyList()_setTorProxySettings()_setDNSServer()_adjustLoggingFormatter()_setMultipleTargets()_listTamperingFunctions()_setTamperingFunctions() # 设置tamper脚本_setPreprocessFunctions()_setPostprocessFunctions()_setTrafficOutputFP()_setupHTTPCollector()_setHttpChunked()_checkWebSocket()parseTargetDirect()if any((conf.url, conf.logFile, conf.bulkFile, conf.requestFile, conf.googleDork, conf.stdinPipe)):_setHostname()_setHTTPTimeout()_setHTTPExtraHeaders()_setHTTPCookies()_setHTTPReferer()_setHTTPHost()_setHTTPUserAgent()_setHTTPAuthentication()_setHTTPHandlers()_setDNSCache()_setSocketPreConnect()_setSafeVisit()_doSearch()_setStdinPipeTargets()_setBulkMultipleTargets()_checkTor()_setCrawler()_findPageForms()_setDBMS()_setTechnique()_setThreads()_setOS()_setWriteFile()_setMetasploit()_setDBMSAuthentication()loadBoundaries()loadPayloads()_setPrefixSuffix()update()_loadQueries()

这边我们先看_setRequestFromFile()​方法,先来理解,如果我们通过-r​传递一个文本文件,sqlmap​是如何理解并转换成参数的呢

if conf.requestFile:for requestFile in re.split(PARAMETER_SPLITTING_REGEX, conf.requestFile):requestFile = safeExpandUser(requestFile)url = Noneseen = set()if not checkFile(requestFile, False):errMsg = "specified HTTP request file '%s' " % requestFileerrMsg += "does not exist"raise SqlmapFilePathException(errMsg)

先调用了re.split()​方法对我们传入的conf.requestFile​变量进行拆分,查询setting.py​我们可以找到PARAMETER_SPLITTING_REGEX = r"[,|;]"

然后再调用safeExpandUser()​函数,确保路径的稳定性和可靠性

在调用checkFile()​函数确保文件的存在和可读.否则就报错specified HTTP request file​&&does not exist

当文件确认没有问题的时候,就开始获取目标的URL

for target in parseRequestFile(requestFile):url = target[0]if url not in seen:kb.targets.add(target)if len(kb.targets) > 1:conf.multipleTargets = Trueseen.add(url)

跟进parseRequestFile()​函数

def parseRequestFile(reqFile, checkParams=True):"""Parses WebScarab and Burp logs and adds results to the target URL list>>> handle, reqFile = tempfile.mkstemp(suffix=".req")>>> content = b"POST / HTTP/1.0\\nUser-agent: foobar\\nHost: www.example.com\\n\\nid=1\\n">>> _ = os.write(handle, content)>>> os.close(handle)>>> next(parseRequestFile(reqFile)) == ('http://www.example.com:80/', 'POST', 'id=1', None, (('User-agent', 'foobar'), ('Host', 'www.example.com')))True"""

这里并没有给出这个函数的实现方法,但是把返回值展示了出来,如果我们传入一个WebScarab​或者burp​日志,通过这个函数会返回一个数组,其中target[0]​就是URL

回到_setRequestFromFile()​函数,如果url​不在seen​中,就会自动把url​加入到seen​中

下面就是如果有第二个请求接下来的处理,我们先略过

经过_setRequestFromFile()​函数后,如果我们传入的req​文件没有问题的话,此时seen​中就有了url​属性

然后再经过init​后半段代码,将这些属性初始化


http://www.ppmy.cn/ops/33190.html

相关文章

rancher/elemental 构建不可变IOS(一)

一、什么是elemental Elemental 是 Rancher 的一个变种,专注于提供一个更轻量级的 Kubernetes 发行版。它旨在提供简化的部署和管理体验,同时保持 Kubernetes 的灵活性和强大功能。Elemental 通常针对较小的部署场景或资源受限的环境,例如测…

上位机图像处理和嵌入式模块部署(树莓派4b使用lua)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 lua是一个脚本语言,比c语言开发容易,也没有python那么重,整体使用还是非常方便的。一般当成胶水语言进行开发&a…

C语言什么是指向函数的指针?

一、问题 指针可以指向普通数值、数组,还可以指向指针,那么可以指向函数吗?答案是可以, 那么它是什么样的呢? 二、解答 ⼀个函数在编译时被分配⼀个⼊⼜地址,这个地址就称为函数的指针。所以,可…

图像识别 之 目标检测

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

巧用 TiCDC Syncpiont 构建银行实时交易和准实时计算一体化架构

本文阐述了某商业银行如何利用 TiCDC Syncpoint 功能,在 TiDB 平台上构建一个既能处理实时交易又能进行准实时计算的一体化架构,用以优化其零售资格业务系统的实践。通过迁移到 TiDB 并巧妙应用 Syncpoint,该银行成功解决了原有多个 MySQL 集…

Vue项目解决自定义el-dialog的border-radius无效的问题

一、问题产生的原因 自定义el-dialog的border-radius无效的原因其实就是因为层级的问题, f12打开样式检查就能发现组件自身已经全局定义了一个圆角变量 二、解决方法 和上面一样,在项目全局也就是在app.vue中定义全局变量 并且需要给!important&a…

上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 我们都知道,嵌入式应用一般都是为了某一个特定应用而存在的。也就是说,和pc不同,这个嵌入式板子一般都是为了解…

课题学习(二十三)---三轴MEMS加速度计芯片ADXL372

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。 一、基础配置 测量范围-200g-200g,分辨率为12位, V s 、 V D D I / O V_s、V_{DDI/O} Vs​、VDDI/O​范围为1.6V-3.5V 1.1 引脚配…