SQL注入

SQL注入是什么

当网站对于用户所输入的数据没有很好的防护机制时,攻击者可以构造特殊的SQL语句来实现对目标数据库中信息的获取。

SQL注入的危害

有可能实现对目标数据库信息的增删改查,甚至再严重可能通过SQL注入拿到webshell或目标服务器权限

SQL注入可能在什么地方

你现在对网页的操作,需要用到这个网页的数据库,这就有可能存在SQL注入。举个例子:这是一个购物网站,你要搜索一个商品的名称,你输入商品的名字搜索(这里假设名字为a),网站会去后台的数据库查询a存不存在,这就可能存在SQL注入。

SQL注入分类

我个人觉得可以分为,显注和盲注。

显注

就是将SQL语句执行结果回显到了当前的页面上

在这里插入图片描述

显注的攻击手法

  • 联合查询:适用数据库中的内容会回显到页面中来的情况。联合查询就是利用 union select 语句,该语句会同时执行两条 select 语句,实现跨库、跨表查询。
    前提条件:两条 select 语句查询结果具有相同列数;对应的列数据类型相同。

  • 报错注入:在注入点的判断过程中,发现数据库中SOL 语句的报错信息,会显示在页面中,因此可以利用报错信息进行注入。报错注入的原理,就是在错误信息中执行SOL 语句。

攻击过程:

  1. 可以使用order by查询表格列数,如果报错了就是超过了列数,如果显示正常就是没有超出列数。
    在这里插入图片描述
    在这里插入图片描述
    这里可以看到使用SQL注入查询四列的时候显示错误,查询3列时候显示正常,所以可以判断这个数据库有三列。

  2. (从这里开始就要使用联合查询和报错注入了,而且基本上是两者都要使用)然后我们要查看,哪一列的数据可以显示在页面上。

在这里插入图片描述
这里页面上有2和3,那就说明第2列,第3列可以显示在页面上

  1. 获取当前数据名和版本号,这个就涉及mysql数据库的一些函数,不会的这个要自己去学一下数据库的知识。
    在这里插入图片描述

盲注

就是SQL语句的执行结果不显示在当前页面上

盲注的攻击手法

  • 布尔盲注:布尔盲注一般用到length(),ascii() ,substr()这三个函数,首先通过length()函数确定长度。再通过另外两个函数确定某一位上的字符是什么。布尔盲注向对于联合注入来说需要花费大量时间。
    在这里插入图片描述

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

在这里插入图片描述

这里可以看到SQL语句使用前后,页面只告诉你,你的SQL语句是否成功执行了,但是不会告诉你具体的结果。这个时候我们用联合注入就没有用,因为联合注入是需要页面有回显位。此时我们需要使用布尔盲注攻击。

攻击过程:

1.一般先判断数据库的长度,这里要使用length()这个函数。
在这里插入图片描述
这里查询当前这个数据库的字符长度是否大于8,但是显示错误了。所以长度不会大于8

在这里插入图片描述
这里查询当前这个数据库的字符长度是否等于8,显示正常,那就说明这个数据库就是8个字符的长度。

2.然后要查询每一个位置是是什么字母。这里要使用ascii() ,substr()这两个函数

在这里插入图片描述
这里的意思是查询这个数据库的第一位字母的ascii值是否大于115,但是显示错误,所以并不大于。

在这里插入图片描述
这里的意思是查询这个数据库的第一位字母的ascii值是否等于115,显示正常,所以第一位字母的ascii就是115。然后我们可以对应ascii表查到115对应的字母为s

  1. 至此数据库第一位字母查询到了结果,然后循环这个过程,可以将数据库的全部字母找到,不过就是很费时间

函数说明:
#substr(databases(),1,1)=7 substr(a,b,c)a是要截取的字符串即当前数据库的名称,b是截取的位置,c是截取的长度。因为数据库的名称都是长度为1因为我们要一个个判断字符。ascii()是将截取的字符转换成对应的ascii码,这样我们可以很好确定数字根据数字找到对应的字符。

  • 延时注入:利用if()语句和sleep()语句的延时性,以时间线作为判断条件。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里可以看得出,我们不管输入什么页面显示的东西都是一样的,这个时候布尔盲注就不适合我们用,布尔盲注适合页面对于错误和正确结果有不同反应。如果页面一直没有变化,那我们可以使用延时注入尝试。

攻击过程:

1.一般先判断数据库的长度,这里要使用sleep()语句。

在这里插入图片描述
这里的意思是,如果这个数据库的名称长度大于8,那么页面会延时5秒钟,然后返回结果,否则执行1.这里经过测试,没有延时,那么可以确定当前数据库的名称长度不会大于8

在这里插入图片描述
这里的意思是,如果这个数据库的名称长度等于8,那么页面会延时5秒钟,然后返回结果,否则执行1.这里经过测试,出现延时,那么可以确定当前数据库的名称长度为8

2.接下来要对数据库的每一位字母是什么进行判断,要结合之前的几个函数语句和这2个语句一起使用判断。
在这里插入图片描述

这里判断数据库字符第一位的ascii值是否大于115,如果大于,就延时5秒,否则执行1.这里经过测试,没有延时,那就说明数据库的第一位字母的ascii值不大于115

在这里插入图片描述
这里判断数据库字符第一位的ascii值是否等于115,如果等于,就延时5秒,否则执行1.这里经过测试,有延时,那就说明数据库的第一位字母的ascii值等于115,结合ascii表查询到,数据库的第一位的字母为s

3.然后循环这个过程,就可以判断出数据库名称的全部字母了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值