Abo

sql注入 (sql Injection)

对有关SQL Injection的相关介绍,主要包括原理跟实操

内容来自数据库的一次小作业,那天人类终于回想起被sql注入的恐惧,某种意义上比专业课有趣

wallhaven-132lqw

start

前言

在当今的数字世界中,人们发现在维持公开的Internet连接的同时,保护网络和计算机系统的安全变得越来越困难。病毒、木马、后门、蠕虫等攻击层出不穷,虚假网站的钓鱼行为为让警惕性不高的公众深受其害。SQL漏洞攻击是目前网上最流行最热门的黑客脚本攻击方法之一。

文章涉及知识点主要包括:

  1. sql注入原理
  2. sql注入攻击类型
  3. sql注入攻击过程
  4. sql注入危害
  5. sql注入防御方案

sql注入原理

(Structured Query Language Injection)是从正常的WWW端口访问,而且表面看出来跟一般的Web页面没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会被发觉。

SQL注入攻击是攻击者通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

sql攻击类型

content_sql.injection.types

按照注入点类型来分类

数字型注入点

许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where id=1 and 1=1

字符型注入点

网页链接有类似的结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name='admin' 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where name='admin' and 1=1 ' 我们需要将这些烦人的引号给处理掉。

搜索型注入点

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%' 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

按照数据提交的方式来分类

GET 注入

提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id 是注入点。

POST 注入

使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。

HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。

HTTP 头部注入

注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

按照执行效果来分类

基于布尔的盲注

即可以根据返回页面判断条件真假的注入。

基于时间的盲注

即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

基于报错注入

即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

  1. 单引号
  2. 双引号
  3. 基于数字型注入

联合查询注入

可以使用union的情况下的注入。

堆查询注入

可以同时执行多条语句的执行时的注入。

宽字节注入

sql攻击过程

20180330165737404

微信截图_20191019195658

微信截图_20191019195838

sql危害

  1. 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
  2. 网页篡改:通过操作数据库对特定网页进行篡改。
  3. 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
  4. 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
  5. 服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
  6. 破坏硬盘数据,瘫痪全系统。

sql预防

  1. 不要使用动态SQL(使用参数化过滤性语句)

    避免将用户提供的输入直接放入SQL语句中;最好使用准备好的语句和参数化查询,这样更安全。

  2. 不要将敏感数据保留在纯文本中(加密处理)

    加密存储在数据库中的私有/机密数据;这样可以提供了另一级保护,以防攻击者成功地排出敏感数据。

  3. 限制数据库权限和特权,确保数据库安全

    将数据库用户的功能设置为最低要求;这将限制攻击者在设法获取访问权限时可以执行的操作。

  4. 避免直接向用户显示数据库错误(错误消息处理)

    攻击者可以使用这些错误消息来获取有关数据库的信息。要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。

  5. 对访问数据库的Web应用程序使用Web应用程序防火墙(WAF)

    这为面向Web的应用程序提供了保护,它可以帮助识别SQL注入尝试;根据设置,它还可以帮助防止SQL注入尝试到达应用程序(以及数据库)。

  6. 定期测试与数据库交互的Web应用程序

    这样做可以帮助捕获可能允许SQL注入的新错误或回归。

  7. 将数据库更新为最新的可用修补程序

    这可以防止攻击者利用旧版本中存在的已知弱点/错误。