zoukankan      html  css  js  c++  java
  • Sql注入基础原理介绍

    说明:文章所有内容均截选自实验楼教程【Sql注入基础原理介绍】~

    实验原理

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

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

    Web 程序三层架构

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

    • 界面层(User Interface layer)

    • 业务逻辑层(Business Logic Layer)

    • 数据访问层(Data access layer)。

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

    • 表示层。

    • 业务逻辑层(又称领域层)

    • 数据访问层(又称存储层)

    拓扑结构如下图所示

    此处输入图片的描述

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

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

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

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

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

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

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

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

    Sql 注入漏洞

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

    刚刚讲过当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。

    这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

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

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

    Sql 注入实例 .验证绕过

    我们试试一个利用 Sql 漏洞绕过登录验证的实验。

    如下图所示,先下载文件并解压运行:

    shiyanlou:~/ $ wget http://labfile.oss.aliyuncs.com/courses/876/sql2.tar.gz
    shiyanlou:~/ $ tar -zxvf sql2.tar.gz
    shiyanlou:~/ $ cd sql2
    shiyanlou:~/ $ sudo apt-get update   
    shiyanlou:~/ $ ./deploy.sh
    

    进入 Firefox 浏览器,输入网址 : localhost/sql2 , 按照下图所示顺序,初始化数据:

    此处输入图片的描述

    此处输入图片的描述

    此处输入图片的描述

    此处输入图片的描述

    准备工作完成之后,我们进入首页发现这是一个普通的登录页面,只要输入正确的用户名和密码就能登录成功。

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

    此处输入图片的描述

    从错误页面中我们无法获取到任何信息。

    看看后台代码如何做验证的:

    此处输入图片的描述

    实际执行的操作时:

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

    当查询到数据表中存在同时满足 username 和 password 字段时,会返回登录成功。

    按照第一个实验的思路,我们尝试在用户名中输入 123' or 1=1 #, 密码同样输入 123' or 1=1 #

    此处输入图片的描述

    此处输入图片的描述

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

    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 
    

    由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。

    我们再尝试不使用 # 屏蔽单引号,采用手动闭合的方式:

    我们尝试在用户名中输入 123' or '1'='1 , 密码同样输入 123' or '1'='1 (不能少了单引号,否则会有语法错误):

    此处输入图片的描述

    此处输入图片的描述

    实际执行的 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注入的可能性就非常大。

    总结

    sql注入常用技术有段还包括:

    • 采用非主流通道技术
    • 避开输入过滤技术
    • 使用特殊的字符
    • 强制产生错误
    • 使用条件语句
    • 利用存储过程
    • 推断技术
    • ........

    最后

    该文章只截选了教程【Sql注入基础原理介绍】部分内容,该项目教程还讲解了以下内容以及全部的项目源码,如果感兴趣的可以点击教程进入网站进行学习~

    • sql注入示例:猜解数据库
    • 判断是否存在 Sql 注入漏洞
    • 判断 Sql 注入漏洞的类型

    另外关于sql注入还有以下项目教程可以学习:

  • 相关阅读:
    iOS开发数据库篇—FMDB简单介绍
    SQLite简单介绍
    iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)
    使用Block在两个界面之间传值
    ios NSURLSession使用说明及后台工作流程分析
    iOS archiveRootObject 归档失败问题
    iOS开发UI篇—ios应用数据存储方式(归档)
    iOS archive(归档)
    CoreData数据库升级
    iOS开发过程中使用Core Data应避免的十个错误
  • 原文地址:https://www.cnblogs.com/shiyanlou/p/7509944.html
Copyright © 2011-2022 走看看