专栏首页信安之路轻松理解什么是 SQL 注入

轻松理解什么是 SQL 注入

作为长期占据 OWASP Top 10 首位的注入,OWASP 对于注入的解释如下:

将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如 SQL 注入、NoSQL 注入、OS 注入和LDAP 注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预 期命令或访问数据。

SQL 注入是最普遍存在的,也是往年危害最大的漏洞,今天我们就来简单理解关于 SQL 注入的一切。

SQL 注入的字面意思

学习 SQL 注入首先要了解什么是 SQL,在百度百科的解释如下:

结构化查询语言 (Structured Query Language) 简称 SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

从解释上来看,SQL 是用来对数据库系统进行操作的结构化查询语言,数据库存储数据,SQL 就是用来告诉数据我要什么数据,我要存储什么样的数据。

关于数据库,通常分为两类,一类是关系型数据库,还有一类是非关系型数据库,那么什么是关系型数据库,百度百科的解释如下:

关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。 当前主流的关系型数据库有 Oracle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL、浪潮 K-DB 等。

关于非关系型数据库,百度百科的解释如下:

非关系型数据库,又被称为 NoSQL(Not Only SQL ),意为不仅仅是 SQL( Structured QueryLanguage,结构化查询语言),NoSqL 描述的是大量结构化数据存储方法的集合,根据结构化方法以及应用场合的不同,主要可以将 NOSQL 分为以下几类: (1)Column-Oriented 面向检素的列式存储,其存储结构为列式结构,同于关系型数据库的行式结构,这种结构会让很多统计聚合操作更简单方便,使系统具有较高的可扩展性。这类数据库还可以适应海量数据的增加以及数据结构的变化,这个特点与云计算所需的相关需求是相符合的,比如 GoogleAppengine 的 BigTable 以及相同设计理念的 Hadoop 子系统HaBase 就是这类的典州代表。需要特别指出的是,Big Table 特别适用于 MapReduce 处理,这对于云计算的发展有很高的适应性。 (2)Key-Value。 面向高性能并发读/写的缓存存储,其结构类似于数据结构中的 Hash 表,每个 Key 分别对应一个 Value,能够提供非常快的查询速度、大数据存放量和高并发操作,非常适合通过主键对数据进行查询和修改等操作。Key-Value 数据库的主要特点是具有极高的并发读/写性能,非常适作为缓存系统使用。MemcacheDB、BerkeleyDB、Redis、Flare 就是 Key-Value 数据库的代表。 (3)Document-Oriented。 面向海量数据访问的文档存储,这类存储的结构与 Key-Value 非常相似,也是每个 Key 别对应一个 Value,但是这个 Value 主要以 JSOn(JavaSriptObjectNotations) 或者 XML 等格式的文档来进行存储。这种存储方式可以很方便地被面向对象的语言所使用。这类数据库可在海量的数据中快速查询数据,典型代表为 MongoDB、CouchDB 等。

在了解完 SQL 之后,我们来理解一下什么是注入:

注入:顾名思义就是插入的意思,在这里的意思就是在正常的 SQL 语句中,插入我们构造的语句,在获取正常结果的情况,执行我们构造的 SQL 语句获取额外的数据,导致数据泄漏。

通过实例了解 SQL 注入

在学习 SQL 注入实例之前,大家要先明白一些 http 协议的基础,比如如何通过 GET/POST/cookie 的方式向页面提交参数数据,这里就不多说了,下面就以大家最熟悉的 php+mysql 作为例子来解释 SQL 注入的过程。

我们就以最常见的 GET 来作为理解的对象,假设有一个查看个人信息的页面,链接如下:

http://www.xazlsec.com/userinfo.php?id=1

懂 http 协议的朋友肯定知道上面链接中哪个是提交的参数,是我们可以控制的并任意修改的,在浏览器请求这个链接的时候,参数 id 的值会被服务端,通过函数 $_GET['id'] 获取,正常的 sql 语句如下:

select * from users where id = $_GET['id'];

提交之前的链接后,id 的值 1 就会被带入上面的查询语句,如下:

select * from users where id = 1;

这样做也没什么不妥,功能完全实现了,但是有了这群不按常理出牌的人之后,就不安全了,平民老百姓没人去修改 url 上的参数,大部分根本不理解这个 url 是如何构成的,所以世界本来是安全的,有了这些搞安全的,世界就不安全了。

当我们把 url 改成下面这样:

http://www.xazlsec.com/userinfo.php?id=-1 union select database(

我们的参数 id 的值就变成了 -1 union select database()这时的数据库查询语句就变成了:

select * from users where id = -1 union select database()

懂数据的肯定知道上面的语句的结果,返回的结果是原本程序做不到的,这就实现了 SQL 注入。

关于 SQL 注入有两个方面,一个是 SQL 注入漏洞:

