From 0dc81c2219e3c7c1562106d3a448116e2a77a137 Mon Sep 17 00:00:00 2001 From: XU <1944118663@qq.com> Date: Mon, 30 Dec 2024 09:38:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=BA=90=E7=A0=81=E9=98=85=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/sqlmap-泛读报告.docx | Bin 12728338 -> 12728206 bytes src/sqlmap-master/sqlmap.py | 632 +++++++++++++++++------------------ 2 files changed, 302 insertions(+), 330 deletions(-) diff --git a/doc/sqlmap-泛读报告.docx b/doc/sqlmap-泛读报告.docx index bb9c4313e1ac3e285c418e557da59b902ed0d9a6..e52790f3ea4a74bdb14203b41555357a744bff55 100644 GIT binary patch delta 37365 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
gFD=jH6BniRc4>G3^d}0ulXq0B?9>nX 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≫$a_X7rDfe09Z^fz|KM>t9Tg)E-88x|rcE~Bu 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 diff --git a/src/sqlmap-master/sqlmap.py b/src/sqlmap-master/sqlmap.py index cf6c271..8fa756f 100644 --- a/src/sqlmap-master/sqlmap.py +++ b/src/sqlmap-master/sqlmap.py @@ -168,481 +168,453 @@ def main(): try: # 应用脏补丁和解析交叉引用 - dirtyPatches() - resolveCrossReferences() + dirtyPatches() # 应用一些临时的修复或补丁 + resolveCrossReferences() # 解析并处理代码中的交叉引用 # 检查运行环境并设置程序路径 - checkEnvironment() - setPaths(modulePath()) - banner() + checkEnvironment() # 检查当前运行环境是否满足要求 + setPaths(modulePath()) # 设置程序的路径 + banner() # 显示程序的横幅信息 # 解析命令行参数并更新全局配置 - args = cmdLineParser() - cmdLineOptions.update(args.__dict__ if hasattr(args, "__dict__") else args) - initOptions(cmdLineOptions) + args = cmdLineParser() # 解析命令行参数 + cmdLineOptions.update(args.__dict__ if hasattr(args, "__dict__") else args) # 更新全局命令行选项 + initOptions(cmdLineOptions) # 初始化全局配置选项 # 如果有管道输入,则设置批量模式 - if checkPipedInput(): - conf.batch = True + if checkPipedInput(): # 检查是否有管道输入 + conf.batch = True # 如果有管道输入,则设置批量模式为True # 如果配置了API,设置API日志和重定向标准输出和错误 - if conf.get("api"): + if conf.get("api"): # 检查是否配置了API # 延迟导入(重量级导入) - from lib.utils.api import StdDbOut - from lib.utils.api import setRestAPILog + from lib.utils.api import StdDbOut # 导入StdDbOut类,用于重定向标准输出和错误 + from lib.utils.api import setRestAPILog # 导入setRestAPILog函数,用于设置API日志 # 重定向标准输出和错误到IPC数据库 - sys.stdout = StdDbOut(conf.taskid, messagetype="stdout") - sys.stderr = StdDbOut(conf.taskid, messagetype="stderr") + sys.stdout = StdDbOut(conf.taskid, messagetype="stdout") # 重定向标准输出到IPC数据库 + sys.stderr = StdDbOut(conf.taskid, messagetype="stderr") # 重定向标准错误到IPC数据库 - setRestAPILog() + setRestAPILog() # 设置API日志 # 设置显示时间并显示法律声明和启动信息 - conf.showTime = True - dataToStdout("[!] legal disclaimer: %s\n\n" % LEGAL_DISCLAIMER, forceOutput=True) - dataToStdout("[*] starting @ %s\n\n" % time.strftime("%X /%Y-%m-%d/"), forceOutput=True) + conf.showTime = True # 设置显示时间 + dataToStdout("[!] legal disclaimer: %s\n\n" % LEGAL_DISCLAIMER, forceOutput=True) # 显示法律声明 + dataToStdout("[*] starting @ %s\n\n" % time.strftime("%X /%Y-%m-%d/"), forceOutput=True) # 显示启动信息 # 初始化程序 - init() + init() # 调用初始化函数,完成程序的初始化工作 # 如果没有设置更新所有选项,则执行后续操作 - if not conf.updateAll: + if not conf.updateAll: # 检查是否设置了更新所有选项 # 延迟导入(更快的启动) - if conf.smokeTest: + if conf.smokeTest: # 检查是否设置了烟雾测试 # 运行烟雾测试 - from lib.core.testing import smokeTest - os._exitcode = 1 - (smokeTest() or 0) - elif conf.vulnTest: + from lib.core.testing import smokeTest # 导入烟雾测试函数 + os._exitcode = 1 - (smokeTest() or 0) # 运行烟雾测试并设置退出码 + elif conf.vulnTest: # 检查是否设置了漏洞测试 # 运行漏洞测试 - from lib.core.testing import vulnTest - os._exitcode = 1 - (vulnTest() or 0) + from lib.core.testing import vulnTest # 导入漏洞测试函数 + os._exitcode = 1 - (vulnTest() or 0) # 运行漏洞测试并设置退出码 else: # 启动sqlmap控制器 - from lib.controller.controller import start - if conf.profile: + from lib.controller.controller import start # 导入启动控制器函数 + if conf.profile: # 检查是否设置了性能分析 # 如果设置了性能分析,则进行性能分析 - from lib.core.profiling import profile - globals()["start"] = start - profile() + from lib.core.profiling import profile # 导入性能分析函数 + globals()["start"] = start # 将start函数添加到全局命名空间 + profile() # 运行性能分析 else: try: # 如果设置了爬取深度和批量文件,则开始爬取 - if conf.crawlDepth and conf.bulkFile: - targets = getFileItems(conf.bulkFile) + if conf.crawlDepth and conf.bulkFile: # 检查是否设置了爬取深度和批量文件 + targets = getFileItems(conf.bulkFile) # 从批量文件中获取目标列表 - for i in xrange(len(targets)): - target = None + for i in xrange(len(targets)): # 遍历目标列表 + target = None # 初始化目标变量 try: - kb.targets = OrderedSet() - target = targets[i] + kb.targets = OrderedSet() # 初始化目标集合 + target = targets[i] # 获取当前目标 - if not re.search(r"(?i)\Ahttp[s]*://", target): - target = "http://%s" % target + if not re.search(r"(?i)\Ahttp[s]*://", target): # 检查目标是否包含协议 + target = "http://%s" % target # 如果没有协议,则添加默认的HTTP协议 - infoMsg = "starting crawler for target URL '%s' (%d/%d)" % (target, i + 1, len(targets)) - logger.info(infoMsg) + infoMsg = "starting crawler for target URL '%s' (%d/%d)" % (target, i + 1, len(targets)) # 生成日志信息 + logger.info(infoMsg) # 记录日志信息 - crawl(target) - except Exception as ex: - if target and not isinstance(ex, SqlmapUserQuitException): - errMsg = "problem occurred while crawling '%s' ('%s')" % (target, getSafeExString(ex)) - logger.error(errMsg) + crawl(target) # 开始爬取目标 + except Exception as ex: # 捕获异常 + if target and not isinstance(ex, SqlmapUserQuitException): # 检查异常类型 + errMsg = "problem occurred while crawling '%s' ('%s')" % (target, getSafeExString(ex)) # 生成错误信息 + logger.error(errMsg) # 记录错误信息 else: - raise + raise # 重新抛出异常 else: - if kb.targets: - start() + if kb.targets: # 检查目标集合是否非空 + start() # 启动控制器 else: - start() - except Exception as ex: - os._exitcode = 1 + start() # 如果没有设置爬取深度和批量文件,则直接启动控制器 + except Exception as ex: # 捕获异常 + os._exitcode = 1 # 设置退出码为1 # 如果无法启动新线程,则记录错误信息并退出 - if "can't start new thread" in getSafeExString(ex): - errMsg = "unable to start new threads. Please check OS (u)limits" - logger.critical(errMsg) - raise SystemExit + if "can't start new thread" in getSafeExString(ex): # 检查异常信息是否包含无法启动新线程 + errMsg = "unable to start new threads. Please check OS (u)limits" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 else: - raise + raise # 重新抛出异常 # 捕获并处理各种异常,记录错误信息并退出 - except SqlmapUserQuitException: - if not conf.batch: - errMsg = "user quit" - logger.error(errMsg) + except SqlmapUserQuitException: # 捕获用户主动退出的异常 + if not conf.batch: # 检查是否处于批量模式 + errMsg = "user quit" # 生成错误信息 + logger.error(errMsg) # 记录错误信息 - except (SqlmapSilentQuitException, bdb.BdbQuit): - pass + except (SqlmapSilentQuitException, bdb.BdbQuit): # 捕获静默退出或调试器退出的异常 + pass # 不处理,直接跳过 - except SqlmapShellQuitException: - cmdLineOptions.sqlmapShell = False + except SqlmapShellQuitException: # 捕获SQLMap Shell退出的异常 + cmdLineOptions.sqlmapShell = False # 设置SQLMap Shell选项为False - except SqlmapBaseException as ex: - errMsg = getSafeExString(ex) - logger.critical(errMsg) + except SqlmapBaseException as ex: # 捕获SQLMap基础异常 + errMsg = getSafeExString(ex) # 获取安全的异常信息 + logger.critical(errMsg) # 记录严重错误信息 - os._exitcode = 1 + os._exitcode = 1 # 设置退出码为1 - raise SystemExit + raise SystemExit # 退出程序 - except KeyboardInterrupt: + except KeyboardInterrupt: # 捕获键盘中断异常(如Ctrl+C) try: - print() - except IOError: - pass + print() # 打印空行 + except IOError: # 捕获IO错误 + pass # 不处理,直接跳过 - except EOFError: - print() + except EOFError: # 捕获文件结束异常(如Ctrl+D) + print() # 打印空行 - errMsg = "exit" - logger.error(errMsg) + errMsg = "exit" # 生成错误信息 + logger.error(errMsg) # 记录错误信息 - except SystemExit as ex: - os._exitcode = ex.code or 0 + except SystemExit as ex: # 捕获系统退出异常 + os._exitcode = ex.code or 0 # 设置退出码为异常代码或0 - except: - print() - errMsg = unhandledExceptionMessage() - excMsg = traceback.format_exc() - valid = checkSums() + except: # 捕获所有其他异常 + print() # 打印空行 + errMsg = unhandledExceptionMessage() # 获取未处理异常的信息 + excMsg = traceback.format_exc() # 获取异常的详细堆栈信息 + valid = checkSums() # 检查校验和 - os._exitcode = 255 + os._exitcode = 255 # 设置退出码为255 # 如果异常信息中包含内存耗尽相关的消息,则记录内存耗尽错误并退出 - if any(_ in excMsg for _ in ("MemoryError", "Cannot allocate memory")): - errMsg = "memory exhaustion detected" - logger.critical(errMsg) - raise SystemExit + if any(_ in excMsg for _ in ("MemoryError", "Cannot allocate memory")): # 检查异常信息是否包含内存耗尽 + errMsg = "memory exhaustion detected" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含磁盘空间不足相关的消息,则记录磁盘空间错误并退出 - elif any(_ in excMsg for _ in ("No space left", "Disk quota exceeded", "Disk full while accessing")): - errMsg = "no space left on output device" - logger.critical(errMsg) - raise SystemExit + elif any(_ in excMsg for _ in ("No space left", "Disk quota exceeded", "Disk full while accessing")): # 检查异常信息是否包含磁盘空间不足 + errMsg = "no space left on output device" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含分页文件空间不足的消息,则记录分页文件空间错误并退出 - elif any(_ in excMsg for _ in ("The paging file is too small",)): - errMsg = "no space left for paging file" - logger.critical(errMsg) - raise SystemExit + elif any(_ in excMsg for _ in ("The paging file is too small",)): # 检查异常信息是否包含分页文件空间不足 + errMsg = "no space left for paging file" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含权限拒绝和Metasploit相关的消息,则记录Metasploit权限错误并退出 - elif all(_ in excMsg for _ in ("Access is denied", "subprocess", "metasploit")): - errMsg = "permission error occurred while running Metasploit" - logger.critical(errMsg) - raise SystemExit + elif all(_ in excMsg for _ in ("Access is denied", "subprocess", "metasploit")): # 检查异常信息是否包含Metasploit权限错误 + errMsg = "permission error occurred while running Metasploit" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含权限拒绝和metasploit相关的消息,则记录Metasploit权限错误并退出 - elif all(_ in excMsg for _ in ("Permission denied", "metasploit")): - errMsg = "permission error occurred while using Metasploit" - logger.critical(errMsg) - raise SystemExit + elif all(_ in excMsg for _ in ("Permission denied", "metasploit")): # 检查异常信息是否包含Metasploit权限错误 + errMsg = "permission error occurred while using Metasploit" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含只读文件系统的消息,则记录只读文件系统错误并退出 - elif "Read-only file system" in excMsg: - errMsg = "output device is mounted as read-only" - logger.critical(errMsg) - raise SystemExit + elif "Read-only file system" in excMsg: # 检查异常信息是否包含只读文件系统 + errMsg = "output device is mounted as read-only" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含系统资源不足的消息,则记录资源耗尽错误并退出 - elif "Insufficient system resources" in excMsg: - errMsg = "resource exhaustion detected" - logger.critical(errMsg) - raise SystemExit + elif "Insufficient system resources" in excMsg: # 检查异常信息是否包含系统资源不足 + errMsg = "resource exhaustion detected" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含磁盘I/O错误的消息,则记录I/O错误并退出 - elif "OperationalError: disk I/O error" in excMsg: - errMsg = "I/O error on output device" - logger.critical(errMsg) - raise SystemExit + elif "OperationalError: disk I/O error" in excMsg: # 检查异常信息是否包含磁盘I/O错误 + errMsg = "I/O error on output device" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含URL违反BIDI规则的消息,则记录无效URL错误并退出 - elif "Violation of BIDI" in excMsg: - errMsg = "invalid URL (violation of Bidi IDNA rule - RFC 5893)" - logger.critical(errMsg) - raise SystemExit + elif "Violation of BIDI" in excMsg: # 检查异常信息是否包含URL违反BIDI规则 + errMsg = "invalid URL (violation of Bidi IDNA rule - RFC 5893)" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含无效IPv6 URL的消息,则记录无效URL错误并退出 - elif "Invalid IPv6 URL" in excMsg: - errMsg = "invalid URL ('%s')" % excMsg.strip().split('\n')[-1] - logger.critical(errMsg) - raise SystemExit + elif "Invalid IPv6 URL" in excMsg: # 检查异常信息是否包含无效IPv6 URL + errMsg = "invalid URL ('%s')" % excMsg.strip().split('\n')[-1] # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 + # 如果异常信息中包含临时文件访问问题的消息,则记录临时文件访问错误并退出 - elif "_mkstemp_inner" in excMsg: - errMsg = "there has been a problem while accessing temporary files" - logger.critical(errMsg) - raise SystemExit + elif "_mkstemp_inner" in excMsg: # 检查异常信息是否包含临时文件访问问题 + errMsg = "there has been a problem while accessing temporary files" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含无法写入临时目录的消息,则记录临时目录写入错误并退出 - elif any(_ in excMsg for _ in ("tempfile.mkdtemp", "tempfile.mkstemp", "tempfile.py")): - errMsg = "unable to write to the temporary directory '%s'. " % tempfile.gettempdir() - errMsg += "Please make sure that your disk is not full and " - errMsg += "that you have sufficient write permissions to " - errMsg += "create temporary files and/or directories" - logger.critical(errMsg) - raise SystemExit + elif any(_ in excMsg for _ in ("tempfile.mkdtemp", "tempfile.mkstemp", "tempfile.py")): # 检查异常信息是否包含临时目录写入问题 + errMsg = "unable to write to the temporary directory '%s'. " % tempfile.gettempdir() # 生成错误信息 + errMsg += "Please make sure that your disk is not full and " # 添加提示信息 + errMsg += "that you have sufficient write permissions to " # 添加提示信息 + errMsg += "create temporary files and/or directories" # 添加提示信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含权限拒绝的消息,则记录文件访问权限错误并退出 - elif "Permission denied: '" in excMsg: - match = re.search(r"Permission denied: '([^']*)", excMsg) - errMsg = "permission error occurred while accessing file '%s'" % match.group(1) - logger.critical(errMsg) - raise SystemExit + elif "Permission denied: '" in excMsg: # 检查异常信息是否包含权限拒绝 + match = re.search(r"Permission denied: '([^']*)", excMsg) # 提取被拒绝访问的文件路径 + errMsg = "permission error occurred while accessing file '%s'" % match.group(1) # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含sqlalchemy包版本问题的消息,则记录sqlalchemy版本错误并退出 - elif all(_ in excMsg for _ in ("twophase", "sqlalchemy")): - errMsg = "please update the 'sqlalchemy' package (>= 1.1.11) " - # 由于网络原因,无法解析提供的链接,可能是链接问题或网络问题,请检查链接的合法性并适当重试。 - logger.critical(errMsg) - raise SystemExit + elif all(_ in excMsg for _ in ("twophase", "sqlalchemy")): # 检查异常信息是否包含sqlalchemy版本问题 + errMsg = "please update the 'sqlalchemy' package (>= 1.1.11) " # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含Python版本问题的消息,则记录Python版本错误并退出 - elif "invalid maximum character passed to PyUnicode_New" in excMsg and re.search(r"\A3\.[34]", sys.version) is not None: - errMsg = "please upgrade the Python version (>= 3.5) " - # 由于网络原因,无法解析提供的链接,可能是链接问题或网络问题,请检查链接的合法性并适当重试。 - logger.critical(errMsg) - raise SystemExit + elif "invalid maximum character passed to PyUnicode_New" in excMsg and re.search(r"\A3\.[34]", sys.version) is not None: # 检查异常信息是否包含Python版本问题 + errMsg = "please upgrade the Python version (>= 3.5) " # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含PyMySQL包版本问题的消息,则记录PyMySQL版本错误并退出 - elif all(_ in excMsg for _ in ("scramble_caching_sha2", "TypeError")): - errMsg = "please downgrade the 'PyMySQL' package (=< 0.8.1) " - # 由于网络原因,无法解析提供的链接,可能是链接问题或网络问题,请检查链接的合法性并适当重试。 - logger.critical(errMsg) - raise SystemExit + elif all(_ in excMsg for _ in ("scramble_caching_sha2", "TypeError")): # 检查异常信息是否包含PyMySQL版本问题 + errMsg = "please downgrade the 'PyMySQL' package (=< 0.8.1) " # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果异常信息中包含Python解 - # 假设excMsg是一个包含异常信息的字符串变量 # 检查excMsg是否包含"pymysql"和"configparser"这两个字符串 - elif all(_ in excMsg for _ in ("pymysql", "configparser")): - # 如果都包含,则设置错误信息为检测到'pymsql'的错误初始化(使用了Python3的依赖) - errMsg = "wrong initialization of 'pymsql' detected (using Python3 dependencies)" - # 使用logger记录这个严重错误 - logger.critical(errMsg) - # 抛出SystemExit异常,导致程序退出 - raise SystemExit + elif all(_ in excMsg for _ in ("pymysql", "configparser")): # 检查异常信息是否包含pymysql和configparser + errMsg = "wrong initialization of 'pymsql' detected (using Python3 dependencies)" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 检查excMsg是否包含"ntlm"、"socket.error, err"和"SyntaxError"这三个字符串 - elif all(_ in excMsg for _ in ("ntlm", "socket.error, err", "SyntaxError")): - # 如果都包含,则设置错误信息为检测到'python-ntlm'的错误初始化(使用了Python2的语法) - errMsg = "wrong initialization of 'python-ntlm' detected (using Python2 syntax)" - # 使用logger记录这个严重错误 - logger.critical(errMsg) - # 抛出SystemExit异常,导致程序退出 - raise SystemExit + elif all(_ in excMsg for _ in ("ntlm", "socket.error, err", "SyntaxError")): # 检查异常信息是否包含ntlm、socket.error和SyntaxError + errMsg = "wrong initialization of 'python-ntlm' detected (using Python2 syntax)" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 检查excMsg是否包含"drda"和"to_bytes"这两个字符串 - elif all(_ in excMsg for _ in ("drda", "to_bytes")): - # 如果都包含,则设置错误信息为检测到'drda'的错误初始化(使用了Python3的语法) - errMsg = "wrong initialization of 'drda' detected (using Python3 syntax)" - # 使用logger记录这个严重错误 - logger.critical(errMsg) - # 抛出SystemExit异常,导致程序退出 - raise SystemExit + elif all(_ in excMsg for _ in ("drda", "to_bytes")): # 检查异常信息是否包含drda和to_bytes + errMsg = "wrong initialization of 'drda' detected (using Python3 syntax)" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 检查excMsg是否包含特定的错误信息,即'WebSocket'对象没有'status'属性 - elif "'WebSocket' object has no attribute 'status'" in excMsg: - # 如果包含,则设置错误信息为检测到错误的websocket库 - errMsg = "wrong websocket library detected" - # 添加参考链接到错误信息中 - errMsg += " (Reference: 'https://github.com/sqlmapproject/sqlmap/issues/4572#issuecomment-775041086')" - # 使用logger记录这个严重错误 - logger.critical(errMsg) - # 抛出SystemExit异常,导致程序退出 - raise SystemExit + elif "'WebSocket' object has no attribute 'status'" in excMsg: # 检查异常信息是否包含WebSocket对象缺少status属性 + errMsg = "wrong websocket library detected" # 生成错误信息 + errMsg += " (Reference: 'https://github.com/sqlmapproject/sqlmap/issues/4572#issuecomment-775041086')" # 添加参考链接 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 检查excMsg是否包含特定的错误信息,即初始化GUI界面时出现问题 - elif all(_ in excMsg for _ in ("window = tkinter.Tk()",)): - # 如果包含,则设置错误信息为GUI界面初始化问题 - errMsg = "there has been a problem in initialization of GUI interface " - # 添加具体的错误信息到错误消息中 - errMsg += "('%s')" % excMsg.strip().split('\n')[-1] - # 使用logger记录这个严重错误 - logger.critical(errMsg) - # 抛出SystemExit异常,导致程序退出 - raise SystemExit + elif all(_ in excMsg for _ in ("window = tkinter.Tk()",)): # 检查异常信息是否包含GUI初始化问题 + errMsg = "there has been a problem in initialization of GUI interface " # 生成错误信息 + errMsg += "('%s')" % excMsg.strip().split('\n')[-1] # 添加具体错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 检查excMsg是否包含特定的错误信息,即使用了不同版本的sqlmap文件 - elif any(_ in excMsg for _ in ("unable to access item 'liveTest'",)): - # 如果包含,则设置错误信息为检测到使用了不同版本的sqlmap文件 - errMsg = "detected usage of files from different versions of sqlmap" - # 使用logger记录这个严重错误 - logger.critical(errMsg) - # 抛出SystemExit异常,导致程序退出 - raise SystemExit + elif any(_ in excMsg for _ in ("unable to access item 'liveTest'",)): # 检查异常信息是否包含不同版本sqlmap文件问题 + errMsg = "detected usage of files from different versions of sqlmap" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 检查errMsg是否包含特定的错误信息,即版本号相关的错误 - elif any(_ in errMsg for _ in (": 9.9.9#",)): - # 如果包含,则设置错误信息为一个简单的文本 - errMsg = "LOL xD" - # 使用logger记录这个严重错误 - logger.critical(errMsg) - # 抛出SystemExit异常,导致程序退出 - raise SystemExit + elif any(_ in errMsg for _ in (": 9.9.9#",)): # 检查错误信息是否包含特定版本号 + errMsg = "LOL xD" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 检查是否设置了键盘中断的标记 - elif kb.get("dumpKeyboardInterrupt"): - # 如果设置了,则抛出SystemExit异常,导致程序退出 - raise SystemExit + elif kb.get("dumpKeyboardInterrupt"): # 检查是否设置了键盘中断标记 + raise SystemExit # 退出程序 # 检查excMsg是否包含特定的错误信息,即"Broken pipe" - elif any(_ in excMsg for _ in ("Broken pipe",)): - # 如果包含,则直接抛出SystemExit异常,导致程序退出 - raise SystemExit + elif any(_ in excMsg for _ in ("Broken pipe",)): # 检查异常信息是否包含Broken pipe + raise SystemExit # 退出程序 # 检查valid变量是否为False - elif valid is False: - # 如果为False,则设置错误信息为代码校验失败 - errMsg = "code checksum failed (turning off automatic issue creation). " - errMsg += "You should retrieve the latest development version from official GitHub " - errMsg += "repository at '%s'" % GIT_PAGE - # 使用logger记录这个严重错误 - logger.critical(errMsg) - # 打印空行 - print() - # 将错误信息输出到标准输出 - dataToStdout(excMsg) - # 抛出SystemExit异常,导致程序退出 - raise SystemExit + elif valid is False: # 检查校验和是否无效 + errMsg = "code checksum failed (turning off automatic issue creation). " # 生成错误信息 + errMsg += "You should retrieve the latest development version from official GitHub " # 添加提示信息 + errMsg += "repository at '%s'" % GIT_PAGE # 添加GitHub仓库链接 + logger.critical(errMsg) # 记录严重错误信息 + print() # 打印空行 + dataToStdout(excMsg) # 输出异常信息到标准输出 + raise SystemExit # 退出程序 # 检查errMsg和excMsg组合后是否包含特定的错误信息,即文件路径或特定参数 - elif any(_ in "%s\n%s" % (errMsg, excMsg) for _ in ("tamper/", "waf/", "--engagement-dojo")): - # 如果包含,则使用logger记录这个严重错误 - logger.critical(errMsg) - # 打印空行 - print() - # 将错误信息输出到标准输出 - dataToStdout(excMsg) - # 抛出SystemExit异常,导致程序退出 - raise SystemExit + elif any(_ in "%s\n%s" % (errMsg, excMsg) for _ in ("tamper/", "waf/", "--engagement-dojo")): # 检查错误信息是否包含特定路径或参数 + logger.critical(errMsg) # 记录严重错误信息 + print() # 打印空行 + dataToStdout(excMsg) # 输出异常信息到标准输出 + raise SystemExit # 退出程序 # 检查错误信息中是否包含特定的错误关键词,如果包含,则认为是运行时环境错误,并提取错误信息的最后部分。 - elif any(_ in excMsg for _ in ("ImportError", "ModuleNotFoundError", " returned NULL without setting an exception", "source code string cannot contain null bytes", "No module named", "tp_name field", "module 'sqlite3' has no attribute 'OperationalError'")): - errMsg = "invalid runtime environment ('%s')" % excMsg.split("Error: ")[-1].strip() - logger.critical(errMsg) - raise SystemExit + elif any(_ in excMsg for _ in ("ImportError", "ModuleNotFoundError", " returned NULL without setting an exception", "source code string cannot contain null bytes", "No module named", "tp_name field", "module 'sqlite3' has no attribute 'OperationalError'")): # 检查异常信息是否包含运行时环境错误 + errMsg = "invalid runtime environment ('%s')" % excMsg.split("Error: ")[-1].strip() # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果错误信息包含非ASCII字符编码错误,则认为是运行时环境错误,并提取错误信息的最后部分。 - elif all(_ in excMsg for _ in ("SyntaxError: Non-ASCII character", ".py on line", "but no encoding declared")): - errMsg = "invalid runtime environment ('%s')" % excMsg.split("Error: ")[-1].strip() - logger.critical(errMsg) - raise SystemExit + elif all(_ in excMsg for _ in ("SyntaxError: Non-ASCII character", ".py on line", "but no encoding declared")): # 检查异常信息是否包含非ASCII字符编码错误 + errMsg = "invalid runtime environment ('%s')" % excMsg.split("Error: ")[-1].strip() # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果错误信息包含文件不存在的错误,则认为是运行时环境错误,并提取错误信息的最后部分。 - elif all(_ in excMsg for _ in ("FileNotFoundError: [Errno 2] No such file or directory", "cwd = os.getcwd()")): - errMsg = "invalid runtime environment ('%s')" % excMsg.split("Error: ")[-1].strip() - logger.critical(errMsg) - raise SystemExit + elif all(_ in excMsg for _ in ("FileNotFoundError: [Errno 2] No such file or directory", "cwd = os.getcwd()")): # 检查异常信息是否包含文件不存在错误 + errMsg = "invalid runtime environment ('%s')" % excMsg.split("Error: ")[-1].strip() # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果错误信息包含权限错误,则提示用户可能存在权限问题,并建议重新运行程序时禁用多进程。 - elif all(_ in excMsg for _ in ("PermissionError: [WinError 5]", "multiprocessing")): - errMsg = "there is a permission problem in running multiprocessing on this system. " - errMsg += "Please rerun with '--disable-multi'" - logger.critical(errMsg) - raise SystemExit + elif all(_ in excMsg for _ in ("PermissionError: [WinError 5]", "multiprocessing")): # 检查异常信息是否包含权限错误 + errMsg = "there is a permission problem in running multiprocessing on this system. " # 生成错误信息 + errMsg += "Please rerun with '--disable-multi'" # 添加建议信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果错误信息包含文件不存在的错误,则提示用户安装可能已损坏,并建议从官方GitHub仓库获取最新开发版本。 - elif all(_ in excMsg for _ in ("No such file", "_'")): - errMsg = "corrupted installation detected ('%s'). " % excMsg.strip().split('\n')[-1] - errMsg += "You should retrieve the latest development version from official GitHub " - errMsg += "repository at '%s'" % GIT_PAGE - logger.critical(errMsg) - raise SystemExit + elif all(_ in excMsg for _ in ("No such file", "_'")): # 检查异常信息是否包含文件不存在错误 + errMsg = "corrupted installation detected ('%s'). " % excMsg.strip().split('\n')[-1] # 生成错误信息 + errMsg += "You should retrieve the latest development version from official GitHub " # 添加提示信息 + errMsg += "repository at '%s'" % GIT_PAGE # 添加GitHub仓库链接 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果错误信息包含尝试在生产环境中运行开发测试的错误,则输出相应的错误信息。 - elif all(_ in excMsg for _ in ("No such file", "sqlmap.conf", "Test")): - errMsg = "you are trying to run (hidden) development tests inside the production environment" - logger.critical(errMsg) - raise SystemExit + elif all(_ in excMsg for _ in ("No such file", "sqlmap.conf", "Test")): # 检查异常信息是否包含在生产环境中运行开发测试的错误 + errMsg = "you are trying to run (hidden) development tests inside the production environment" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果错误信息包含HTTP NTLM认证相关的兼容性问题,则输出相应的错误信息,并提供参考链接。 - elif all(_ in excMsg for _ in ("HTTPNtlmAuthHandler", "'str' object has no attribute 'decode'")): - errMsg = "package 'python-ntlm' has a known compatibility issue with the " - errMsg += "Python 3 (Reference: 'https://github.com/mullender/python-ntlm/pull/61')" " - logger.critical(errMsg) - raise SystemExit + elif all(_ in excMsg for _ in ("HTTPNtlmAuthHandler", "'str' object has no attribute 'decode'")): # 检查异常信息是否包含HTTP NTLM认证兼容性问题 + errMsg = "package 'python-ntlm' has a known compatibility issue with the " # 生成错误信息 + errMsg += "Python 3 (Reference: 'https://github.com/mullender/python-ntlm/pull/61')" " # 添加参考链接 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果错误信息包含字典对象属性错误,并且与枚举相关,则提示用户可能存在枚举问题,并建议重新运行程序时刷新会话。 - elif "'DictObject' object has no attribute '" in excMsg and all(_ in errMsg for _ in ("(fingerprinted)", "(identified)")): - errMsg = "there has been a problem in enumeration. " - errMsg += "Because of a considerable chance of false-positive case " - errMsg += "you are advised to rerun with switch '--flush-session'" - logger.critical(errMsg) - raise SystemExit + elif "'DictObject' object has no attribute '" in excMsg and all(_ in errMsg for _ in ("(fingerprinted)", "(identified)")): # 检查异常信息是否包含字典对象属性错误 + errMsg = "there has been a problem in enumeration. " # 生成错误信息 + errMsg += "Because of a considerable chance of false-positive case " # 添加提示信息 + errMsg += "you are advised to rerun with switch '--flush-session'" # 添加建议信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果错误信息包含数据库磁盘映像损坏的错误,则提示用户会话文件可能损坏,并建议刷新会话。 - elif "database disk image is malformed" in excMsg: - errMsg = "local session file seems to be malformed. Please rerun with '--flush-session'" - logger.critical(errMsg) - raise SystemExit + elif "database disk image is malformed" in excMsg: # 检查异常信息是否包含数据库磁盘映像损坏 + errMsg = "local session file seems to be malformed. Please rerun with '--flush-session'" # 生成错误信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 # 如果错误信息包含模块属性错误,则认为是运行时环境错误,并提取错误信息的最后部分。 - elif "AttributeError: 'module' object has no attribute 'F_GETFD'" in excMsg: - errMsg = "invalid runtime (\"%s\") " % excMsg.split("Error: ")[-1].strip() - errMsg += "(Reference: 'https://stackoverflow.com/a/38841364' & 'https://bugs.python.org/issue24944#msg249231')" " - logger.critical(errMsg) - raise SystemExit + elif "AttributeError: 'module' object has no attribute 'F_GETFD'" in excMsg: # 检查异常信息是否包含模块属性错误 + errMsg = "invalid runtime (\"%s\") " % excMsg.split("Error: ")[-1].strip() # 生成错误信息 + errMsg += "(Reference: 'https://stackoverflow.com/a/38841364' & 'https://bugs.python.org/issue24944#msg249231')" " # 添加参考链接 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 + # 如果错误信息包含marshal数据错误,则提示用户.pyc文件可能损坏,并建议删除.pyc文件来解决问题。 - elif "bad marshal data (unknown type code)" in excMsg: - match = re.search(r"\s*(.+)\s+ValueError", excMsg) - errMsg = "one of your .pyc files are corrupted%s" % (" ('%s')" % match.group(1) if match else "") - errMsg += ". Please delete .pyc files on your system to fix the problem" - logger.critical(errMsg) - raise SystemExit - - for match in re.finditer(r'File "(.+?)", line', excMsg): - file_ = match.group(1) + elif "bad marshal data (unknown type code)" in excMsg: # 检查异常信息是否包含marshal数据错误 + match = re.search(r"\s*(.+)\s+ValueError", excMsg) # 提取损坏的文件路径 + errMsg = "one of your .pyc files are corrupted%s" % (" ('%s')" % match.group(1) if match else "") # 生成错误信息 + errMsg += ". Please delete .pyc files on your system to fix the problem" # 添加建议信息 + logger.critical(errMsg) # 记录严重错误信息 + raise SystemExit # 退出程序 + + # 遍历异常信息中的文件路径,并对其进行规范化处理 + for match in re.finditer(r'File "(.+?)", line', excMsg): # 查找异常信息中的文件路径 + file_ = match.group(1) # 提取文件路径 try: - file_ = os.path.relpath(file_, os.path.dirname(__file__)) - except ValueError: - pass - file_ = file_.replace("\\", '/') - if "../" in file_: - file_ = re.sub(r"(\.\./)+", '/', file_) + file_ = os.path.relpath(file_, os.path.dirname(__file__)) # 将文件路径转换为相对路径 + except ValueError: # 捕获路径转换错误 + pass # 忽略错误 + file_ = file_.replace("\\", '/') # 将路径中的反斜杠替换为正斜杠 + if "../" in file_: # 检查路径中是否包含上级目录 + file_ = re.sub(r"(\.\./)+", '/', file_) # 替换上级目录为单斜杠 else: - file_ = file_.lstrip('/') - file_ = re.sub(r"/{2,}", '/', file_) - excMsg = excMsg.replace(match.group(1), file_) + file_ = file_.lstrip('/') # 去除路径开头的斜杠 + file_ = re.sub(r"/{2,}", '/', file_) # 将多个斜杠替换为单斜杠 + excMsg = excMsg.replace(match.group(1), file_) # 更新异常信息中的文件路径 - errMsg = maskSensitiveData(errMsg) - excMsg = maskSensitiveData(excMsg) + # 对错误信息和异常信息进行敏感数据掩码处理 + errMsg = maskSensitiveData(errMsg) # 掩码处理错误信息中的敏感数据 + excMsg = maskSensitiveData(excMsg) # 掩码处理异常信息中的敏感数据 - if conf.get("api") or not valid: - logger.critical("%s\n%s" % (errMsg, excMsg)) + # 如果配置了API或校验和无效,则记录错误信息和异常信息 + if conf.get("api") or not valid: # 检查是否配置了API或校验和无效 + logger.critical("%s\n%s" % (errMsg, excMsg)) # 记录严重错误信息和异常信息 else: - logger.critical(errMsg) - dataToStdout("%s\n" % setColor(excMsg.strip(), level=logging.CRITICAL)) - createGithubIssue(errMsg, excMsg) + logger.critical(errMsg) # 记录严重错误信息 + dataToStdout("%s\n" % setColor(excMsg.strip(), level=logging.CRITICAL)) # 输出带颜色的异常信息到标准输出 + createGithubIssue(errMsg, excMsg) # 创建GitHub问题 - finally: - kb.threadContinue = False + finally: # 无论是否发生异常,最终都会执行的代码块 + kb.threadContinue = False # 设置线程继续标志为False - if (getDaysFromLastUpdate() or 0) > LAST_UPDATE_NAGGING_DAYS: - warnMsg = "your sqlmap version is outdated" - logger.warning(warnMsg) + # 如果距离上次更新的天数超过指定值,则提示用户版本过时 + if (getDaysFromLastUpdate() or 0) > LAST_UPDATE_NAGGING_DAYS: # 检查距离上次更新的天数 + warnMsg = "your sqlmap version is outdated" # 生成警告信息 + logger.warning(warnMsg) # 记录警告信息 - if conf.get("showTime"): - dataToStdout("\n[*] ending @ %s\n\n" % time.strftime("%X /%Y-%m-%d/"), forceOutput=True) + # 如果配置了显示时间,则输出结束时间 + if conf.get("showTime"): # 检查是否配置了显示时间 + dataToStdout("\n[*] ending @ %s\n\n" % time.strftime("%X /%Y-%m-%d/"), forceOutput=True) # 输出结束时间 - kb.threadException = True + kb.threadException = True # 设置线程异常标志为True - if kb.get("tempDir"): - for prefix in (MKSTEMP_PREFIX.IPC, MKSTEMP_PREFIX.TESTING, MKSTEMP_PREFIX.COOKIE_JAR, MKSTEMP_PREFIX.BIG_ARRAY): - for filepath in glob.glob(os.path.join(kb.tempDir, "%s*" % prefix)): + # 如果存在临时目录,则清理临时文件 + if kb.get("tempDir"): # 检查是否存在临时目录 + for prefix in (MKSTEMP_PREFIX.IPC, MKSTEMP_PREFIX.TESTING, MKSTEMP_PREFIX.COOKIE_JAR, MKSTEMP_PREFIX.BIG_ARRAY): # 遍历临时文件前缀 + for filepath in glob.glob(os.path.join(kb.tempDir, "%s*" % prefix)): # 查找匹配的临时文件 try: - os.remove(filepath) - except OSError: - pass + os.remove(filepath) # 删除临时文件 + except OSError: # 捕获文件删除错误 + pass # 忽略错误 - if not filterNone(filepath for filepath in glob.glob(os.path.join(kb.tempDir, '*')) if not any(filepath.endswith(_) for _ in (".lock", ".exe", ".so", '_'))): # ignore junk files + # 如果临时目录中没有其他文件,则删除临时目录 + if not filterNone(filepath for filepath in glob.glob(os.path.join(kb.tempDir, '*')) if not any(filepath.endswith(_) for _ in (".lock", ".exe", ".so", '_'))): # 检查临时目录是否为空 try: - shutil.rmtree(kb.tempDir, ignore_errors=True) - except OSError: - pass + shutil.rmtree(kb.tempDir, ignore_errors=True) # 删除临时目录 + except OSError: # 捕获目录删除错误 + pass # 忽略错误 + if conf.get("hashDB"): conf.hashDB.flush(True)