跳到主要内容

SQL 注入

SQL 注入的根本危害在于应用层与数据库层之间的信任边界失效:数据库把用户可控的输入当作 SQL 代码解析执行,而非当作数据处理。 这一边界一旦失效,攻击者就能以数据库引擎的身份读写任意数据,在高权限账号下进一步获取操作系统访问能力。

成立前提

漏洞成立需要三个条件同时满足:用户输入被直接拼接进 SQL 语句、语句未经参数化处理、输入未经有效过滤或转义。常见于以字符串拼接构造查询的 JSP+JDBC、ASP+MSSQL/Access、PHP+MySQL 技术栈,尤其集中在整型参数(idpagetype)和搜索关键词(keywordq)等看似"安全"的字段。

HTTP Header 字段同样是高频入口。User-AgentRefererX-Forwarded-For 被记录进日志表或统计表时,若落库操作同样未参数化,这些字段也成为注入点。Cookie 中的会话标识亦属此类。

利用链路

报错注入是最直接的信息获取方式。数据库将错误信息反显到响应时,单次请求即可提取数据库版本、当前用户、库名:

GET /news?id=1' AND extractvalue(1,concat(0x7e,(SELECT user())))-- -

布尔盲注适用于无回显但响应内容随条件变化的场景:

GET /news?id=1' AND 1=1-- - → 正常页面
GET /news?id=1' AND 1=2-- - → 异常/空页面

时间盲注用于完全无回显的场景,通过响应延迟判断条件真假:

GET /news?id=1'; IF(1=1,SLEEP(3),0)-- -

联合查询在可预判列数时直接将查询结果拼入正常返回中:

GET /news?id=-1 UNION SELECT 1,username,password FROM admin-- -

完整利用链路:注入点探测 → 确定注入类型 → 提取数据库结构 → 拖取目标数据表 → 凭据破解 → 如为 DBA 权限可写文件或执行系统命令。

DBA 权限下的延伸链路:当注入账号具有 DBA/SA 级别权限时,危害不止于数据读取。MSSQL 可通过 xp_cmdshell 直接执行操作系统命令;MySQL 可通过 INTO OUTFILE 向 Web 目录写入 webshell。一旦获得 webshell,攻击者即可以 Web 服务进程身份在服务器上横向移动——访问内网资源、读取配置文件中的数据库明文密码、进一步渗透内网其他主机。数据库中存储的 MD5 密码配合在线彩虹表破解后,还可用于撞库同一用户在其他平台的账号。

历史样本

通用 OA/CMS 批量影响:同一套系统被多家单位部署,单个注入点通过搜索引擎批量定位,影响范围呈倍数扩大。典型入口是 /report.asp?StartDate=<日期>/news.jsp?id=<整数> 等整型参数。攻击者常用 inurl:<特定路径> 的搜索语法一次检索出某套系统的所有部署实例,再批量验证注入是否存在,单次渗透行动可覆盖大量站点。

JSP 教育/政务系统categoryidColumnCodecols 等分页/分类参数未参数化,报错直接返回数据库结构信息。

Header 注入:统计接口将 X-Forwarded-For 落表时,IP 字段注入可绕过 WAF 对 URL 参数的检测。

登录接口 POST 注入与万能密码:身份验证接口的用户名或密码字段同样是高频注入点。当后端直接拼接 POST 参数构造登录查询时,在用户名字段构造使 WHERE 条件恒为真的语句,即可在不知道任何账号密码的情况下直接绕过身份验证,以第一条数据库记录的身份登录——通常即为管理员账号。

App 移动端 API 注入:移动端专用 API 接口往往安全投入低于 PC 端,/android//api/mobile/ 等路径下的接口同样存在整型参数注入,支持布尔盲注逐字节枚举数据。移动端流量较少经过 WAF,检测更薄弱。

二阶注入:注册用户名时写入恶意 payload,该 payload 经数据库存储后看似无害;当另一个功能(如收藏记录、个人信息展示)以用户名作为条件再次查询数据库,且该查询未对取出的值二次转义时,payload 在此处触发执行。这种模式的危险在于注入发生的位置与漏洞代码位置不在同一处,代码审计时容易遗漏。

Oracle 注入:Oracle 数据库的注入利用方式与 MySQL 存在差异,需使用 Oracle 特有的函数和系统表,时间盲注依赖 DBMS_PIPE 等包而非 SLEEP(),联合查询列数限制和 NULL 处理逻辑亦不同。

like '% 型注入:搜索接口将关键词拼入 WHERE field LIKE '%<input>%' 时,在输入末尾注入 %' AND 5=5 AND '%'=' 可使条件成立、%' AND 5=6 AND '%'=' 使条件失败,从而构造布尔盲注。此类注入在通用 CMS 的站内搜索、即时通讯关键字检索等功能中频繁出现,特征是 payload 不含典型的单引号闭合前缀,常规 SQL 注入扫描器容易漏判。

Cookie 业务字段注入:Cookie 中除会话标识外,还常携带业务参数(如分页历史、商品列表缓存、用户偏好),这些字段若被后端取出后直接拼接进查询,同样构成注入点。与 Header 注入不同,此类字段通常由前端 JavaScript 写入,测试时需逐一检查 Cookie 中的非会话字段,而非仅关注 PHPSESSID/token 等标准字段。

医疗卫生系统:三甲医院的移动预约平台、门诊挂号接口、医保申报系统是高价值注入目标,数据库中往往同时存储姓名、身份证、家庭地址、就诊记录乃至血库信息。此类系统多为外包开发、缺乏安全投入,且部分直接暴露在公网,DBA 权限的注入可在不拿 webshell 的情况下完整导出患者档案。

金融证券与 P2P 系统:证券交易系统、P2P 借贷平台的后台接口一旦存在注入,数据库中可直接读取用户资金余额、交易流水、数据库配置密码。由于此类系统常以内部子域或非标准端口对外暴露,扫描覆盖率低,漏洞存留时间长。

PostgreSQL 注入:PostgreSQL 环境下的注入特征与 MySQL 存在明显差异,::text 类型转换语法、pg_sleep() 延时函数、public schema 命名是识别数据库类型的快速线索。联合查询中列类型须精确匹配,报错注入依赖 cast()/pg_typeof() 等函数,部分工具在 PostgreSQL 上的技术选项(如 --technique=BU)与 MySQL 不同,直接套用 MySQL payload 往往失效。

XML/SOAP 接口注入:政务、物流、OA 等系统常以 XML 格式传递业务参数,抓包后可见 POST Body 为 <?xml version="1.0"...> 结构,其中业务字段同样未经参数化直接拼入 SQL。此类接口的注入点隐藏在 XML 节点文本中,常规扫描器仅覆盖表单参数,测试时需手动修改 Content-Type 为 text/xml 并在节点值中注入 payload。

搜索关键词参数时间盲注:全文搜索接口的 qkeywords 等参数在拼入 LIKE '%...%' 之前若未参数化,可构造含 SLEEP() 的时间盲注。此类接口有时对并发请求做了限速,sqlmap 的多线程策略会触发 HTTP 429 或连接重置,导致工具误判为注入不存在;改用单线程低频手工验证(间隔数秒发一次请求)能更可靠地确认延时是否稳定出现。

跨协议参数转移绕过 WAF:同一注入参数可通过 GET、POST、Cookie 三种方式提交,而 WAF 的检测规则往往只针对其中一种或两种通道。当 GET 参数触发拦截时,将同名参数移至 POST Body 或 Cookie 字段,同时把 = 替换为 LIKE 构造等价条件,可绕过多重防注入机制。这一模式在 ASP/ASP.NET 技术栈中尤为常见,因为这些框架默认对 GET、POST、Cookie 统一读取,后端代码无需修改即可接收来自不同通道的参数值。

ASP.NET .aspx 隐藏字段注入:ASP.NET WebForms 的表单控件在 POST 请求中以 ctl00$ContentPlaceHolder1$username 这类长名称提交,外观不像普通参数,渗透测试时容易被忽略。数字图书馆、政务信息公开、在线考试等采用 ASP.NET WebForms 开发的通用系统大量使用此结构,登录处、注册处的控件字段同样未经参数化时构成注入点,影响范围随系统通用性成倍扩大。

