SQL注入基础


一.产生

当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查。

在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到sql语句中,被当作sql语句的一部分进行执行,如果代码中没有过滤或者过滤不严谨是会出现漏洞的。 (拓扑图如图一)
在这里插入图片描述

二.SQl注入类型:

包括数字型注入、UNION注入、字符型注入、布尔盲注、时间注入、报错注入和堆叠注入等。

1.数字型

数字型注入就是指注入点的数据类型为数字型,没有用单引号引起来。

判断方法:

当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:

select * from <表名> where id = x

这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。

Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

原因如下:

当输入 and 1=1时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=1

没有语法错误且逻辑判断为正确,所以返回正常。(如图二)

在这里插入图片描述

当输入 and 1=2时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=2

没有语法错误但是逻辑判断为假,所以返回错误。(如图三)

在这里插入图片描述

我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

select * from <表名> where id = 'x and 1=1'

select * from <表名> where id = 'x and 1=2'

查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

参考博客

2.字符型

字符型注入就是注入点的数据类型是字符型。与数字型的区别在于字符型注入要用一对单引号引起来。

字符型判断:

当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:

select * from <表名> where id = ‘x’

这种类型我们同样可以使用 and ‘1’='1 和 and ‘1’='2来判断:

 Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。

 Url 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。

原因如下:

当输入 and ‘1’='1时,后台执行 Sql 语句:

select * from <表名> where id = ‘x’ and ‘1’=‘1’

语法正确,逻辑判断正确,所以返回正确。(图四)

在这里插入图片描述

当输入 and ‘1’='2时,后台执行 Sql 语句:

select * from <表名> where id = ‘x’ and ‘1’=‘2’

语法正确,但逻辑判断错误,所以返回错误。(图五)

在这里插入图片描述

3.UNION注入 (流程):

依次判断类型,字段数,回显点,依次爆库名,表名,字段名,数据.

(1)类型判断(字符型or 数字型)

(2)判断字段数:

例如:id=1’ order by 1 – +(或-- -)

union有一个十分严格的约束条件,因为是联合查询,必选保证字段数一致,即两个查询结果有相同的列数,因此我们要对字段数进行判断,使用 order by number 其作用为输出第number列。(注释符-- +,使后面语句失效)

(图一)

在这里插入图片描述

此时页面正常,增加number;

当页面异常时(图二)

在这里插入图片描述

number-1即为实际列数。

(3)判断回显点

知道该表的字段数之后,我们还需要确定在哪个字段出会输出有效信息。

联合查询的输出是严格按照顺序进行的,因此当id=1存在时会在第0行输出第一个sql语句查询到的结果,自然我们输入的数字就到了下一行。而 limit num1,num2的作用为从第num1行开始显示num2行内容

我们可以看到2,3被输出了(图三),

在这里插入图片描述

说明这两个位置都可以作为回显点。

当然我们也可以不用limit语句,只需让前面sql语句查询结果为空即可(如图四)

在这里插入图片描述

(4)爆库名,表名,字段名,数据 同数据库查询方法。

4.堆叠注入

实质就是通过结束符(分号)来执行多条sql语句。

我们在mysql的命令行界面执行一条查询语句,这时语句的结尾必须加上分号结束,如果我们想要执行多条sql那就用结束符分号进行隔开。就是在不可控的用户输入中通过传入结束符+新的sql语句来获取想要的息,大致过程如(图五)

在这里插入图片描述

触发条件

1.目标存在sql注入漏洞2.目标未对";"号进行过滤3.目标中间层查询数据库信息时可同时执行多条sql语句。

5.布尔盲注

(1)适用情况

没有返回SQL执行的错误信息,

错误与正确的输入,返回的结果只有正确与错误(图一与图二)

在这里插入图片描述
在这里插入图片描述

(2)相关函数:

left()函数

语法:left (string,n) string为要截取的字符串,n为长度。
payload:name=lili’ and left((select database()),1)=‘p’–+ (图三)

在这里插入图片描述

mid()函数:

语法:mid(string, start[, length]) ,string为要提取字符的字段,start为开始截取位置(起始值是1),length为截取的长度(可选,默认余下所有字符)

(图四)

在这里插入图片描述

正则表达式 regexp

语法: regexp^【a-z】表示字符串中第一个字符是在 a-z范围内。
regexp ^a 表示字符串第一个字符是a。
regexp ^ab 表示字符串前两个字符是ab。payload:name=lili’ and (select database()) regexp ‘^p’–+ (图五)
在这里插入图片描述

like函数:语法:Like 'a%'表示字符串第一个字符是a。 Like 'ab%‘表示字符串前两个字符是ab。%表示为任意值,payload:name=lili’ and (select database()) like ‘p%’–+

(图六)

在这里插入图片描述

if语句

语法:if(判断条件,正确返回的值,错误返回的值),注意数据库中的if与后端if不一样,payload:name=lili’ and 1= if(((select database())like ‘p%’),1,0)–+ ,表示如果if语句中的第一个参数为真,则输出第一个值1,不为真输出第二个值0;

(图七)

在这里插入图片描述

substr()函数

substr()函数是截取字符串的函数。
语法:substr(string,start,length)
参数string :被截取的字符串。
参数start :截取的起始位置。
参数length :从截取位置截取的长度。

char(x)函数

将x的值转为所对应的字符
payload:name=lili’ and mid((select database()),1,1)=char(112)–+

ord()函数

返回一个字符的ASCII码。
语法:ord(character)
参数character:为单个字符,如果是字符串的话,则只按照字符串的第一个字符计算。

length()函数

length()函数是否返回一个字符串的长度。

语法:length(string)
参数string :为需要输出其长度的字符串。

(3)基本操作步骤:

构造目标查询语句,选择拼接方式,构造判断表达式,提取数据长度,提取数据内容。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮-夜染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值