SQL注入理论

《SQL注入攻击与防御》Chap1

SQL注入综述

SQL注入是影响企业运营最具破坏性的漏洞之一,它会泄露保存在应用程序数据库中的敏感信息。
定义:应用程序在向后台数据传递SQL查询时,如果为攻击者提供了影响改查询的能力,就会引发SQL注入。
外延:不只是一种会影响Web应用的漏洞,对于任何不可信源获取输入的代码来说,如果使用该输入来构造动态SQL语句,就很可能会遭到攻击。
典型SQL注入-服务器端的数据库,外延-JS服务器端,Android平台

历史:1998年,在一次报告中首次进入公众视野,自此SQL注入的防范成为了一个重要的安全研究方向。

前置:

Web应用通用简单构建方式:

不管是什么语言编写的Web应用,有一点相同;它们的交互性由数据库驱动。

  • 数据库驱动的Web应用通常包括三层:
  • 表示层—-Web浏览器
  • 逻辑层—-PHP、.NET、ASP&……
  • 存储层—- MYSQL、Oracle等数据库管理系统

    三层架构中最基本的一条规则:表示层不与数据层通信
    这个过程是如何在代码中实现?书上给出了一段代码:
  • 这段PHP代码简明展现了交互过程,即逻辑层代码构造SQL语句与存储层进行数据交接,再把数据变成好看的页面展示在浏览器
  • 值得指出的是,实际开发中,mysql_query()早已弃用,而这种把SQL语句直接赋值给变量的做法也非常少见(要查的内容被写死),更常见的应用是构造查询类(Class),使用代码拼接出sql语句,进而实现链式查询(框架的实现原理)
  • 这里用到了计算机科学中常用的方法,抽象,构建一个抽象层,用同样的办法(类)应对各种不同的实际情况,大大提高了效率

注入成因:

  • 如果Web应用开发人员无法确保在将从Web表单,cookie及输入参数等收到的值传递给SQL查询之前以及对其进行验证,通常会出现SQL注入漏洞。
  • 如果攻击者能够控制发送给SQL查询的输入,并且能够操纵该输入并将其解析为代码而非数据,那么攻击者很可能有能力在后台数据库执行代> 码。

上述成因恰好印证了在CTF sql注入的实际应用:时间盲注、布尔盲注、联合查询盲注等等,都是在寻找各种办法操纵输入,让其变得可执行,可观测。

构造动态字符串

开发人员在运行过程中需要根据不同的查询标准来决定提取什么字段,或者根据不同条件来选择不同表,动态构造SQL语句非常有用。
动态构造举例:

转义字符处理不当

单引号被提前闭合,最常见的注入题目
单引号不是唯一的转义字符,因数据库管理软件不同而不同,因此熟悉数据库各种特性非常重要

类型处理不当

Web开发人员的思维模式:单引号字符是字符串的分隔符,还会被当作代码与数据的分隔线,但是,处理数字数据时,不需要使用单引号,否则数据也被当作了字符串。
看条语句:

1
$SQL = "SELECT * FROM table WHERE field = $_GET["userid"]"

!!!攻击者的输入直接被解析成了SQL语法,攻击者没必要使用单引号字符来转义查询,这时候过滤就失效了。
想到了CTFShow无过滤注入的最后一题,如果用户拥有FILE权限(一种管理员权限,root用户默认有),
MySQL的内置命令:select into outfile,直接创建了系统文件并进行写操作,逆天。
select LOAD_FILE(‘/etc/passwd’)

查询语句组装不当

开发者想好要查的东西(有应用接口产生的get参数)被替换了。

错误处理不当

出错了,并告诉怎么错。为攻击者提供了重要攻击线索

多个提交处理不当

大型Web开发的问题,有些开发人员严格对输入进行了验证,有些却不然,很难保证项目中每个人都遵循相同的标准。总会出现漏网之鱼

不安全的数据库配置

  • 理想情况下,应用应该使用不同数据库用户来执行SQL命令,类似操作系统的权限控制,即使攻击者成功将代码注入,为其分配的权限也是最低的,重要的数据都没有查看权限。
  • 实际情况是多数应用没有实现像操作系统那样很好的权限分离,因此攻击者可以访问到数据库中的所有数据,甚至在数据库间跳转
  • 实际情况还有就是开发人员在写代码时通常使用某个内置的权限账户来连接数据库,功能强大的内置用户可以执行很多与程序需求无关的操作。
  • 要实现上述目标,攻击者首先需要了解可以获取哪些附加内容、数据库有哪些、字段有什么,这就需要访问数据库的元数据-数据库内部包含的数据。
    这也就解释了SQL注入的第一步总是在查INFORMATION_SCHEMA这个虚拟数据库,因为元数据都在这里。

小结:

Q&A:

Q:找到一个网站然后对其注入单引号(‘),会被起诉吗?
A:会,这属于未授权的渗透测试行为,简称黑客行为,受法律制裁。

Q:是否可以认为禁止输入单引号,就可以避免SQL注入?
A:否,很多方法可对单引号进行编码绕过,且单引号不是唯一可以用于注入的字符

Q:如何在开发中避免出现SQL注入漏洞?
A:使用多种语言也不可避免,只要参数未经验证。而参数化查询和绑定变量是很好的办法

PS:本文中提到的参数化查询,绑定变量,链式查询和构造查询类等内容,详细见php开发部分笔记。


SQL注入理论
https://43.242.201.154/2024/09/03/sqlinjection3/
Author
Dong
Posted on
September 3, 2024
Licensed under