SQL注入之MYSQL数据库

1-客户端和服务端交互数据过程

客户端向服务端发送一个网络请求,服务端向客户发送一个html页面,我们输入一个数据,这个数据随着http请求,就发送到了服务端,服务端在接收到这个数据以后,就会将这个数据连接到数据库,然后写SQL语句,服务端就将这个语句发送到MYSQL服务端,MYSQL服务端就解析这个语句然后执行,查询相关数据返回到服务端,这个服务端就相当于MYSQL的客户端,然后服务端通过后端代码加工到html页面当中,再返回到Websever,然后再返回到客户端。

ae5832d2668244fb9f2fe0d583256928.png

 

2-SQL注入原理

由于程序员在写web程序时,没有对客户端提供的数据进行严格的过滤和判断,用户可以通过修改数据,提交伪造的sql查询语句,并传递给服务器端,服务端连接数据库,将sql语句发送到数据库执行,数据库将sql语句执行结果,返回给服务端,服务端又将结果返回到客户端。

简单来说就是相关参数和数据未经处理直接带到了数据库进行查询。

3-如何查找注入点位置

前端页面所有提交数据的地方,只要提交数据到后台,后台拿着该数据和数据库进行了交互,那么这个地方就存在了注入点。

4-URL编码

URL编码(URL encoding)是一种将URL中的特殊字符转换为特定格式的编码方式,以便在互联网传输过程中安全地传递和处理。URL编码通常用于将不安全的字符转换为特定的编码格式,确保其在URL中不会被误解或损坏。

5-SQL注释符号

1——#和--(空格)表示注释,可以使后面的语句不被执行。在get请求中,也就是输入的URL,解释执行的时候,#是指导浏览器动作的,对服务器端无用。所以,http请求中没有#,也就是#无法注释。使用-- (空格时),空格也会被忽略。

所以我们可以使用--+的时候来进行注释。因为+会被解释成空格。

2 ——也可以将空格进行url编码。%20

3——如果是post请求可以使用#进行注释。

4——使用-- (此处有空格)为什么需要有空格呢?因为使用这个注释时,必须有空格才能形成有效的sql语句。

6-SQL注入分类

数字型,字符型,搜索型,xx型

详细见pikachu

1-数字型注入

不需要闭合引号

2-字符型注入

需要闭合引号

3-搜索型注入

模糊匹配,需要在’前面加一个%进行闭合

4-xx型注入

主要就是闭合括号

5-Json型注入

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端之间的数据传输和存储。它使用易于阅读和编写的文本格式来表示结构化数据,并且对多种编程语言具有广泛的支持。

Json是适用于前后端分离项目,在Web开发中,前端和后端之间需要进行数据交互,JSON作为一种常用的数据格式,可以方便地在前后端之间传递数据。前端可以将数据通过JSON格式发送给后端,后端也可以将处理结果以JSON格式返回给前端,实现数据的无缝对接。

前端负责用户界面的展示和交互逻辑,后端则负责数据处理和业务逻辑,前端和后端都有他自己的语言,前后端在交互的时候就需要一个第三方的数据格式,先将各自的语言转化为json格式,再通过其他的操作转化为自己的语言。

数据格式

1-对象(Object):

json
{
  "name": "John",
  "age": 30,
  "city": "New York"
}
2-数组(Array):

json
["apple", "banana", "orange"]

3-嵌套对象和数组:

json
{
  "name": "John",
  "age": 30,
  "address": {
    "street": "123 Street",
    "city": "New York"
  },
  "hobbies": ["reading", "traveling"]
}

4-值可以是字符串、数字、布尔值、null、数组或对象:

json
{
  "name": "John",
  "age": 30,
  "isStudent": true,
  "score": null,
  "grades": [85, 92, 78],
  "address": {
    "street": "123 Street",
    "city": "New York"
  }
}
在JSON中,字符串必须使用双引号括起来,数字、布尔值和null不需要引号。键和字符串值都可以包含Unicode字符。

7-sql注入提交方式

GET,POST,Cookie等

PHP:$_REQUEST(全部接受),$_GET,$_POST(接受post),$_COOKIE(接受cookie)

$_GET不是取得get请求携带的数据,而是取得查询参数数据

每个语言都有各自请求数据的方式

8-http请求头注入

 

9-MYSQL内置函数

 

10-报错注入

就是故意输入错误的mysql语句,在语法错误时,会输出在前端,有可能数据库返回的结果是没有经过加工处理的,从而得到有用的信息。

11-偏移量注入

在知道表名但是不知道列名的时候使用。

偏移注入是一种注入姿势,可以根据一个较多字段的表对一个少字段的表进行偏移注入,一般是联合查询,在页面有回显点的情况下

后面查询的表的字段数要比前面的表的字段数少。

要在后面进行补充列数。

假设一个表有8个字段,admin表有3个字段。        

表名.*就是代表该表下的所有字段

在我们不知道admin有多少字段的情况下可以尝试payload:union select 1,2,3,4,5,6,7,admin.* from admin,此时页面出错

直到payload:union select 1,2,3,4,5,admin.* from admin时页面返回正常,说明admin表有三个字段

然后通过移动admin.*的位置,就可以回显不同的数据

12-宽字节注入

为什么会产生宽字节注入,其中就涉及到编码格式的问题了,宽字节注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码格式从而导致产生宽字节注入

如果数据库使用的的是GBK编码而PHP编码为UTF8就可能出现注入问题,原因是程序员为了防止SQL注入,就会调用我们上面所介绍的几种函数,将单引号或双引号进行转义操作,转义无非便是在单或双引号前加上斜杠(\)进行转义 ,但这样并非安全,因为数据库使用的是宽字节编码,两个连在一起的字符会被当做是一个汉字,而在PHP使用的UTF8编码则认为是两个独立的字符,如果我们在单或双引号前添加一个字符,使其和斜杠(\)组合被当作一个汉字,从而保留单或双引号,使其发挥应用的作用。但添加的字符的Ascii要大于128,两个字符才能组合成汉字 ,因为前一个ascii码要大于128,才到汉字的范围 ,这一点需要注意。
 

 

 

 

 

 

 

 

 

 

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值