通过简单的测试,测试这个参数存在 SQL 注入利用的可能就可以说这里存在 SQL 注入漏洞

还有一个就是 SQL 注入攻击:

在确定存在 SQL 注入漏洞的情况下,通过手工或者工具的方式,将数据库中的敏感信息 dump 出来或者利用数据库的特定获取系统的权限,这是一个利用的过程,在如今法律如此严格的情况下,在做渗透测试的时候,切记不要做这一步。

SQL 注入如何防御

从上面的例子可以看出,我们的参数是通过拼接字符串的方式进行的,在写 php 代码的时候,通过 $_GET['id'] 获取到参数值之后直接拼接到了 SQL 查询语句的后面,不过你提交的参数是什么都被当作 SQL 语句来执行了,那么我们如何解决这个问题呢?

如今为了解决 SQL 注入的问题,从一开始的过滤到现在使用的数据库操作的库,使用参数化查询的方式,将用户输入或者参数的值全部当作字符串来处理,不管你输入的是什么,在 SQL 查询语句中,你就是一个字符串,这样你构造的查询语句就被当作字符串来处理了,语句不被执行也就不会存在 SQL 注入的问题了。

俗话说,只要是用户输入的都不可以信任,一个系统用户可控的参数千千万,只要有一个地方疏忽,那你之前做的一切就前功尽弃了,扩展一下,不仅仅是用户输入的不可信,只要是数据可以伪造的都不可信,比如 http 协议里的 Referer/user-agent 等。

总结

说了这么多废话,这个文章的目的就是让一些没什么基础的人了解一下大家常说的 SQL 注入相关的东西,从上面的描述可以看出,想要学习 SQL 注入,最起码的 http 协议是要学的,不同数据的查询语句以及数据库特性也是需要了解的,一个网站的数据处理流程也是需要了解的,在有基础的情况下,了解 SQL 注入的原理,然后就是进阶阶段,以前的大佬经常发的文章关于绕过什么的,慢慢积累就可以了。

推荐阅读

我们来聊一聊渗透测试

轻松理解什么是 webshell

本文分享自微信公众号 - 信安之路(xazlsec),作者:myh0st

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 近期关于代码审计的学习总结

    这一小段时间对一些 CMS 进行代码审计,和一些 CVE 分析复现。总结一下几个案例的问题产生原因和利用思路。由于能力有限,挖掘到的都并非高危漏洞,旨在总结一下...

    信安之路
  • webgoat-Injection

    注入攻击是WEB安全领域中一种最为常见的攻击方式。在“跨站脚本攻击”一章中曾经提到过,XSS本质上也是一种针对HTML的注入攻击。而在“我的安全世界观”一章中,...

    信安之路
  • 代码审计之 zzzphp

    想想很久都没有发布代码审计的文章了,最近忙于开发任务加上最近状态不太好,哎研发dog。

    信安之路
  • 5个最好的在线学习的SQL和数据库课程

    大家好,如果您是计算机科学专业的毕业生或者刚刚进入编程世界,并且有兴趣学习SQL并寻找一些很棒的资源 - 例如书籍,课程和教程 - 那么您就来对了。在过去,我分...

    February
  • SQL Server入门

    SQL Server是由Microsoft开发和推广的以客户/服务器(c/s)模式访问、使用Transact-SQL语言的关系数据库管理系统(DBMS),它最初...

    fireWang
  • 7张图学会SQL

    很多朋友平时处理数据可能更熟悉Excel,提到SQL就想逃避,殊不知SQL在处理大量数据时有Excel无法比拟的优势。而且根据二八定律,其实只需掌握20%SQL...

    猴子聊数据分析
  • 【DB笔试面试822】在Oracle中,AWR报告中主要关注哪些方面内容?

    该部分位于AWR报告的头部,如下图所示,需要特别关注DB Time和Elapsed的比值:

    小麦苗DBA宝典
  • 7张图学会SQL

    很多朋友平时处理数据可能更熟悉Excel,提到SQL就想逃避,殊不知SQL在处理大量数据时有Excel无法比拟的优势。而且根据二八定律,其实只需掌握20%SQL...

    猴子聊数据分析
  • 一个"TOP SQL"类产品的构想

    作为一名DBA,SQL优化是工作中必不可少的部分。如何快速、准确的发现待优化的语句,是DBA经常需要考虑的问题。很多数据库都内置有慢查询、SQL报告等能力,这也...

    用户5548425
  • 直播回顾 | 亿级并发丝毫不虚,TDSQL-SQL引擎是如何炼成的

    腾讯云数据库国产数据库专题线上技术沙龙正在火热进行中,3月19日唐颢的分享已经结束,没来得及参与的小伙伴不用担心,以下就是直播的视频和文字回顾。

    腾讯云数据库 TencentDB

扫码关注云+社区

领取腾讯云代金券