分页与排序参数注入:CRM、OA、政务系统的列表接口常以 pageIndexpageSizepage 等参数控制分页,开发者往往将这些整型参数直接拼入 LIMITTOP 子句,认为整数不需要参数化。实际上,POST 请求体中的 pageIndex=1&pageSize=50 若未强制类型转换,同样可注入布尔盲注或时间盲注 payload;部分案例中 ORDER BY 列名也由前端参数控制,构成另一类难以参数化的注入面。

MSSQL WAITFOR DELAY 时间盲注:MSSQL 环境下的时间盲注使用 WAITFOR DELAY '0:0:10' 而非 MySQL 的 SLEEP(),常见于政府、电信、能源等采用 SQL Server 的系统。条件执行形如 IF(condition) WAITFOR DELAY '0:0:5',通过响应时间判断真假;WAF 过滤了 AND= 等关键词时,可改用 NOT BETWEEN ... AND ... 等等价结构绕过,仍能实现稳定的延时判断。

报错响应直接暴露完整 SQL 语句:部分系统在发生数据库错误时,将完整 SQL 语句(含表名、字段名、拼接逻辑)原样输出到 HTTP 响应体中,如 SQL: SELECT payment_id,biz_code,... WHERE pid=<输入>。攻击者无需任何枚举即可读取数据库结构,将注入由盲注变为有回显注入,同时暴露业务逻辑(如支付流水表结构)。这一现象在未关闭调试模式的生产环境中较为普遍,PHP mysql_error() 直接输出和 .NET 默认错误页均是常见触发路径。

通用打印/导出功能接口注入:业务系统中打印、导出报表类接口往往是安全测试覆盖盲区,开发者认为该功能无需鉴权或仅供内部使用而疏于防护。此类接口一旦存在注入且为通用商业系统,批量部署于教育、政府、企业等多个行业的大量站点会被同时影响,危害面随部署量线性扩大。

注入 getshell 后批量种马:SQL 注入获取 webshell 后,漏洞即从数据泄露升级为服务器控制权限,攻击者可在目标服务器上批量植入木马,将受害站点改造为挂马/跳板节点。这说明注入漏洞的实际危害不止于数据读取,CVSS 评分中的"利用后果"须按最坏场景评估。

POST 参数自动化验证脚本流通:部分注入漏洞被提交时已附带可直接复用的自动化验证脚本,说明该漏洞已具备批量利用条件,存在在脚本流通前已被大规模利用的可能。此类漏洞的修复优先级应按已遭利用处理,而非按"待验证"处理。

JSON 嵌套参数注入绕过关键字过滤:POST Body 以 JSON 格式提交时,若某字段值本身又是经 URL 编码后的 JSON 结构,注入 payload 嵌套在多层编码中,简单的关键字匹配防护往往只对第一层解码后的字符串检测,无法触及内层 payload。此模式在接口网关、微服务代理等解码层次较多的架构中尤为隐蔽。

注入与越权多漏洞组合:同一业务功能(如会员查询、订单检索)中同时存在 SQL 注入和平行越权,两者叠加后危害倍增——注入可读取任意字段,越权可遍历其他用户记录,攻击者无需提权即可完整导出全量用户订单、身份证、联系方式等隐私数据。单独修复其中一个漏洞不能消除另一个的风险。

Base64 tamper 绕过防护脱管理员账号:部分系统对 SQL 注入关键字做了检测,但未对 Base64 编码内容解码后再检测,攻击者通过 Base64 编码整段 payload(即 sqlmap 的 base64encode tamper)可绕过防护,在 MSSQL 环境中成功执行注入并提取管理员账号。

URI 路径段本身作为注入点:注入点不在 URL 参数(?id=)而在 URI 路径段本身(如 /report/<注入值>/detail),后端以路径解析取值后直接拼入查询。此类注入与参数注入在抓包特征上有明显区别,常规扫描器仅对参数字段做 fuzz,路径段注入容易被遗漏;利用时可配合 stacked queries 或 SLEEP 验证。

演示/测试服务器与多问题叠加:官方演示服务器或测试环境往往保留调试配置、弱口令,同时存在注入、鉴权绕过、管理员弱密码等多个问题,安全投入低于生产环境。攻击者通过搜索引擎定位演示站后,可以此为跳板掌握系统结构,再对生产部署发起针对性攻击。

招聘/求职平台查询接口注入:招聘类平台的求职查询、简历检索 POST 接口是注入高发场景,接口交互量大、参数类型多,且平台数据库中集中存储大量用户真实姓名、手机、身份证、工作经历等高价值隐私数据,一旦被利用可批量导出求职者档案。

注入配合逻辑漏洞导致内部账号泄露:注入本身只能读取数据库中已有数据,当内部管理系统将员工账号密码(包括明文或弱哈希)存入业务库时,注入与权限逻辑漏洞叠加,可在无需提权的情况下批量泄露内部账号,进一步用于内网横向移动或撞库其他内部系统。

DNS 域名管理系统注入致解析劫持:动态域名、顶级域名托管平台的后台接口若存在高权限注入,攻击者在读取明文密码后可直接以合法账号登录,篡改数量庞大的域名解析记录。这类系统的数据库账号往往具备写权限,注入结果不止于数据泄露,而是直接导致域名劫持能力。

多站共享数据库实例注入:教育、媒体等机构将数十个子站的数据统一存放在同一数据库实例下,单个注入点即可枚举全部数据库和表,覆盖所有子站数据。在可用列表中看到数十个数据库时,应首先判断是否为共享实例,因为单点突破的爆炸半径可能远超预期。

CMS 伪全局变量注册机制导致非常规参数注入:部分国产 CMS 以伪全局变量注册方式将请求参数自动映射为全局变量,导致本不应参与 SQL 构造的参数(如逗号分隔的位置参数)同样被代入查询。此类注入点的参数格式非标准键值对,注入 payload 需嵌入分隔符之间,常规扫描器按普通参数处理时会漏判。

ThinkPHP 及调试框架路径泄露辅助注入:部分使用 ThinkPHP 等框架的系统在生产环境未关闭调试模式,加入单引号后直接将完整物理路径、数据库语句、框架版本暴露在错误页。攻击者据此可精准构造 payload,将盲注转化为有回显注入,也可将物理路径用于后续的 webshell 写入定位。

宽字节注入配合 tamper 脚本突破防注入:GBK 等双字节字符集环境下,%bf%27 可使数据库将转义符与前置字节合并解析为一个合法汉字,从而吞掉转义、使单引号逃逸。在存在防注入但未正确处理字符集的系统中,配合 sqlmap 的宽字节 tamper 可在 WAF 无感知的情况下完成完整注入,Linux 和 Windows 环境下的表现可能存在差异。

charcode 编码 tamper 绕过 WAF:WAF 对常见 SQL 关键字(SELECTUNIONAND 等)做关键字过滤时,将 payload 中的字符全部替换为对应的 ASCII 数字编码(即 sqlmap 的 charencode tamper),可使关键字在字符串层面完全消失,绕过基于字符串匹配的过滤规则,数据库在接收后自动完成解码并执行。

注入后利用后台图片上传写入 webshell:注入漏洞本身未必能直接写文件,但在通过注入获取管理员凭据进入后台后,攻击者利用后台的图片或附件上传功能,绕过前端类型校验上传 PHP/ASP 木马,再结合服务器对上传目录的可执行权限获得 webshell。此链路将数据库读权限最终升级为服务器任意命令执行。

搜索框联合时间盲注与布尔盲注同时存在:同一搜索类注入点在测试时可能同时表现出时间延迟和布尔响应差异,两种技术可互相验证以提高置信度。当时间盲注受到请求频率限制导致延迟不稳定时,切换为布尔盲注往往更稳定;反之在页面完全无内容差异时,时间盲注是唯一可用手段。

