您当前的位置:首页 > 电脑百科 > 安全防护 > 数据安全

Sql注入基本原理

时间:2019-08-08 11:16:49  来源:  作者:

1、什么是Sql注入攻击

SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,它目前是黑客对数据库进行攻击的最常用手段之一。

本文将带你从介绍 Web 应用运行原理开始,一步一步理解 Sql 注入的由来、原理和攻击方式。

2、Web程序三层架构

三层架构(3-tier architecture) 通常意义上就是将整个业务应用划分为:

界面层(User Interface layer)

业务逻辑层(Business Logic Layer)

数据访问层(Data access layer)。

Sql注入基本原理

 

 

区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构被应用于众多类型的软件开发。

3、Sql注入产生原因及威胁

刚刚讲过当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。 这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

Sql 注入带来的威胁主要有如下几点

猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。

绕过认证,列如绕过验证登录网站后台。

注入可以借助数据库的存储过程进行提权等操作

4、判断Sql注入点

4.1 判断是否存在sql注入漏洞

通常情况下,可能存在 Sql 注入漏洞的 Url 是类似这种形式 :http://xxx.xxx.xxx/abcd.php?id=XX对 Sql 注入的判断,主要有两个方面:

判断该带参数的 Url 是否存在 Sql 注入?

如果存在 Sql 注入,那么属于哪种 Sql 注入?

可能存在 Sql 注入攻击的 ASP/PHP/JSP 动态网页中,一个动态网页中可能只有一个参数,有时可能有多个参数。有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的 动态网页且此网页访问了数据库,那么就有可能存在 Sql 注入。如果程序员没有足够的安全意识,没有进行必要的字符过滤,存在SQL注入的可能性就非常大。

最为经典的单引号判断法: 在参数后面加上单引号,比如:

1
http://xxx/abc.php?id=1'

 

如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。 (如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入,因为此为入门基础课程,就不做深入讲解了)

4.2 判断Sql注入漏洞的类型

通常 Sql 注入漏洞分为 2 种类型:

数字型

字符型

其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

4.2.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 语句:

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

 

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

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

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

 

没有语法错误但是逻辑判断为假,所以返回错误。 我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

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

 

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

4.2.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 语句:

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

 

语法正确,逻辑判断正确,所以返回正确。

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

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

 

语法正确,但逻辑判断错误,所以返回正确。同学们同样可以使用假设法来验证。

5、Sql注入实例

5.1 绕过登陆

我们正常的登陆是输入用户名密码到后台数据库判断用户名密码是否正确,看看后台代码是如何实现的

1
select * from user where username = '$name' and password = '$pwd'"

 

用户名密码都输入123,实际执行的sql语句是:

1
select * from users where username='123' and password='123'

 

我们尝试在用户名中输入 123’ or 1=1 #, 密码同样输入 123’ or 1=1 #显示登陆成功,为什么会登录成功呢,我们来看看实际执行的sql语句

1
select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'

 

按照 MySQL 语法,# 后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西也一样):

1
select * from users where username='123' or 1=1

 

由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。 我们再尝试不使用 # 屏蔽单引号,采用手动闭合的方式: 我们尝试在用户名中输入 123’ or ‘1’=’1, 密码同样输入 123’ or ‘1’=’1 (不能少了单引号,否则会有语法错误): 此处输入图片的描述 此处输入图片的描述 实际执行的 Sql 语句是:

1
select * from users where username='123' or '1'='1' and password='123' or '1'='1`

 

看到了吗?两个 or 语句使 and 前后两个判断永远恒等于真,所以能够成功登录。

还有通过sql语句注入来获取隐私信息,所以sql注入需要引起程序员们的注意。

6、预防Sql注入的方法

下面我针对JSP,说一下应对方法:

(1)(简单又有效的方法)PreparedStatement

采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。

使用好处:

(1).代码的可读性和可维护性.

(2).PreparedStatement尽最大可能提高性能.

(3).最重要的一点是极大地提高了安全性.

原理:

sql注入只对sql语句的准备(编译)过程有破坏作用

而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,

而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

(2) 使用正则表达式过滤传入的参数

要引入的包:

import JAVA.util.regex.*;

正则表达式:

private String CHECKSQL = “^(.+)sands(.+)|(.+)sor(.+)s$”;

判断是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具体的正则表达式:

检测SQL meta-characters的正则表达式 :

