一、SQL注入原理:

造成SQL注入的原因:

在没有对用户的输入进行过滤、检测的情况下,就把用户输入数据,带入到数据库中执行SQL语句。

利用SQL注入:

由于系统没有对输入的数据进行过滤、检测,就带入到数据库中执行SQL语句,那么当用户输入一条恶意的数据,使其与原SQL语句拼接、重组得到一条恶意的SQL语句,当数据库执行这条恶意的SQL语句时,就会把数据库中的信息暴露出来,从而泄露信息。

访问网页具体流程图:

在这里插入图片描述
在上图中,用户访问实验楼主页进行了如下过程:

1、在 Web 浏览器中输入 www.shiyanlou.com 连接到实验楼服务器。

2、业务逻辑层的 Web 服务器从本地存储中加载 index.php 脚本并解析。

3、脚本连接位于数据访问层的 DBMS(数据库管理系统),并执行 Sql 语句。

4、数据访问层的数据库管理系统返回 Sql 语句执行结果给 Web 服务器。

5、业务逻辑层的 Web 服务器将 Web 页面封装成 HTML 格式发送给表示层的 Web 浏览器。

6、表示层的 Web 浏览器解析 HTML 文件,将内容展示给用户。

在三层架构中,所有通信都必须要经过中间层,简单地说,三层架构是一种线性关系。

一般的代码:

$id=$_GET[‘id’];
$sql=“SELECT * FROM name WHERE id=’$id’ LIMIT 0,1”;

我们可以看到,用户输入的id是被带到sql语句中进行拼接,然后执行的,而且,这个id两边是被’ ‘(两个单引号)给闭合起来的,所以在这个代码里’(单引号)就是闭合符。

由此,若是我们想进行SQL注入,那么就可以通过给定id一些恶意的数据,让这些恶意的数据与原SQL语句结合在一起,构成一个新的、恶意的SQL语句,让这个恶意的SQL语句执行成功,从而达到SQL注入的目的。


二、防止SQL注入的措施

1、SQL语句的执行代码使用预编译 PreparedStatement 。
2、确定每个数据的类型,比如是数字,数据库则必须使用int类型来存储
3、限制传入数据的长度,这能够在一定程度上防止sql注入。
4、严格限制用户使用数据库的权限,能够在一定程度上减少sql注入的危害。
5、避免直接响应一些 sql 语句执行异常的信息。
6、过滤参数中含有的一些数据库关键词。


三、判断SQL语句闭合方式原理:

MYSQL数据库的包容性比较强,如果你输错了数据的类型,MYSQL数据库会自动将其转换成正确的数据类型,比如输入1)、1"、1-等,只要数字后面的字符不是闭合符的,数据库都会把你输入的错误的数据转换成正确的数据类型。

但是,若输入的数字后面的字符恰好是闭合符,则会形成闭合,若闭合后形成的sql语句是错误的,那么sql语句执行就会错误,从而造成页面显示错误。

例如:
在Mysql数据库下,代码如下:

$id=$_GET[‘id’];
$sql=“SELECT * FROM name WHERE id=’$id’ LIMIT 0,1”;

可以看到’(单引号)就是这条语句的闭合符
当,id输入的是1),那么拼接成的sql语句就是:“SELECT * FROM name WHERE id=‘1)’ LIMIT 0,1”;
按理来说这个sql语句应该是错误的,执行会报错,但是因为是在Mysql数据库环境下,它会自动把错误的数据1)转换成合法的数据1,从而使得sql语句执行成功,相同的输入1-、1"也一样。

在这里插入图片描述在这里插入图片描述
但是,若id输入的是1’,那么形成的sql语句就是:“SELECT * FROM name WHERE id=‘1’ '(两个单引号) LIMIT 0,1”;
那么第1个单引号就和第2个单引号形成闭合,然后还剩下一个多余的第3个单引号,从而报错。
在这里插入图片描述
只要在输入的数据中,形成了新的闭合,且组成的sql语句不正确,那么就会报错。
在这里插入图片描述

相反SqlServer、oracle数据库对数据类型很严格,输错数据类型不会自动转换成正确的数据类型,所以只要输入的数据类型不正确就会出现报错信息。
以此特性就可以进行bool盲注。

三、如何判断SQL注入闭合方式:

首先我们可以知道,sql的注入可以分为数字类型,字符类型。

方法1:
首先我们可以使用\(转义字符)来判断SQL注入的闭合方式。
原理,当闭合字符遇到转义字符时,会被转义,那么没有闭合符的语句就不完整了,就会报错,通过报错信息我们就可以推断出闭合符。

分析报错信息:看\斜杠后面跟着的字符,是什么字符,它的闭合字符就是什么,若是没有,就为数字型。

以sqli-labs靶场为例
第一关闭合符为:’(单引号)
在这里插入图片描述第二关闭合符为:无(数字型)
在这里插入图片描述第三关闭合符为:’)(单引号+括号)
在这里插入图片描述第四关闭合符为:")(双引号+括号)
在这里插入图片描述第五关闭合符为:’(单引号)
在这里插入图片描述
方法2:
首先尝试:
?id=1’
?id=1”
结果一:如果都报错
判断闭合符为:整形闭合。

结果二:如果单引号报错,双引号不报错。
继续尝试
?id=1’ –-+
结果1:无报错
判断闭合符为:单引号闭合。
结果2:报错
判断闭合符可能为:单引号加括号。

结果三:如果单引号不报错,双引号报错。
继续尝试
?id=1" -–+
结果1:结果无报错
判断闭合符为:双引号闭合。
结果2:报错
判断闭合符可能为:双引号加括号。

注意:这里的括号不一定只有一个,闭合符里是允许多个括号组合成闭合符的,具体要判段有多少个括号,可以使用二分法来快速判断。



\

参考链接:
https://www.jianshu.com/p/078df7a35671
https://blog.csdn.net/qq_36896220/article/details/94129125
https://blog.csdn.net/weixin_44189363/article/details/108277917

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