多处注入打包批量覆盖同一系统:同一业务系统在不同功能模块(如问答查询、签证检索、列表展示)同时存在多个独立注入点,每处参数均未参数化。这种模式说明系统采用了统一的字符串拼接风格而非参数化查询,代码审计时发现一处后应系统性排查同类参数,批量报告而非逐一提交。

绩效/员工内部系统登录框注入:企业内部使用的绩效管理、HR、考勤类系统往往由低预算外包团队开发,安全意识薄弱,登录框直接存在 POST 注入。此类系统虽对外入口有限,但一旦被内网入侵或通过 VPN 绕过访问控制,注入点几乎无任何防护,数据库中存储的员工薪资、绩效、组织架构等敏感信息可被完整导出。

文件上传后缀字段注入:CMS 的批量上传接口在对文件名主体部分做了 addslashes 转义的同时,却未对文件扩展名字段同样处理——因为开发者通常认为扩展名是程序内部解析的,而非用户可控输入。实际上扩展名同样来源于 HTTP 请求,当扩展名被直接拼入 INSERT 语句时,其中的单引号可完整注入,即便文件名主体已被转义。

验证码中断自动化工具时手工验证注入:部分登录接口在多次失败后强制要求验证码,致使 sqlmap 的自动化请求全部被拦截,工具输出结果为"未发现注入"。此时改用手工构造单条 payload(如 updatexml(1,concat(0x7e,user()),1)),在验证码有效期内发送,仍可稳定触发报错回显,完成注入验证。自动化工具的"无漏洞"结论在有验证码的登录场景下不可直接信任。

SQLite 数据库注入:部分轻量级 Web 应用(如小型 P2P 平台、单机管理系统)使用 SQLite 而非 MySQL 或 MSSQL,注入利用方式存在明显差异:无 information_schema,需通过 sqlite_master 枚举表结构;联合查询列数匹配逻辑不同;时间盲注依赖 randomblob() 等 SQLite 专有函数。sqlmap 自动识别后端为 SQLite 并切换语法,但部分针对 MySQL 设计的 tamper 脚本会导致误判或语法错误。

Oracle 双重编码 tamper 绕过 WAF:WAF 在检测 Oracle 注入 payload 时通常只解码一次,当攻击者使用 chardoubleencode tamper 对 payload 进行两轮 URL 编码后,WAF 层的单次解码结果仍是编码字符串而非 SQL 关键字,无法命中规则;数据库驱动在解析时完成最终解码并执行。这一模式在 Oracle 环境下尤为有效,因为 Oracle 的 JDBC/ODBC 驱动对多轮编码的兼容性使得 payload 仍可正常执行。

MSSQL 堆叠查询注入(Stacked Queries):MSSQL 支持以分号分隔的多条语句连续执行,当注入参数拼入查询且后端使用 MSSQL 时,可在参数值中追加 ; WAITFOR DELAY '0:0:5';-- 实现时间盲注,也可追加任意 DML/DDL 语句。此技术在 MySQL 中因驱动限制通常无效,但在 MSSQL 的 .NET/ASP 应用中成功率较高,是判断 MSSQL 环境的快速验证手段之一。

学籍/报名系统注入致业务数据篡改:教育系统的学生报名、志愿填报、录取信息管理接口存在注入时,危害不止于数据读取,后台登录后还可直接修改录取学校、志愿序列等业务数据。这类系统的安全投入普遍偏低,数据库中集中存储学生姓名、身份证、家庭地址等高密度隐私,且同一系统往往跨辖区部署,单点突破影响范围广泛。

UPDATE 语句注入(投票/状态更新接口):业务逻辑中涉及计数自增、状态变更的接口(如投票、点赞、签到)通常执行 UPDATE ... WHERE id='<输入>',开发者认为此类接口无需返回查询结果因而疏于防护。当 id 字段可注入时,可在 WHERE 条件中嵌入子查询或时间函数;即使 WAF 过滤了 and,切换为 or 构造等价条件同样有效。此类注入因无正常数据回显,须依赖时间盲注或出错信息验证。

注入读取服务器系统文件:MySQL 高权限账号可通过 load_file() 读取服务器本地文件,常见目标包括 /etc/passwd/etc/shadow、Web 配置文件(如 config.php)。在 Linux 环境下,若数据库服务账号对目标文件有读权限,单条 UNION SELECT load_file(0x2F6574632F736861646F77) 即可将文件内容回显到响应中,无需 webshell 即可获取系统账号哈希或其他敏感配置。

安全设备自身存在 SQL 注入:堡垒机、VPN 网关、运维审计系统等安全产品本身也会运行 Web 界面,其登录接口若存在宽字节注入,攻击者可直接提取管理员账号哈希并进一步获取 shell 访问权限。此类漏洞影响面极大,因为安全设备通常部署在金融、运营商等高价值网络的核心位置,且设备上会存储所有受托管主机的凭据。

注入后跨目录访问同 IP 旁站:获取 webshell 后,攻击者通常以 Web 服务进程身份在服务器上列目录,若同一物理机或同一虚拟机上部署了数十至数百个站点且跨目录权限未隔离,单个注入点即可实现对所有旁站的控制。这种"一点入网、全盘皆输"的模式在使用共享主机或统一运维部署的机构中极为常见,注入漏洞的实际影响范围须以服务器级而非单站计算。

物流/供应链系统注入致运营数据泄露:航运、快递、仓储类平台的数据库中存储大量结构化运营数据(港口、航线、货物、税率、订单号、责任人联系方式),字段粒度极细、数量庞大。此类系统多以企业内网为主要访问场景,但往往将查询接口对外暴露,注入后可完整导出业务运营档案,对竞争情报和供应链安全构成直接威胁。

健康/体检数据平台注入:连锁体检机构、健康管理平台的数据库按企业或科室分表存储体检报告,一张报告包含受检者姓名、性别、年龄、检测指标及异常标记。此类平台对接多家企业客户,单点注入可横跨多家企业员工的体检档案,兼具个人隐私与商业机密属性,且平台往往将预约登记入口直接暴露在公网,接口安全投入不足。

需先获取 Session Cookie 才能触发注入:部分系统要求在访问注入接口之前先通过首页产生合法 Session,若直接对注入接口发请求而不携带有效 Cookie,后端会提前跳转或返回空结果,导致工具误判为"无注入"。正确流程是先访问首页获取 Cookie,再将 Cookie 带入 sqlmap 的 -r 参数(使用请求文件)或 --cookie 选项,才能稳定触发注入响应。

ORDER BY 子句排序字段注入:列表类接口常允许前端指定排序字段名(如 myord=uptimesort=price),后端将该字段名直接拼入 ORDER BY 子句。由于 ORDER BY 后接的是列名而非值,无法用参数化查询保护,只能通过白名单校验;当后端未做限制时,可在字段名后追加报错注入函数,触发 MySQL 的 GROUP BY 报错,从而在无任何数据回显的排序接口中提取数据库信息。

BENCHMARK() 替代 SLEEP() 的时间盲注SLEEP() 被 WAF 过滤时,可改用 BENCHMARK(大整数, sha1(1)) 构造 CPU 密集型延迟,同样实现时间盲注效果。两者在 MySQL 中行为等价,但关键字不同,针对 SLEEP 的特征规则对 BENCHMARK 无效。此技术在旅游签证类接口的 subid 等整型参数中有实际案例。

EXP() 溢出报错注入EXP(~(select * from (select user())a)) 利用 MySQL 的双精度浮点溢出触发报错,将子查询结果带出,是 extractvalue() 的替代方案。当 WAF 屏蔽了 updatexmlextractvalue 等常见报错函数时,切换为 EXP() 可绕过,常用于伪全局变量注册型 CMS 中逗号分隔参数的注入场景。

CMS 将数据库错误写入本地日志文件:部分国产 CMS 在发生 SQL 错误时不直接回显,而是将错误信息写入服务器本地日志文件。这意味着报错注入的触发结果不出现在 HTTP 响应中,需通过后续读取日志文件(若已知路径)才能获取数据;同时,日志路径本身也因此暴露,注入痕迹会被持久化记录在文件系统中,提供取证线索。