/(%27)|(’)|(–)|(%23)|(#)/ix

修正检测SQL meta-characters的正则表达式 :/((%3D)|(=))[^n]*((%27)|(’)|(–)|(%3B)|(:))/i

典型的SQL 注入攻击的正则表达式 :/w*((%27)|(’))((%6F)|o|(%4F))((%72)|r|(%52))/ix

检测SQL注入,UNION查询关键字的正则表达式 :/((%27)|(’))union/ix(%27)|(’)

检测MS SQL Server SQL注入攻击的正则表达式:

/exec(s|+)+(s|x)pw+/ix

等等…..

(3) 字符串过滤

比较通用的一个方法:

(||之间的参数可以根据自己程序的需要添加)

  •  
public static boolean sql_inj(String str) 
{ 
String inj_str = “’|and|exec|insert|select|delete|update| 
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,”; 
String inj_stra[] = split(inj_str,”|”); 
for (int i=0 ; i < inj_stra.length ; i++ ) 
{ 
if (str.indexOf(inj_stra[i])>=0) 
{ 
return true; 
} 
} 
return false; 
}

 

(4) jsp中调用该函数检查是否包函非法字符

防止SQL从URL注入:

sql_inj.java代码:

  •  
package sql_inj; 
import java.net.*; 
import java.io.*; 
import java.sql.*; 
import java.text.*; 
import java.lang.String; 
public class sql_inj{ 
public static boolean sql_inj(String str) 
{ 
String inj_str = “’|and|exec|insert|select|delete|update| 
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,”; 
//这里的东西还可以自己添加 
String[] inj_stra=inj_str.split(“|”); 
for (int i=0 ; i < inj_stra.length ; i++ ) 
{ 
if (str.indexOf(inj_stra[i])>=0) 
{ 
return true; 
} 
} 
return false; 
} 
}

 

(5) JSP页面判断代码:

使用JavaScript在客户端进行不安全字符屏蔽

功能介绍:检查是否含有”‘”,””,”/”

参数说明:要检查的字符串

返回值:0:是1:不是

函数名是

  •  
function check(a) 
{ 
return 1; 
fibdn = new Array (”‘” ,””,”/”); 
i=fibdn.length; 
j=a.length; 
for (ii=0; ii<i; ii++) 
{ for (jj=0; jj<j; jj++) 
{ temp1=a.charAt(jj); 
temp2=fibdn[ii]; 
if (tem’; p1==temp2) 
{ return 0; } 
} 
} 
return 1;
}

 

总的说来,防范一般的SQL注入只要在代码规范上下点功夫就可以了。

凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了。

看完本篇文章,小伙伴们明白sql注入的基本原理了吗?



Tags:Sql注入   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言目标是一大学,在一次挖洞过程中遇到个sql注入,尝试进一步利用扩大危害,漏洞已报送平台进行了修复私信我获取网络安全学习资料 1.2000多本网络安全系列电子书 2.网络安全标...【详细内容】
2021-11-26  Tags: Sql注入  点击:(21)  评论:(0)  加入收藏
本人也是小白一枚,大佬请绕过,这个其实是六月份的时候做的,那时候想多点实战经验,就直接用谷歌搜索找了一些网站,这个是其中一个1、目标网站 2、发现有WAF防护 3、判断存在注入...【详细内容】
2021-10-19  Tags: Sql注入  点击:(52)  评论:(0)  加入收藏
(一)SQL注入。1.如何理解SQL注入? SQL注入是一种将SQL代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手法。2.SQL注入是如何产生的? web开发人员无法保证所有的输入...【详细内容】
2021-09-17  Tags: Sql注入  点击:(47)  评论:(0)  加入收藏
一 前言本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案...【详细内容】
2021-09-17  Tags: Sql注入  点击:(67)  评论:(0)  加入收藏
前言本人ctf选手一名,在最近做练习时遇到了一些sql注入的题目,但是sql注入一直是我的弱项之一,所以写一篇总结记录一下最近学到的一些sql注入漏洞的利用。可回显注入联合注入在...【详细内容】
2021-08-26  Tags: Sql注入  点击:(60)  评论:(0)  加入收藏
前言最近挖edusrc的时候遇到有注入点但是有waf绕不过,头疼。 可以看到还是phpstudy建站的,太熟悉了这个,不知道这个什么waf各位师傅知道的可以评论一下,所以写这篇文章是供各位...【详细内容】
2021-08-13  Tags: Sql注入  点击:(66)  评论:(0)  加入收藏
1. 使用 Burpsuite: 1. Capture the request using burpsuite. 2. Send the request to burp scanner. 3. Proceed with active scan. 4. Once the scan is finished, l...【详细内容】
2021-08-04  Tags: Sql注入  点击:(74)  评论:(0)  加入收藏
0&times;00:前言对于MYSQL知识的一个初总结 0&times;01:正文 MYSQL数据库特性1.Mysql数据库默认不区分大小写,利用此特性可以进行大小写过正则匹配,举个简单的例子,有的题目中只...【详细内容】
2021-07-29  Tags: Sql注入  点击:(88)  评论:(0)  加入收藏
在本地搭建服务器,httpd-vhosts.conf 中设置本地绑定的域名: 其中,zzzphp为下载的zzzphp cms的内容。然后,本机上的zzzphp cms的目录结构为如下: 在按照要求安装好cms后,本地cms的...【详细内容】
2021-07-16  Tags: Sql注入  点击:(80)  评论:(0)  加入收藏
得到一个像原来老师一样督促你、关心你的人很难。。。---- 网易云热评一、常用命令及函数1、order by排序,获取数据有几个字段,后面小于等于字段数,都会返回结果,大于字段数返回...【详细内容】
2021-05-13  Tags: Sql注入  点击:(224)  评论:(0)  加入收藏
▌简易百科推荐
众所周知,Windows系统流氓软件众多,其中不乏出身大厂的产品。这些带有流氓性质的软件,很多都会偷偷扫描系统数据,读取用户文件,造成电脑卡顿拖慢不说,还严重侵害了个人隐私,造成巨...【详细内容】
2021-12-06  趣玩APPS    Tags:流氓软件   点击:(16)  评论:(0)  加入收藏
前言目标是一大学,在一次挖洞过程中遇到个sql注入,尝试进一步利用扩大危害,漏洞已报送平台进行了修复私信我获取网络安全学习资料 1.2000多本网络安全系列电子书 2.网络安全标...【详细内容】
2021-11-26  IT野涵    Tags:sql注入   点击:(21)  评论:(0)  加入收藏
互联网时代,不论是个人还是组织,都将数据视为一项重要的资产。为了便于存储、管理,企业常常会为各项数据建立一个数据库,如果没有做好安全风险防护,一旦数据库被攻占,企业将迎来很...【详细内容】
2021-10-28  快快网络   企鹅号  Tags:数据库   点击:(50)  评论:(0)  加入收藏
前言(可能思路狭隘,有缺有错,师傅们多带带)【查看资料】Author: 0ne本篇文章数据来源于18+省市级别HVV,90+单位失陷报告。(一部分是笔者的参与,一部分是薅的公司其他师傅的报告...【详细内容】
2021-10-28  IT野涵    Tags:缺口   点击:(46)  评论:(0)  加入收藏
本人也是小白一枚,大佬请绕过,这个其实是六月份的时候做的,那时候想多点实战经验,就直接用谷歌搜索找了一些网站,这个是其中一个1、目标网站 2、发现有WAF防护 3、判断存在注入...【详细内容】
2021-10-19    博客园  Tags:SQL注入   点击:(52)  评论:(0)  加入收藏
一 前言本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案...【详细内容】
2021-09-17  woaker    Tags:SQL注入漏洞   点击:(67)  评论:(0)  加入收藏
前言本人ctf选手一名,在最近做练习时遇到了一些sql注入的题目,但是sql注入一直是我的弱项之一,所以写一篇总结记录一下最近学到的一些sql注入漏洞的利用。可回显注入联合注入在...【详细内容】
2021-08-26  合天网安实验室    Tags:sql注入   点击:(60)  评论:(0)  加入收藏
“放纵自己的欲望是最大的祸害,窥探别人的隐私是最大的罪恶,不知自己的过失是最大的病痛”。 上文咱们知道了目前互联网的数据安全存在隐患,数据安全的问题,每天都在发生,只不过...【详细内容】
2021-08-13  小陶子矿工    Tags:IPFS   点击:(79)  评论:(0)  加入收藏
前言最近挖edusrc的时候遇到有注入点但是有waf绕不过,头疼。 可以看到还是phpstudy建站的,太熟悉了这个,不知道这个什么waf各位师傅知道的可以评论一下,所以写这篇文章是供各位...【详细内容】
2021-08-13  IT影子    Tags:sql注入   点击:(66)  评论:(0)  加入收藏
1. 使用 Burpsuite: 1. Capture the request using burpsuite. 2. Send the request to burp scanner. 3. Proceed with active scan. 4. Once the scan is finished, l...【详细内容】
2021-08-04  李志宽    Tags:SQL注入   点击:(74)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条