$_FILES 不经过 GPC 转义的注入:PHP 的 magic_quotes_gpc 仅对 $_GET$_POST$_COOKIE 自动转义,$_FILES 不在其保护范围内。CMS 在处理批量文件上传时,若从 $_FILES['name'] 取文件名并拼入 SQL,即使 magic_quotes_gpc 开启也无法防护,文件名中的单引号可完整触发注入。此类漏洞常出现在批量上传接口,且因文件名字段不属于常规参数,扫描器通常不覆盖。

space2comment tamper 绕过空格过滤:WAF 若以空格作为 SQL 关键字识别的必要条件(如只拦截 SELECT 而不拦截 SELECT/**/),使用 space2comment tamper 将所有空格替换为 /**/ 行内注释后,关键字检测失效。配合 --tamper space2comment 可在 MSSQL 环境下绕过此类基于空格的 WAF 规则,常见于政务、媒体等采用 SQL Server 的系统。

OR 关键词去空格绕过关键字过滤:部分系统对含有空格前后包围的 or 做检测,但未对无空格形式的 or( 做处理。将注入构造为 queryType=3)or(1=1 形式,去掉 or 两侧空格并直接跟括号,即可绕过此类过滤。这一技巧在旅游票务类平台的订单查询接口中有实际案例,注入成功后可查看并操作全量订单数据。

phpinfo 页面泄露物理路径辅助 OUTFILE 写 shell:生产环境残留的 phpinfo.php 文件会将服务器绝对路径(DOCUMENT_ROOT)直接暴露在响应中。若同一站点同时存在 MySQL 高权限注入,攻击者无需猜测路径,直接将 phpinfo 提供的 Web 根目录路径代入 INTO OUTFILE 语句写入 webshell,显著降低利用门槛。

ASP+Access 轻量级建站程序批量注入:采用 Access 数据库的 ASP 建站系统因其低廉的部署成本被大量中小站点采用,系统默认弱口令(如 admin/123abc)通常未被修改,且分页、内容详情等接口的整型参数普遍存在注入。攻击者通过搜索引擎定位同一建站程序的所有部署实例后,可批量验证注入和弱口令,同时拿下大量站点管理权限。

Referrer 字段控制接口访问与参数注入并存:部分 CMS 的统计或计数接口以 Referer 校验作为唯一的访问控制手段,接口本身无登录态验证;与此同时,接口参数(如 aid)同样未参数化,构成注入点。伪造合法 Referer 即可绕过访问控制,再对参数注入提取数据。这类设计在轻量级 CMS 的内容统计接口中较为普遍,兼具越权和注入双重问题。

车联网/IoT 平台 API 注入:车联网服务平台的移动端 API(如区域检索、车辆状态查询接口)与普通 Web 应用共享同一数据库后端,但安全投入更低。此类接口的参数(如 p_region_id)未参数化,支持 GET/POST 注入;注入成功后还可通过后台获取 webshell,进而跨目录访问同服务器上的多个商城站点,爆炸半径随同服务器部署量扩大。

注入配合直接越权操作业务数据:注入点不仅能读取数据,当所在功能本身具有业务操作权限时(如订单管理、录取结果修改),注入绕过身份验证后,攻击者可直接调用界面功能对业务数据进行篡改——修改录取学校、取消他人订单、调整支付状态等。这类危害远超数据泄露,属于业务逻辑破坏,在教育报名和票务系统中有实际案例。

修复不完整只堵已知注入点:安全事件响应后,开发者有时只对被报告的具体接口或参数打补丁,而未对同类代码做系统性排查。同一业务系统中存在多处采用相同字符串拼接风格的接口,修复一处后其余注入点依然开放,二次提交时仍可验证。这说明点式修复不等于系统性修复,真正的根治需要全局切换到参数化查询,而非逐一堵漏。

未授权直接访问后台与注入叠加:部分系统的后台管理页面仅依赖前端 JavaScript 跳转做鉴权,禁用 JS 后可直接加载后台功能页。此类系统通常同时存在 POST 注入,两者叠加后攻击者既可在无账号的情况下访问后台数据,又可通过注入提取完整数据库内容,且无需任何凭据。在高校、政务类系统中此类双重问题组合较为常见。

ORDER BY 列数探测后联合查询:联合注入前需确定 SELECT 的列数,常规做法是逐步递增 ORDER BY 后的数字直到页面报错,最后一个不报错的数字即为列数,再用 UNION SELECT NULL,NULL,... 对齐。此方法比逐一增减 UNION NULL 列更快,尤其在列数较多(如三十列以上)时效率优势明显,且 ORDER BY 本身不包含 UNIONSELECT 等敏感关键字,绕过部分简单过滤更容易。

括号闭合型整型参数注入:部分系统在 SQL 语句中对整型参数加了括号包裹,如 WHERE (tz=<输入>),直接在参数值后追加单引号只会导致语法错误而无法利用;正确做法是先在参数值后加 ) 闭合括号,再追加注入条件(如 AND 1=1),最后补充 -- 注释尾部。此类注入的识别特征是加单引号后报错提示括号不匹配,而非单纯的引号不匹配。

注册接口实名字段注入:部分平台在用户注册时收集身份证号、真实姓名等实名字段,这些字段在写入数据库时若未参数化,同样构成注入点。开发者通常对用户名和密码字段的安全投入高于辅助信息字段,导致 realnameidcardopenId 等 POST 参数成为注入盲区;而此类注册接口的数据库通常同时存储大量真实用户的敏感身份信息,一旦被利用可批量导出。

用友 NC / OA 通杀型 JSP 注入:用友、致远等国产企业 OA 系统的 /sysform//epp/ 等路径下存在大量以 GUIDpk_infotypefid 命名的整型参数,这些 JSP 文件直接以字符串拼接构造 Oracle/MSSQL 查询。由于该类系统被大量政府、金融、能源机构采购,单个版本漏洞可同时影响数以千计的部署实例;部分接口还要求先访问首页生成有效 Session 后才能触发注入,直接发请求时工具会误报无漏洞。

伪静态路径自动识别注入:部分系统以伪静态方式将参数编码进 URL 路径(如 /article/<id>/detail.html),sqlmap 在 URI 中以 * 标记注入位置后可自动识别此类注入,工具输出参数名为 #1* (URI)。测试时不应只覆盖 ?key=value 形式的参数,需同时对路径段本身发起 fuzz;时间盲注和布尔盲注均可在伪静态路径上稳定执行。

DB2 数据库注入:银行、保险等金融机构部分系统采用 IBM DB2 作为后端数据库,注入特征与 MySQL/MSSQL 差异显著:系统表为 SYSCAT.TABLES/SYSCAT.COLUMNS,无 information_schema;时间盲注依赖 XMLELEMENT 等函数构造延迟;布尔盲注语法与标准 SQL 有细微差别。sqlmap 可自动识别 DB2 后端,但针对 MySQL 的 tamper 脚本直接套用往往失效,需指定 --dbms=db2 并选用兼容的 tamper。

XSS 辅助劫持 Cookie 后触发后台注入:攻击者先通过低危 XSS 漏洞(如内容发布、评论功能)植入 JavaScript,等待管理员触发 XSS 后获取其 Session Cookie;再持有该 Cookie 访问后台接口,利用后台功能中的 SQL 注入点读取或修改数据。此链路中 XSS 本身的危害取决于后台是否存在更高危的二次漏洞,单独评估 XSS 严重性时容易低估其作为跳板的组合价值。

数组首字符截取绕过 GPC 转义:PHP 以 $var[0] 截取字符串首字符时,若 magic_quotes_gpc 将单引号转义为 \'\ 本身成为字符串的第一个字符;构造 $tsn=\ 使截取结果为 \,在 SQL 中充当字符串转义符,后续参数中的单引号即可逃逸。此技术无需绕过 GPC,而是利用 PHP 数组与字符串下标访问的语义差异"制造"出转义符,在不修改 GPC 行为的前提下实现注入,适用于 INSERT 语句中含多个用户可控字段的场景。

email 字段时间盲注(注册/找回密码接口):移动端 APP 的注册、登录、找回密码等接口往往以 JSON 格式传递 userEmailemail 等字段,后端对用户名字段做了参数化但对邮件字段疏于处理。此类接口的时间盲注因请求体为 JSON,常规扫描器不自动覆盖,需手动将字段值替换为 SLEEP(5) payload 验证;注入成功后可通过邮箱字段进一步枚举用户表中其他账号的 token 或密码哈希。

企业邮箱平台 host 参数注入:部分企业邮箱或 SaaS 平台的登录接口以 host 参数标识租户域名,后端将其直接拼入查询以定位租户数据库配置。该参数通常在 URL 或 HTTP Header 中传递,不属于常规业务参数,测试时容易被忽略。由于同一平台托管多家企业租户,单个注入点可横向枚举所有租户的邮件账号、密码哈希乃至完整邮件列表,危害面随租户数量线性扩大。

BETWEEN tamper 绕过关键字过滤:WAF 或代码层过滤了 >< 运算符时,可改用 BETWEEN ... AND ... 构造等价的范围判断条件,sqlmap 的 between tamper 会自动将 >< 替换为 BETWEENNOT BETWEEN 形式。此技术在铁路、电信等运营商系统的 Linux 环境 MySQL 注入中有实际案例,配合宽字节注入可在过滤较严的环境中完成完整数据提取。

收藏/取消关注等 DELETE 操作接口注入:业务中涉及删除或取消操作的接口(如取消收藏、取消关注、批量删除消息)通常执行 DELETE ... WHERE id=<输入>UPDATE ... SET flag=0 WHERE id=<输入>,开发者认为此类接口的参数无需过滤。接口参数(如 opt=delFavor&id=<值>)同样未参数化时,可在 id 字段注入布尔盲注或时间盲注;此类接口的数据库用户往往具有写权限,理论上还可配合 stacked queries 执行任意 DML。

游戏/娱乐平台 roomid/gameid/wc 参数注入:游戏直播、票务、游戏积分等娱乐类平台的查询接口(如房间查询、游戏信息拉取、投票统计)大量使用 roomidgameidwc 等整型参数,这些字段在功能开发阶段安全投入普遍低于账号体系接口。此类平台的数据库中同时存储用户充值流水、实名信息和支付凭证,注入后可直接读取大量用户身份与资金数据;平台往往有较高并发流量,注入请求淹没在正常流量中不易被发现。

HAVING 子句聚合查询注入:部分 OA 和数据报表系统在分组统计功能中使用 GROUP BY ... HAVING <条件> 结构,HAVING 后的过滤条件若由前端参数拼入,同样构成注入点。HAVING 子句注入的特征是通常出现在统计、排行、报表类功能中,而非常规的 WHERE 查询;与 ORDER BY 注入类似,此处无法用参数化保护聚合条件表达式,只能通过白名单校验,遗漏率较高。

社保/劳动局系统注入:社会保险、公积金、人社部门的信息公开查询接口集中存储参保人姓名、身份证、缴费记录、单位信息等高密度隐私数据,且此类系统多为统一采购的通用平台,跨辖区大规模部署。政务系统的安全维护周期长、版本更新慢,漏洞从发现到修复往往跨越相当长的时间,注入点被长期保持开放状态;攻击者一旦获得 DBA 权限,可在不写 webshell 的情况下批量导出辖区内所有参保人档案。

FLOOR(RAND()*2) 报错注入替代方案extractvalue()updatexml() 被 WAF 过滤时,可改用 SELECT COUNT(*), CONCAT(<子查询>, FLOOR(RAND(0)*2)) x FROM <表> GROUP BY x 触发 MySQL 的 Duplicate entry 报错,将子查询结果带入错误信息。此报错机制利用的是 GROUP BYRAND() 在 MySQL 实现中的计算时序问题,与 extractvalue 属于完全不同的代码路径,针对函数名的 WAF 规则对此无效。

ORM 框架查询条件类型混淆注入:部分国产框架(如 ThinkPHP 早期版本)在解析 WHERE 条件时,若字段值为数组且第一个元素为 IN,框架会将后续元素拼入 IN (...) 子句而不对其转义,导致攻击者通过构造特定格式的 POST 数组参数绕过 ORM 的过滤机制直接注入。此类漏洞的特殊之处在于注入点不在普通字符串参数上,而隐藏在框架对数组参数的特殊处理逻辑中,对其有效的 payload 格式与常规字符串注入完全不同,代码审计时需关注所有将用户输入作为查询条件数组传入的位置。

Cookie uid/sessionid 整型参数注入与水平越权叠加:部分系统在 Cookie 中直接以明文整型字段(如 uid)标识当前登录用户,后端取出后既用于身份判断又拼入 SQL 查询。将该字段值修改为其他用户 ID 可实现水平越权访问他人数据;同时该字段若未参数化,还可直接注入枚举全量用户记录。两种攻击面叠加使得单个 Cookie 参数同时对应越权和注入两类漏洞,且两者均无需任何身份凭据即可发起。

MSSQL CHAR() 函数拼接字符串绕过字面量过滤:MSSQL 支持用 CHAR(n)+CHAR(m)+... 将 ASCII 码逐字节拼接成任意字符串,联合查询中可用这种形式替代字符串字面量。当 WAF 对单引号、字符串内容做关键字检测时,完全用 CHAR() 表达的 payload 在字符串层面不含任何可见关键字,检测规则命中率极低;驾校、培训类 ASP.NET/MSSQL 系统的 ID 参数联合查询中有实际案例,7 列结构下 NULL 对齐后直接提取用户表数据。

ASP.NET WebForms __VIEWSTATE 页面隐藏状态参数注入:ASP.NET WebForms 页面在 POST 请求中携带 __VIEWSTATE__EVENTVALIDATION 等加密状态参数,同时还存在 ctl00$ContentPlaceHolder1$txtStatus 等控件名格式的实际业务参数。渗透测试时习惯只关注明显的查询参数,而忽略这些控件参数中同样可能存在的注入点;高校、政务类 .aspx 系统若未对控件参数参数化,配合 MSSQL sa 权限可直接写入 webshell。

PHP $_FILES 文件名首字符截取构造转义符再注入:国产 CMS 若以 $_POST[str][0] 语法截取字符串首字符,PHP 会将其当作字符串下标访问返回第一个字节,而非数组元素。当 GPC 对单引号转义为 \' 时,构造 str=\(反斜杠),截取后得到 \,在后续 SQL 语句中充当转义符,配合其他可控参数(如 ptitle)可使单引号逃逸完成注入;而后台同类逻辑若存在对 lock 文件的删除操作,还可借此删除安装锁、触发系统重装,将注入攻击面扩展为任意代码执行。

投票/点赞 UPDATE 语句数组参数遍历注入:CMS 的投票功能通常以 UPDATE ... WHERE id='<选项值>' AND vote_id='<投票ID>' 更新票数,当选项值由前端数组参数(如 votedata[])批量传入并在循环中逐一拼入 SQL 时,数组中的某个值未经过滤即可触发注入。由于 and 关键字可能被全角字符替换或其他方式干扰,改用 or 拼接 sleep() 同样可实现时间盲注验证;此类接口无查询结果回显,需依赖时间差或异常行为确认注入存在。

运营商/宽带增值业务 ecgi/select_list 参数批量注入:电信、联通等运营商宽带平台的数字家庭系统常以 view_genre_ss.ecgi?genre_selectlist=<值> 形式暴露查询接口,参数未经参数化处理。同一系统因被批量部署在各地分公司,单一注入点通过搜索引擎可发现数十个暴露实例,且底层数据库连接账号通常具有较高权限,影响面随部署节点数线性扩大。

旅行/票务系统改签管理接口部分空格关键字绕过:旅行票务平台的改签查询接口对 andor(前后均含空格)做了字符串检测,但未考虑去掉空格后的变体形式。将 payload 构造为 queryType=3)or(1=1,去掉 or 前后空格并直接拼接括号,即可绕过过滤,使 WHERE 条件恒为真,返回系统中全量订单数据;注入点还允许对查询出的订单执行支付、取消等写操作,危害超出单纯读取范围。

新闻/政务文件系统 FileID 参数 MSSQL stacked queries 注入:政务、媒体类系统的文件下载、公文展示接口常以 FileID 等整型参数标识记录,后端使用 MSSQL 且未参数化时,可在参数值后追加 '; WAITFOR DELAY '0:0:5';-- 通过 stacked queries 实现时间盲注。配合 space2comment tamper 将空格替换为 /**/,可绕过对空格的简单过滤规则;此类接口的数据库通常存储公文正文、内部报告等非公开信息,DBA 权限下可进一步枚举全库表结构。

CDN 覆盖下注入存在但结果乱码的场景:当注入目标站点部署了 CDN 且 CDN 节点与源站字符集配置不一致时,注入触发的报错信息或联合查询结果在响应中呈现为乱码,工具可能误判为"注入不存在"或"无回显"。实际上注入本身仍在正常执行,布尔盲注和时间盲注不依赖字符回显,在乱码场景下仍可稳定验证;遇到 CDN 乱码时,应优先切换为布尔或时间盲注技术,而非放弃测试。

B2B/企业协同平台批量邮件删除接口数组参数注入:B2B 建站系统的消息/邮件模块在批量删除操作中以 POST 数组参数(如 deid[])接收多个 ID,代码循环取出每个元素直接拼入 UPDATE ... WHERE id=$id 而不做类型转换或转义。数组元素中注入的 payload 同样会被拼入语句执行;同一文件中恢复邮件、批量发送等功能通常采用相同的拼接模式,发现一处后应系统排查同模块的其他操作接口,通常可批量发现同类漏洞。

P2P/广告平台 API appid 参数字符串型布尔盲注:P2P 借贷或移动广告平台的 API 接口中,appid 等应用标识参数常为字符串类型,后端以单引号包裹拼入查询。在参数值末尾追加 ' AND 1=1 AND 'a'='a(闭合尾引号)可触发布尔盲注;时间盲注形式为 ' AND (SELECT * FROM (SELECT(SLEEP(5)))x) AND 'a'='a。此类接口因属于 API 层而非页面层,测试时需在 deviceidactiontime 等其他参数均保持有效的前提下修改 appid 字段,缺少必要参数时后端可能提前返回错误而掩盖注入行为。

跨国/台湾地区通用医护网络挂号系统批量注入:网络医院挂号系统将同一套 service-e.aspx?id= 的注入接口跨院部署,单个参数同时影响数十家医疗机构的挂号数据。此类系统数据量往往以百万计,字段包含身份证号、就诊记录等最高级别隐私数据;多层次部署使得从一个实例发现漏洞后,通过搜索引擎定位同系统其他实例可形成连锁式影响,修复时须以系统版本为单位全面升级,而非仅修补单个部署节点。

电商开店名称二阶注入触发邮件模板:Ecmall 类电商平台在注册开店时允许自定义店铺名称,后端以 addslashes 转义后入库;当买家下单触发邮件通知时,邮件模板直接从数据库取出 seller_name 字段拼入 INSERT 语句,此时转义已消失,注入在此处执行。此类漏洞的触发路径横跨"注册→交易→邮件"三个独立功能模块,代码审计仅检查注册逻辑无法发现,必须追踪数据从入库到二次使用的完整生命周期。

激活链接明文 uid 越权与注入叠加:部分平台在邮件激活链接中以明文整型 uid 字段标识待激活账号,前端验证仅检查链接签名而后端直接使用 uid 值查库;修改 uid 为他人 ID 即可越权激活或查看他人账号,同时该字段若未参数化,同样可触发布尔盲注枚举用户表。激活/验证类接口因被认为"仅合法用户才会访问"往往缺乏参数化保护,无登录态也可直接调用。

时间/日期型参数注入SatTimeBillDatedatestartDate 等日期参数在开发者认知中属于"格式受限"输入,通常不作注入防护。实际上当这类参数被直接拼入 SQL 时,将值替换为布尔条件(如 AND 1=1)或时间函数同样有效;汽车、银行、票务等行业的查询接口普遍以日期参数过滤记录,这些接口的日期字段往往是未被覆盖的注入盲区,配合 sqlmap 自动检测可快速确认。

航空/交通 App 多接口不同类型注入并存:同一航空公司官方 App 的后端接口中,userId 字段(POST 表单型)和 userEmail 字段(JSON 格式)分别存在不同类型的注入——前者为布尔盲注,后者为时间盲注。这说明同一应用的不同开发者对不同参数的防护水平不一致,测试时须对每个接口的每个字段单独验证,而非因某字段有防护就推断整个接口安全。

MSSQL os-shell 结合 dir 命令定位 Web 路径写 shell:当注入账号具有 MSSQL DBA 权限且可开启 xp_cmdshell 时,sqlmap 的 --os-shell 模式可直接获得交互式命令行。此时攻击者通过 dir /s/a-d/b <盘符>:\*.aspx 递归枚举所有 ASPX 文件路径,快速定位 Web 根目录,再用 echo 命令将 webshell 内容写入目标路径。整个过程无需提前猜测物理路径,命令行枚举取代了路径爆破,将从注入到 webshell 的步骤压缩为数条命令。

统一认证/单点登录接口注入:企业内部的统一认证平台(UUMS)或校园单点登录系统的 username 等 POST 参数若存在布尔盲注,危害远超普通业务系统——SSO 账号体系一旦被攻破,攻击者可枚举所有接入子系统的用户凭据。此类系统数据库中往往同时存储教务、财务、邮件等多个子系统的账号表;xp_cmdshell 若可用,注入后可直接在服务器执行系统命令,危害等级等同于服务器级别的完全失陷。

房产/不动产系统多注入点全系统覆盖:房地产信息系统的列表、详情、搜索、图片等接口通常由同一开发团队以相同的字符串拼接风格实现,导致全站数十个接口同时存在注入且互相独立。此类系统的数据库中存储房主姓名、身份证、联系电话、房屋坐落等高密度隐私,且系统往往面向政务/国企场景,安全维护滞后;发现一处后应以系统为单位做全量排查,批量修复而非单点堵漏。

idcard/openId 等实名辅助字段注入:银行和金融机构的微信 H5 接口中,cardNoacctNoopenId 等业务字段以 POST 形式提交,开发者将安全重点放在 cardNo 的格式校验上而忽略参数化,openId 等辅助字段直接拼入查询。此类字段外观像系统内部标识符,不属于常规渗透测试扫描覆盖范围;而金融系统的数据库中存储了用户账户余额、银行卡绑定关系等核心资产数据,单点注入的实际危害极高。

Cookie 自定义业务字段多接口联动注入:育儿、电商类平台在 Cookie 中以自定义整型字段(如 user1)记录用户状态,后端多个功能接口(个人中心、会员俱乐部、历史记录等)均读取该字段直接查询,而非从 Session 中取安全副本。单个 Cookie 字段因此成为影响全站多个接口的注入点,测试时修改该字段值可同时验证多处注入,批量影响范围远超单一接口注入。

MSSQL sa 权限下 xp_cmdshell 执行系统命令:部分生产系统的数据库账号以 sa 身份运行,当注入点为 MSSQL 且为 sa 权限时,xp_cmdshell 若未被禁用(或可被重新开启),攻击者可直接在操作系统层面执行任意命令,包括新建用户、导出文件、横向移动。此权限配置在高校、政务、旧版 ASP.NET 系统中仍普遍存在,危害完全超出数据库读写范畴,须按服务器失陷处置而非普通注入。

二手车/汽车行业系统超高权限多库注入:汽车经销、二手车、整车厂商的信息化系统常以同一数据库实例托管数十个业务库,注入账号具备 root/sa 等超级权限。在可枚举到数十个数据库的场景下,单个注入点即可访问全集团所有业务数据(销售、库存、供应链、客户档案);此类系统往往建设早、维护滞后,安全修复响应极慢,漏洞存留窗口长。

内容管理系统 t 型排序参数注入:部分 CMS 的内容列表接口以 t 等单字母参数指定内容类型或排序方式,参数值直接拼入查询而无类型约束。此类单字母参数外观无语义,渗透测试时极易被忽略;实际上 t=1 AND sleep(5) 等 payload 完全有效,时间盲注可稳定执行。内容平台的数据库中往往同时存储用户账号、积分流水、私信内容等多类数据,注入面比预期宽泛。

搜索关键词 keyword POST 注入覆盖业务线核心接口:搜索功能是平台核心接口,keyword 等参数的 POST 注入若未修复,影响不止于单一搜索功能,而是与平台账号体系共享同一数据库实例的所有数据——用户资料、商品库存、交易记录均在同一攻击面内。此类注入往往由自动化工具第一时间发现,但因"只是搜索接口"被低估优先级;实际危害须按共享数据库的最大数据集计算,而非仅按搜索结果数据集评估。

学术/文献数据库平台长期未修注入:面向高校和科研机构的学术文献平台数据库中集中存储用户账号密码、密码提示答案、邮箱等凭据,且大量用户使用机构邮箱或相同密码注册多个平台,一旦泄露即可用于横向撞库。此类平台的注入点有时在被发现后数年仍未修复,原因在于系统面向内网或学术订阅用户,运营方错误地将低公众曝光度等同于低风险;漏洞真正被利用时,已有大规模批量采集脚本运行数轮。

IDC/托管平台管理接口注入致全量客户站点沦陷:互联网接入商或建站托管平台的后台管理接口若存在 POST 注入,攻击者不仅可读取平台自身数据库,更可枚举全量托管客户的网站信息、配置密码、FTP 凭据。此类平台以单个管理系统统一管控数百乃至数千个客户站点,单点注入的爆炸半径与客户规模正相关;管理接口通常对外暴露且鉴权较弱,是高回报率的目标。

国土/自然资源局系统注入 getshell 后发现已被种马:国土、规划、自然资源类政务系统采购自通用厂商,注入漏洞在批量部署中同步存在。此类案例的特殊之处在于,在尝试利用注入写 webshell 时,目标服务器上已存在他人植入的木马,说明漏洞在安全研究人员发现前就已被恶意利用。政务系统漏洞存留周期长,已知漏洞未修期间多次被不同攻击者独立利用是常见模式。

托管平台 IIS 配置读取辅助定位全部旁站路径:在获取 webshell 后,攻击者若需枚举同服务器上所有 Web 站点的物理路径,可通过读取 IIS 的 ApplicationHost.configmetabase.xml 直接获得所有虚拟主机的 physicalPath 配置。与 dir /s/a-d/b 递归枚举不同,读配置文件一次性输出全部站点路径,无需多次命令执行;Windows IIS 环境中此文件通常位于固定路径,注入 load_file() 或 os-shell 均可触达,显著降低旁站控制的操作成本。

单字母参数 t/cid 布尔盲注暴露多库数据:部分内容平台和媒体站点以单字母参数(如 tcidq)传递内容类别或分组标识,这类参数外观极短且无明显语义,渗透测试时容易被忽略。实际上这些参数同样被直接拼入查询,t=1 AND 1=1 即可触发布尔盲注;此类参数通常出现在高访问量的内容列表接口,其后端数据库实例往往托管多个业务库,注入后枚举可见到数十个数据库名称,覆盖面超出单一站点范围。

加盟/特许连锁平台注入致全量代理商及用户数据泄露:面向加盟商和特许经营者的招商、合同管理平台数据库中存储加盟商真实身份、合同条款、保证金记录以及平台终端用户的个人信息,泄露后对竞争对手具有高价值。此类系统多由通用 B2B 平台框架搭建,前台搜索和列表接口的注入点与后台合同接口共享同一数据库;即使注入账号不具备 DBA 权限,仍可完整读取数十万条用户数据。

注入权限足够但绝对路径未知导致无法直接写 shell:部分注入点所对应的数据库账号具有 FILE 权限(MySQL)或 xp_cmdshell 可用(MSSQL),理论上可写 webshell,但因无法确认 Web 根目录的绝对路径而无法落地。此类场景下,phpinfo 泄露、报错信息、IIS 配置、框架调试页是获取路径的常见来源;若上述途径均无效,可结合操作系统的目录枚举(如 dir /s/a-d/b 或读取 Apache/Nginx 配置文件)逐步缩小路径范围,将"有权限但无路径"转化为完整 getshell 链路。

开源社交/论坛平台 ORM IN 数组条件注入:开源社交、SNS 类平台大量基于 ThinkPHP 等框架搭建,框架的 parseWhereItem 函数在处理 array('IN', '值') 形式的查询条件时,若直接将数组值拼入 IN (...) 子句而未转义,攻击者通过 POST 提交特定格式的数组参数可绕过 ORM 的过滤逻辑完成注入。此类漏洞不局限于单个站点——相同框架版本下运行的全部 SNS 实例均受影响,通过搜索引擎定位所有部署可实现批量利用。

卫生/纪检监察系统 DBA 权限注入:卫生局纪检监察室、质量监督检验院等监管机构的信息系统采购自通用厂商,部署时数据库账号往往保留 DBA 权限。此类系统存储行政执法记录、监察对象档案、内部审查材料等高度敏感数据,且因机构规模小、IT 维护能力弱,从漏洞发现到修复的响应时间远长于大型机构。DBA 权限意味着注入可进一步扩展为 os-shell,危害超出数据读取范畴。

时区/区域码参数括号闭合型布尔盲注:视频、地图、天气等平台的接口常以 tz(时区偏移)、region(区域码)等参数接受数值型输入,开发者认为这类系统级参数不属于用户业务输入、无需过滤。当后端对该参数加括号包裹(如 WHERE tz=(<输入>))时,直接追加单引号只触发括号不匹配错误;正确闭合形式为在参数值后先补 ) 再追加条件,如 -8) AND 8531=8531 AND (1=1,布尔盲注和时间盲注均可在此基础上稳定执行。

在线教育/知识付费平台注入致千万量级账号泄露:在线教育、学术订阅类平台因用户基数大、账号与真实邮箱强绑定,一旦注入成功可批量提取千万量级的账号凭据。此类平台的用户很大比例来自高校和企业机构,账号密码往往复用于机构内网、企业邮箱等系统,泄露后的二次利用价值极高;平台安全投入通常聚焦于内容版权,而非接口安全,注入点从发现到被批量利用的时间窗口极短。

中间层/聚合平台参数注入覆盖多业务线数据:门户、聚合型平台(如资讯、汽车、娱乐社区)往往以单一数据库实例托管旗下多个业务线的数据,注入参数可能仅出现在某个不起眼的功能(如投票、分类浏览),但该接口的数据库账号具有跨库读写权限。注入后枚举时出现数十个数据库名称,对应不同业务线(内容库、用户库、广告库、统计库)均在攻击面内;评估此类漏洞时,应以整个数据库实例的最大数据集而非当前功能的数据量作为危害基准。

彩票/博彩类平台注入:彩票销售系统、福利彩票官网的数据库中同时存储会员身份信息、投注记录、银行账号及管理员凭据,且此类平台的接口安全投入普遍偏低。注入获取管理员账号后,后台通常存在上传或写文件功能,可进一步升级为 webshell;数据库中的用户银行绑定信息、充值流水同时成为高价值攻击目标,危害从数据泄露直接延伸至资金安全。

MSSQL dbo 权限数据库备份 getshell:在 MSSQL 环境中,即使注入账号权限不足以执行 xp_cmdshell,若具有 dbo 权限,仍可通过差异备份向 Web 目录写入 webshell。攻击步骤是先将一句话木马内容插入某表,再将整库差异备份到已知的 Web 可访问路径,备份文件中包含插入的木马内容,后缀改为 .asp 后即可执行。此技术绕过了 xp_cmdshell 禁用的限制,是 MSSQL 环境中从注入到代码执行的备用路径。

WebService .asmx 接口注入:部分系统将业务功能以 WebService 形式暴露,接口以 .asmx 为扩展名,通过 SOAP 协议传递参数。扫描 .asmx 端点时可发现接口定义,其中的方法参数(如 strPlateNostrUserNo)同样未经参数化,将包含注入 payload 的 SOAP 请求包存为文本文件后通过 sqlmap -r 提交即可自动检测;与普通 HTTP 接口不同,此类 WebService 端点不会出现在常规爬虫结果中,需主动扫描后缀或通过 WSDL 枚举方法列表后手工构造测试请求。

SVN 源码泄露辅助定位注入点:生产环境遗留的 .svn 目录允许攻击者通过 /.svn/entries.svn/wc.db 还原完整源代码,进而在本地静态审计中快速发现未参数化的查询点。相比黑盒测试逐参数 fuzz,源码泄露将注入测试从概率游戏变为精准定位——审计时直接搜索字符串拼接模式(如 "SELECT * FROM ... WHERE id=".$_GET),批量输出所有潜在注入点后再逐一验证,效率提升数倍。此外,源码中的数据库配置文件路径、框架版本、后台地址等信息也同步暴露,进一步降低完整渗透链路的成本。

注入后篡改电商订单状态与商品价格:电商平台的注入点不止于数据读取,当数据库账号具有写权限时,攻击者可直接执行 UPDATE 修改订单支付状态为"已付款"、将商品价格改为极低值,实现"零元购"效果。此类危害远超信息泄露,直接造成商业损失;而开发者通常将注入防护资源集中在登录和查询接口,对订单状态变更接口的防护强度往往更低。

CI/Yii 等框架调试报错直接暴露 SQL 语句:CodeIgniter、Yii 等 PHP 框架在开发模式未关闭时,SQL 执行错误会触发框架级报错页面,直接将完整的查询语句(含表名、字段名、拼接逻辑)输出到响应中,格式形如 MySQL Query Error: SELECT * FROM oc_video WHERE typeid=3' order by norder。与通用的数据库错误相比,框架报错信息更结构化,字段语义更清晰,攻击者据此可无需任何枚举即构造精准 payload;此类报错在育婴、电商、内容类 CMS 的分类浏览、视频列表接口中有大量案例。

工具误判时切换多工具交叉验证:部分注入点在 sqlmap 默认参数下报告"无漏洞",但改用明小子、啊D 等工具或调整 sqlmap 的 --technique--level--risk 参数后可成功检出。原因通常是注入点的响应差异较小(布尔差异仅体现在微小文本变化)、或存在轻微延迟干扰时间盲注判断。遇到单工具无结果时,应先确认是否为空白响应或跳转,再手工构造 AND 1=1/AND 1=2 对比响应,以人工判断是否存在注入,而非直接信任工具的否定结论。

sqlmap --no-cast 参数处理字符集乱码问题:某些数据库或字段在 sqlmap 默认模式下因字符集转换导致提取数据为乱码或为空,原因是 sqlmap 默认使用 CAST() 函数进行类型转换,特定字符集下此函数会改变字节序列。添加 --no-cast 参数禁用类型转换后,数据以原始字节返回,可正常还原中文或多字节字符。此参数在老旧教育和政务系统(数据库字符集非标准 UTF-8)中尤为常用,遇到数据提取为空或乱码时应优先尝试此选项,而非误判为无数据。

密码哈希无法破解时转用社工信息链路:注入获取的管理员或用户密码哈希有时无法通过在线彩虹表或本地字典破解,此时攻击者转而利用数据库中同时存储的用户名、邮箱、注册手机号等身份信息发起社会工程学攻击——向账号绑定邮箱发送钓鱼邮件、或以真实姓名为基础在其他平台执行撞库。这说明注入的危害不仅在于密码泄露本身,即便密码无法破解,身份信息组合同样构成独立的攻击面,评估危害时应将明文身份字段与凭据字段同等对待。

政务/劳动系统 .aspx 接口 POST 参数注入:自治区、省市级劳动、人社、信息公开类政务系统多采用 ASP.NET .aspx 技术,POST 表单中的业务查询参数(如 namecertno)直接拼入 SQL。此类系统存储大量岗位信息、身份证、电话号码、职务等政务人员数据,字段粒度极细;且政务系统普遍存在弱口令,注入与弱口令往往同时存在,攻击者可在无需注入的情况下直接以弱口令登录后台,注入则提供了无账号时的替代路径。

广播/媒体平台多处 id 参数打包注入:广播电台、媒体网站的节目详情、点播、分类等接口统一以 id 参数标识记录,同一套代码库下数十个功能页面(节目页、分类页、主播页、互动页)的 id 字段均未参数化。此类打包型漏洞的特征是发现第一处后,对同站所有同名参数重放相同 payload 即可批量确认,每处注入均可触发联合查询直接提取管理员表数据,说明系统全程未对 id 做任何参数化处理。

招商/连锁加盟平台 POST 注入提取合同与保证金数据:加盟合同管理、招商对接平台的数据库中存储加盟商签约合同、保证金金额、法人信息及对手方联系方式,对竞争对手具有极高商业情报价值。此类平台的前台搜索和列表接口(如融资项目搜索 model.requireTitle 字段)以 extractvalue 报错注入为典型,涉及数百张业务表,且平台通常将"前台查询"与"后台合同"共享同一数据库实例,前台注入直接覆盖后台敏感数据。

注入账号有 FILE 权限但路径未知时综合定位 Web 根目录:MySQL 注入账号具有 FILE 权限时,INTO OUTFILE 写 webshell 的前提是精确知道 Web 根目录绝对路径。当 phpinfo 和报错信息均无法提供路径时,可尝试读取 Apache/Nginx/IIS 配置文件(如 /etc/nginx/nginx.conf/etc/apache2/sites-enabled/000-default.conf)获取 DocumentRootroot 指令;Linux 下还可通过 load_file('/proc/self/cmdline') 读取进程启动参数,推断工作目录。多种来源交叉印证后,将"有权限但无路径"转化为可落地的 webshell 写入。

cityid/bankuai 等业务分类参数整型注入覆盖酒店/IT 分发平台:酒店预订、IT 产品分发类平台的城市筛选、频道分类接口常以 cityidbankuairegion 等整型参数区分业务数据,后端将其直接拼入 WHERE cityid=<值> 而无类型约束。这类参数看似是系统枚举值、范围有限,开发者通常认为不需要参数化;实际上布尔盲注和时间盲注 payload 同样可在整型位置执行,MSSQL 环境下此类参数对应的数据库账号往往具有较高权限,可进一步枚举跨多库的业务数据。

绕过方式

绕过类别典型手法
大小写混淆SeLeCtUnIoN
内联注释SE/**/LECTUN/**/ION
双写绕过seselectlect(针对简单替换过滤)
URL 编码%53%45%4c%45%43%54
宽字节绕过GBK 编码环境中 %df%27 吞掉转义符
换行符SE\nLECT 绕过单行正则匹配
超长字符填充在 payload 前填充大量无意义字符,使真实 payload 超出 WAF 的检测窗口长度
关键字部分过滤时的 like 结构过滤了 and- 等但未过滤 orlike、单引号时,用 OR <字段> LIKE '%<payload>%' 构造等价条件

WAF 通常对 GET 参数检测较严,而对 Cookie、HTTP Header、JSON Body 中的参数检测较弱,Header 注入借此绕过。

防御控制点

参数化查询(Prepared Statement)是根本解法,彻底隔断用户输入与 SQL 代码的解析路径。ORM 框架在正确使用时等效于参数化查询,但动态拼接 ORDER BY 列名、表名等非值参数时仍需白名单校验。

其余控制点作为纵深防御:

  • 输入验证:整型参数强制类型转换,字符串参数限制允许字符集
  • 最小权限:数据库账号按业务细分,查询账号不赋予写权限,绝不使用 SA/root 账号
  • 错误信息脱敏:生产环境关闭数据库报错详情
  • WAF:作为补充检测层,不作为主要防线
  • 定期扫描:自动化工具结合人工审计,重点覆盖 Header 注入和二阶注入