基于SQL注入的攻击与预防
摘要:信息,作为一种对当下社会发展起到越来越重要作用的资源,在信息化时代来临之际,已经具备了战略上的重要意义,而如何对这种资源进行收集、占有和有效利用,也已成为当下社会和国际社会的焦点内容,针对这一焦点内容所产生的竞争和斗争行为也层出不穷。如今,对于维护国家安全、促进社会经济发展、保证社会稳定来说,信息已成为一把双刃剑,当其安全性能够得到有效保证时,能够对发展稳定起到促进作用,反之,则有可能造成威胁。因此,有关于其的安全保证问题,已成为当今人们越来越关注和迫切需要解决的问题。准确地说,没有信息安全就没有国家安全。网站作为信息资源的主要载体,会受到攻,威胁到整个系统。因此,构建安全的信息发布平台显得尤为重要。
通过web网站,人们可以随时随地了解全国乃至整个世界正在发生的事情。便利的网络服务不仅吸引了广大的网站用户,同时也吸引了许多的能人异士,但并不是所有人都具备了忠义的精神,有些人会通过破坏或恶意攻击来提高他们的能力,或者实现一些不可告人的目的。这些人,我们称之为黑客。当越来越多的网站遭到黑客行为的破坏时,网站对于相关信息的保护就无法得到保证,即其网站安全性遭到了破坏。采取技术措施,以及管理控制行为,来对信息数据进行处理,以保证其在网站环境中的能够具备完整性,并拥有保密性和可用性,是一般意义上所指网站安全的主要含义。而对其内容的解释一般包含两个方面:一是网站服务器硬件和服务器系统软件的安全,二是网站的信息安全。
然而,大多数web系统都存在数据交互的安全问题。攻击者利用网站与数据库交互中出现的安全漏洞,进行越权访问原本无法访问的目录或者文件,并获取一些数据。更有甚者,能直接获取整个网站甚至整个系统管理员的权限。在实现这些目标的过程里面,采用特殊方式实现对SQL(Struction Query Language,结构化查询语言)的注入以达到攻击目的,是直接性最强、破坏性也较大的一种方式,而正是在其具有简单、直接、有效的破坏效果、以及对SQL语言的使用越来越普及的基础上,采用SQL注入的方式实现攻击目的,已成为在web诸多攻击技术中最常见的一种。
自其首次被应用到网络攻击至今,20多年来,SQL注入攻击已经成为兼具常用性和有效性的,基于web的最为危险的攻击形式之一。所谓的SQL注入攻击,顾名思义可以解释为,在用户参数范围内,黑客利用其可控部分并将SQL语句注入到其结构当中,使其原本SQL结构状态被颠覆破坏,在此情况下造成开发人员在编写程序时意料之外的结果的攻击行为。
本文将通过以SQL针对网站的具体攻击形式和影响,以及如何对其进行预防等两方面内容展开讨论,进行具体研究。其中包括对SQL注入的各种方式形式,以及对存在sql注入的web站点所连接的数据库的判断。它包括多种注入方式,如联动查询注入、ascii逐步排查法注入、报错注入、cookie注入、布尔注入、时间注入、宽字节注入,并会以各种数据库相联系,逐一做出相应的例子。
关键字:SQL注入;MySQL;盲注;编码类型
SQL injection attack and prevention
Abstract: The arrival of the information age means that information has become an important strategic resource for social development. The struggle around the collection, acquisition, utilization and control of information is also showing a growing trend. Information security has become a major issue affecting national security, socioeconomic development and social stability. Information and network security issues have become issues that people are increasingly concerned about and urgently need to solve. To be precise, there is no national security without information security. As the main carrier of information resources, the website will be attacked and threaten the entire system. Therefore, it is particularly important to build a secure information publishing platform.
Through the web site, people can understand what is happening in the whole country and even the whole world at any time and any place. Convenient network services have not only attracted a large number of website users, but also attracted many talented people, but not everyone has the spirit of loyalty. Some people will improve their abilities through sabotage or malicious attacks, or Achieve some ulterior motives. These people, we call them hackers. When more and more websites are attacked by hackers, the safety of the websites is seriously threatened. The meaning of website security mainly refers to the use of technical measures and management control to protect the integrity, confidentiality and availability of information data in the website environment. The security content of the website has two main aspects: one is the security of the website server hardware and server system software, and the other is the information security of the website.
However, most web systems have security issues with data interaction. Attackers use security vulnerabilities in the interaction between the website and the database to gain unauthorized access to directories or files that were otherwise inaccessible and obtain some data. What's more, you can directly obtain the permissions of the entire website or even the entire system administrator. In the process of achieving these goals, the most effective attack method is SQL (Struction Query Language, Structured Query Language) injection attack. Due to the widespread use of SQL language and the simple SQL injection method, the harm is huge. Make SQL injection attacks the mainstream web attack technology.
SQL injection attacks have been around for more than 20 years and are one of the most commonly used, dangerous, and most effective web-based attacks. The so-called SQL injection attack refers to an attacker who uses the user-controllable parameters to inject SQL statements to destroy the original SQL structure, thereby achieving the unexpected behavior of developers when writing programs.
This article focuses on the attack and prevention of SQL injection on websites. It mainly includes various injection methods of SQL injection and judgment on the database connected to the web site where SQL injection exists. It includes a variety of injection methods, such as linkage query injection, ascii step-by-step troubleshooting injection, error injection, cookie injection, Boolean injection, time injection, wide byte injection, and will be connected to various databases to make corresponding examples . Key words: SQL injection. MySQL; The blinds; The encoding type;
目录
第一章:绪论9
1.1 课题背景9
1.2 SQL注入技术现状12
1.3 课题研究内容与章节安排13
第二章:SQL注入攻击基本理论16
2.1 搭建web环境技术概述16
2.1.1 结构化查询语言16
2.1.2 PHP语言16
2.2 SQL注入攻击概述17
2.2.1 常见注入点分析17
2.2.2 SQL注入攻击目标17
2.2.3 SQL注入的攻击特点18
2.2.4 存在SQL注入的根本原因18
2.3 SQL注入判断数据库类型19
2.4 章节摘要20
第三章:基于注入MySQL数据库的需求分析21
3.1MySQL数据库概述21
3.2需求分析方法选择23
3.3 SQL注入攻击流程23
3.3.1 猜测sql语句的构成25
3.4 获取数据需要的SQL语句26
3.4.1 order by26
3.4.2 union28
3.5完成建模后的注入29
3.5.1 order by和union的联系使用29
3.6完整获取整个数据库的过程31
第四章:通用SQL注入手法的研究35
4.1 SQL注入的各类手法分析35
4.2 显错注入35
4.3 报错注入35
4.3.1 报错注入的使用存在场景35
4.3.2 报错注入常用函数36
4.4 盲注37
4.4.1 布尔盲注37
4.4.2 时间盲注39
4.5 Head头注入40
4.5.1 Head头注入的存在场景及注入攻击方式41
4.6宽字节注入42
4.6.1 宽字节注入常用函数43
4.6.2 宽字节注入存在场景44
第五章:基于SQL注入攻击的通用防注入研究46
5.1 如何进行SQL注入的补救和预防措施46
5.1.1 SQL注入的补救措施46
5.1.2 SQL注入的预防研究46
5.2 针对SQL注入的防范方法48
5.3 结论50
5.4 本章小结50
第六章:结束语51
参考文献:52
致谢53
第一章:绪论
1.1 课题背景
作为一种对当下社会发展起到越来越重要作用的资源,在信息化时代来临之际,信息资源已经具备了战略上的重要意义,而如何对这种资源进行收集、占有和有效利用,也已成为当下社会和国际社会的焦点内容,针对这一焦点内容所产生的竞争和斗争行为也层出不穷。如今,对于维护国家安全、促进社会经济发展、保证社会稳定来说,信息已成为一把双刃剑,当其安全性能够得到有效保证时,能够对发展稳定起到促进作用,反正,则有可能造成威胁。因此,有关于其的安全保证问题,已经成为一个极具讨论和研究意义的课题和备受关注的重点问题。从当下信息技术在人群、社会以及国家相关事务中的应用情况来看,可以说,信息安全已经同国家安全紧密联系在一起。网站作为信息资源的主要载体,会受到攻击,威胁到整个系统。因此,构建安全的信息发布平台显得尤为至关重要。
通过web网站,人们可以随时随地的了解整个国家乃至整个世界发生的事情。便利的网络服务在吸引了广大的网站用户使用的同时,也招来了许许多多的能人异士,但这些人却并不是都具备有忠义精神,有些会以破坏或者恶意攻击来提升自己的能力,或者达到一些不可告人的目的。这些人,我们称之为黑客。当越来越多的网站受到黑客的攻击时,其破坏性效果就会使得网站对于相关信息的失去保护原本设定的作用,即其网站安全性遭到了破坏。采取技术措施,以及管理控制行为,来对信息数据进行处理,以保证其在网站环境中的能够具备完整性,并拥有保密性和可用性,是一般意义上所指网站安全的主要含义。而对其内容的解释一般包含两个方面:一是网站服务器硬件和服务器系统软件的安全,二是网站的信息安全。
本文将以信息安全作为主要关注点进行研究讨论。
早在二十世纪末,作为IIS(Internet Information Server)的一个组件,ASP(Active Server Pages,活动服务器网页)就已经被诞生出来,这主要得益于微软公司在技术上的创新和研究。这一研究有关web方面相关技术的研发和创造,对于ActiveX和HTML来说,它的出现使得用户可以充分利用二者功能,自主进行web相关活动开发,在这一过程中自主建立应用程序,并赋予其脱离平台的独立性。得益于这些优势,ASP大受欢迎并很快得到普及。在这种情况下,国内外大部分的新闻和BS网站都在对开发设计的选择上以ASP作为优先考虑对象,与之类似的是,在信息查询、电子商务等相关内容的网站上,ASP相关技术也得到了广泛使用。在网站技术平台的构建上,为了达到安全、稳定和高效的目的,可以借助IIS+ASP+Access数据库的功能,另外,mssql数据库对实现这一目的也很有帮助,而在此类过程中,ASP技术方便上手、简单快捷和富有高效性等特点,使得它的作用尤为重要。在此基础上,运用此类技术开发的网站,往往也因其具有实用性强、容易上手、方便快捷、保证源代码隐秘性的优点,而大受欢迎,尤其是在web开发领域,为相关技术活动人员所赞誉,其高效性和快捷性让其得以有构建动态网站的最佳工具之称。
然而,大多数web系统都存在着数据交互的安全问题。攻击者可以利用网站与数据库交互中的的安全漏洞,进行越权访问原本无法访问的目录或者文件,并获取一些数据。更有甚者,能直接获取整个网站甚至整个系统的管理员权限。在实现这个需求的过程中,最有效的攻击手段就是对SQL(Struction Query Language,结构化查询语言)的注入攻击方式。由于SQL的应用群体广阔,且SQL注入在应用上具有:门槛低,易上手,操作便捷和破坏性强等特点,而正因为这些优势的存在,使得在web攻击诸多技术手段中,其一直是最为常用和最为有效的手段。
自其首次被应用到网络攻击至今,20多年来,SQL注入攻击已经成为兼具常用性和有效性的,基于web的最为危险的攻击形式之一。其具体内涵顾名思义可以解释为,在用户参数范围内,黑客利用其可控部分并将SQL语句注入到其结构当中,使其原本SQL结构状态被颠覆破坏,在此情况下造成与开发人员在程序结果的原有预期上产生极大偏离的情况,即实现攻击行为之破坏效果。
通过寻找能够对SQL实现注入可能的漏洞,黑客运用其特殊手段偷入数据库,实现对其储存内容的窃取,尤其是其中的机密信息如管理员的后台密码等,借此实现对其机密内容在原有库中的脱取(脱库)。除此之外的情况中,其还能通过对数据库内容进行修改的方式,或者直接将损害内容嵌入到数据库中的方式,来达成上述目的。而若在权限分配上,数据库存在缺陷,或者数据库本身系统安全性即存在缺陷等情况发生时,就更为黑客对webshell或者服务器系统权限的获取提供了便宜,使其可以更为便捷的实现SQL注入,直接对数据库重要内容实现窃取。有关SQL注入,早在《Phrack》 中的一篇文章中就有对其相关攻击技术在应用过程中具体形式的研究,具体表达的是作者Rain Forest Puppy(RFP)的观点。这篇文章即《NT Web技术漏洞》 ,是对这方面内容进行的首次涉及的讨论。然而其中有一点可以受到关注,即当时在现在十分普及的SQL注入的相关称呼在其内容里尚未被创造出来;而对这一指令在作为网络攻击形式时所能起到的具体破坏效果进行首次讨论关注的,则是在《动态查询中的多种SQL指令》有关内容中,这实际上是一篇有关安全性维护的宣讲,用于广泛告知相关人员,是由Allaire发出的;而紧随其通告发出之后,类似性质内容《NT ODBC远程危害》也被发出,在RFP与Matthew Astley共同发出的这份内容中 ,在涉及到SQL的有关内容中,就针对其的语句查询内容,如何实现VBA代码对access数据库的注入作用,进行了相关探讨研究和解释说明;另外在其相关领域的另一篇文章,《我是如何渗透Packetstrom网站的——SQL注入渗透wwwthreads应用程序一瞥》中,就如何利用SQL语句实现在wwwthreads中,对其相关应用程序出现的漏洞的破坏性注入,以在控制权上实现有关数据库在服务器上的转移,;紧随其后的是,在《评估IIS上的应用》的相关内容中,David Litchfield针对如何针对数据库服务器,实现对其破坏性攻击,并在诸多方式中重点对SQL插入技术的相关应用形式进行了讨论,其中主要涉及到在这一方式中对ASP应用程序的利用形式的具体化介绍,这篇内容首次出现是在欧洲峰会的相关演讲内容当中;接着,在《SQL注入FAQ》中,Chip Andrews 对于“SQL注入”这一称呼术语化做出了贡献;之后,在《通过 ODBC 错误信息远程分解 Web 应用程序》这一内容中,在Blackhat会议的相关演讲内容中,对这一攻击技术的最新形式进行了具有前沿性的最先报告,在对其运用的具体作用效果的形容上,提出对于数据库的架构,该技术可以实现较为清晰的复制性窃取。在其之后的理论发展中, 在《针对 SQL Server 的高级 SQL 注入》的相关讨论研究内容中 ,Chris Anley提出的观点在对这一攻击方式的研究上也十分具有参考意义和前瞻性,为研究推进和理论发展提供了帮助;之后在《更为先进的 SQL》相关内容中,作者又对其之前提出的观点和内容进行了更多的细节和理论发展上的有效补充;另外,在之后的 Blackhat会议上,SQeaL得以出现,为实现SQL 注入提供了有力的助力,这一工具的诞生则得益于0x90.org 的研究和其对这一研究成果的分享 ;自此之后两年间的发展过程中,SQL 注入攻击的形式被实际应用的概率逐年提高,同其他类型相比呈现明显的在选择性上的偏重。更在之后不到三年的时间里发展出了更新型更具破坏效果和范围的攻击形式;而在现实情况中,有关报道中的事例和现象也开始层出不穷,如零八年五月发生的网站大规模受到攻击的现象,在这一事件中,国内超过万数网站受到最新波次的攻击浪潮的影响,这次攻击直接导致广泛遭受挂马的情况;另外再零九年十二月的有关事例报道中,据外媒消息称,在互联网安全领域具有重要权威,并主要开展安全监视工作的公司 ScanSaf 认为,区别于一般形式,更具特殊性和破坏性和更加精密危险的有关SQL 注入的攻击新形式,已经在广泛范围内产生了巨大影响,并使得十数万网站受到安全性影响[1]。
广泛性、低门槛性、不易被防御破解的稳固性和灵活性上的优势,使得这种攻击形式越来越得到广泛使用,在已知可完成网络安全破坏的手段中,是最为常见和有破坏力的一种。而在当前态势中,相关的能起到辅助攻击作用的程序或者软件的开发也应用也呈现不断增长趋势。不仅如此,其在方便性快捷性方面的不断提高,又为这种攻击方式的有效性和广泛应用起到了越来越大的推进作用。在造成的损害结果上,这种攻击方式的有效性主要体现在:恶意破坏者可以利用其作用获取对数据库中的数据进行第三方擅自变动的权利,通过这一过程实现对相关涉及他人利益的保密信息的安全性的破坏和内容窃取,即使在权限上,它也可以通过更加有力的运用挤占原本管理者地位,窃取其可执行力。如果针对系统,在命令的执行上,相关攻击行为使用者能够对SQL 以及Server扩展存储过程进行相关注意,或者在侧重方面上向自定义扩展存储过程进行稍微偏移,那么这时往往会起到更加显著的破坏作用和效果,这种行为造成的后果往往之际导致系统在控制权上的偏离,使之落入破坏者手中。不但如此,要杜绝这种方式对信息安全性的破坏几乎是不可能的,下这种论断的原因在与其一般的进入方式主要是通过端口进行的访问形式,一般通过对W后缀网点的端口访问来实现,这在形式上很难将它与一般的Web页面的访问形式区分开来,基于这种情况,在此种类型攻击行为发生时,一般的防火墙都不会对其进行辨认拦截,而要想实现自我保护,以系统补丁方式进行安全网构建,或者以配置方式进行安全加固的方法都变得不可行,管理员行为的有效性会大大受到限制。更何况,如果对IIS日志不够重视,做不到时时关注,那么管理员往往不会很快发觉自己的信息数据遭到了窃取和安全性的破坏。 那么要想应对这种情况,如何针对此类攻击行为,形成一种有效的防御机制,来为信息的安全性提供保障,则成为一个亟待解决的问题。为了实现对其有价值的研究,在这篇文章相关内容里对:以这种形式造成破坏效果的基本原理,相关攻击形式的具体性质,和特殊字符的过滤,等方面内容展开探讨,开展相关研究,能够对现实问题的处理起到一定参考作用。
1.2 SQL注入技术现状
此类技术首次在我国相关领域出现并开始发展泛滥,主要是在自其首次诞生以后的四年左右时间内。一般情况下,这种方法或者形式的具体内涵是指:通过对此类技术的相关应用,以实现对目标网络信息安全性的破坏或内容窃取,并且,对于注入漏洞的具体形式则通常解释为针对能够实现注入的网站,或者具备同类性质的相关程序,具备进行此种形式注入的可能,即它们可用“漏洞”来形容[2]。从本质来讲,用漏洞来形容此种注入形式也是恰当的,因为针对Web相关应用程序来说,在其有数据库连接的情况下,即存在这种形式实现的可能,并能够通过相关结构语句,在语法处理属于相关应用程序中所需条件时,对其进行输入,以实现在对相关应用中的,具有预定义性质和请求性质的相关结构语句的结构及表意的变更。通过蒙蔽数据库所在服务器的对相关命令的辨别,作为黑客的行为者能够使其按照自己意愿进行相关查询,即使这种查询并非来自正常的命令渠道,这一过程产生作用的条件即在于获取相关命令权使其他使用者在进行有关请求操作时,能将其查询条件插进相关语句内容里,然后由相关数据库服务器来对这一过程进行处理和应用其已被改变的命令。黑客们正是在这些用自己非法手段进行了含义扭曲的输入语句里,拥有了对相关请求进行控制的权利,以此实现对重要信息的窃取。正是基于这种情况,这种黑客行为往往能在,相关应用程序的代码组成存在问题时,即其对相关语句在进行传入时所显示的有关自身性质的数据,缺乏有效的处理和筛选辨别时,体现黑客行为对同类基础条件下的数据库信息安全性的普遍破坏作用和威胁性,其中可在SQL Server上得到具体体现,另外对于MySQL、Access来说也有很大威胁。尽管该领域的研究人员提出了各种防御SQL注入攻击的手段和方法,但这些方法或多或少无法处理当前的所有问题,或者在使用上有一定的局限性。 如图1-2-1所示,从2017年度的 owasp top10漏洞排名来看,top10榜首常年被SQL注入占据,这表明SQL注入是一个巨大的威胁。
添加图片注释,不超过 140 字(可选)
图1-2-1 2017年度OWASP top10漏洞榜单
1.3 课题研究内容与章节安排
在对此类攻击行为的防御上,应该采取怎样的能起到切实作用的方法或者系统机制,是此课题内容得以体现其参考意义和借鉴价值的侧重重点内容。在切入上,先从其背景方面进行相关介绍,以及对其发展历程做一个简单回顾,接着总结当下阶段对这一问题的解决情况,对其相关形式的特点,以及造成破坏性的原理,和应用过程中的具体手段,也进行了讨论,并在Apache+PHP+Mysql的相关应用中,在相关系统结构内加入了其注入可能。最后,针对这种注入的防御,在对相关理论知识有了充分理解的情况下,本文作者有进一步的意见和建议。此课题中进行的分析讨论可以概括为这些内容:
-
在相关架构方面和注入点方面,进行了当下态势下对其应用的相关普遍形式的研究,在相关形式语言,以及注入技巧方面,对SQL的相关内容进行了解释说明,对PHP 相关内容也有涉及。
-
对于其攻击技术的相关方面进行了具体讨论,针对其破坏效果得以实现的原因和方式、性质,以及在在现实中使用较为较为普遍的形式,做了相关解释说明,包括其破坏行为进行的具体过程,以及对具有具体区别的相关类型的分门别类的介绍。
-
针对此类攻击形式的防御方面,对其较为有效的防御方式进行了探讨,并对其行为进行过程中所采取的手段的具体形式、有关程序公式结构中的函数做了观察和说明 ,并对这些内容中所体现的、对防御实现的帮助作用,做了一个统合整理于,由此试拟定一个新的可以被普遍应用的防御系统的模型。
在结构方面,对不同部分的讨论内容,本论文做了如下形式的划分:
第一章 在发展前景、应用的普遍性及范围以及其攻击形式的破坏性上,分别对网络技术方面、Web网站以及SQL进行了研究探讨和相关内容的说明,另外针对这些问题在网络安全的保障手段和具体应用上提出了观察性看法和建设性意见,在总结这些内容的基础上,使读者对本篇文章相关研究内容和观点提出的背景与社会实际态势,能有一个大概的了解。
第二章 在相关体系的建设和组织结构方面,以及相关内容的传输过程等方面,分别对在Web范围内的相关网络平台和数据的应用处理进行了观察探讨,使读者能够在此基础上认识结构化查询语言,对其具体功能和相关应用有一个大体了解。并且,又对当前态势下相关注入的形式进行了针对其最具备普遍性之种类的相关内容说明。在破坏目的和对象、效果得以实现的根本原因以及相关性质等方面,对本课题的主要研究对象进行了细致入微的观察,以及不遗巨细的对相关问题的说明,在这些情况下,使得读者得以了解到本篇文章研究的重点问题之所以存在并如此凸显,在其源头上,是怎样具备并具备了哪些基础条件的。
第三章 对MySQL数据库进行概述及对SQL注入的流程进行建模解析。介绍了如何组成SQL语句和一些函数的作用。并进行了模拟攻击试验。
第四章 研究并实现了SQL通用注入手法。首先分析了各类SQL手法存在的不同场景。并开始对各类手法的区别以及在不同环境所对应的SQL注入攻击方式。通过实例进行模拟攻击,讲解每次攻击中的攻击点以及攻击后所带来的危害。
第五章 在相关信息安全性的保障手段,以及针对破坏性行为的实施过程和其破坏性结果产生时的应对方法给出现实情况参考和相关建设性意见,以及对前面内容起到总结概括作用,得出自己对SQL注入预防的最佳途径。
第六章 总结,对本课题开展的主要内容、过程、作用和意义进行精确提炼,并在反思中发现和指出本课题开展过程中在眼界和处理方式上的局限,为之后的进一步研究提供参考,以期制定更加完善的计划。
第二章:SQL注入攻击基本理论
2.1 搭建web环境技术概述
关于本次研究的环境搭建,这个小节进行介绍。本次研究的环境,将以phpStudy工具搭建一个集成的环境。Phpstudy是为PHP调试环境而诞生的程序内容的集成包。该集成包中包含有最新的服务器和数据库版本,采用一次性傻瓜式安装,安装后立即使用,还可以根据自己的需要进行配置,因此有大量开发人员使用phpStudy对自己的程序进行调试。除此之外,phpStudy中也包含PHP的开发手册和工具,十分便于学习者学习。在本研究中,以PHPstudy作为集成环境,构建具有sql注入漏洞的代码的网站。
2.1.1 结构化查询语言
SQL注入的主要核心是以SQL语句为突破点,在这里先对SQL语言做一个介绍。SQL的全称是结构化查询语言(Structured Query Language),用于对数据库中的数据进行查询和更新,也可以作为程序设计语言编写数据库脚本文件,脚本文件的后缀名也是sql。SQL有自己的语法标准,该标准于二十世纪八十代经美国国家标准局和国际标准化组织批准通过,并成为了关系数据库语言的国际标准(ANSI X3. 135-1986)。但是在实现该标准时,各类数据库系统都做了一些完善和扩充,与原始标准有所差距,因此不能直接将一种数据库系统的SQL直接移植到另一种数据库系统中。
SQL语言在渗透这一领域,多使用为SQL数据操作语言(DML),即增删改查。分别对应为:
INSERT INTO 语句——增加数据库表中的数据
DELETE 语句——删除数据库表中的数据
UPDATE 语句——修改数据库表中的数据
SELECT 语句——查询数据库表中的数据
2.1.2 PHP语言
PHP是超文本预处理器(PHP: Hypertext Preprocessor)的简称,是一种开源的脚本语言,常用于网站后端编程,语法与C语言类似,但是也包含了Perl和Java语言中的一些语法规则,还有一部分语法规则属于PHP自创。PHP的使用十分简单,植入性也强,有很多人在使用[9]。最常见于Web开发,它还可以扩宽链接面并与各类数据库连接。本次研究的核心代码也是PHP。
2.2 SQL注入攻击概述
顾名思义,SQL注入攻击就是把SQL命令语句注入到攻击入口实现攻击目的,攻击入口主要是Web表单以及URL中的查询字符串,攻击目的是欺骗服务器让其执行攻击者插入的SQL命令语句。以Web表单为例,如果网站存在SQL注入漏洞,攻击者可以在Web表单中输入不符合网站设计者期待的SQL语句,该语句可以在后台数据库引擎执行,攻击者就可以获得超出本身获取权限的数据。
SQL注入攻击引发的后果受到后台数据库设置情况的影响,如果管理员对数据库的设置相对安全,那么攻击者可能提取到管理员的后台密码,从而获得数据库中全部内容(脱库);如果设置出现问题,比如进行了错误的权限分配,或者数据库版本过低,攻击者甚至可以直接获得服务器的系统权限。
2.2.1 常见注入点分析
从数据类型上分析,可以分为数值型注入点和字符型注入点。数值型注入点,通常为改变数字(比如1、2等)以实现注入。而字符型注入点,则比较繁杂,可为字母a、单引号’、双引号“、括号()、井号#等符号。当每一种注入点可改变时,注入的方法就越来越复杂,例如#在SQL可为注释,但也可以用"-- zyh"表示。数字类型可转换成16进制能让计算机识别。字母类型可用base64转码使得计算机能够识别。当可转换的类型丰富多样时,也就意味着突破点也越来越多。
2.2.2 SQL注入攻击目标
SQL注入攻击的直接攻击目标毋庸置疑就是数据库,有些攻击者会以数据库为中介,获得数据库所在服务器的权限。数据库(database)是数据的仓库,数据库中的数据按照特定的规则组合在一起,形成数据集合,各种数据集合会保存在磁盘形成数个文件,这些文件在一起形成了数据库。
在创建动态网站时,必须使用数据库对网站信息进行保存,这些信息包括发布在网站上的文章内容、在网站注册用户信息,如果是电商网站,还会保存商品信息。因此数据库对网站的正常运行十分重要,就像是存储器对于电脑,没有存储器的电脑相当与一个空壳,而如果数据库被破坏,网站也无法继续运行,甚至整个服务器都会瘫痪。
2.2.3 SQL注入的攻击特点
在网络攻击的世界里,SQL注入攻击占据了十分重要的一个位置,它有以下几个特点:
-
访问无异常。普通用户在访问网页时,访问的是服务器的80端口,而这个端口也是攻击者进行SQL注入攻击的端口,因此在对网站进行访问时,攻击者和普通用户并没有什么区别,防火墙不会对攻击者的访问行为向管理者发出警报。
-
使用范围广。上面提到,动态网站必须使用数据库,而作为国际标准,数据库的访问几乎都使用SQL语句,这就为SQL注入攻击的发展提供了温床。一旦服务器管理者在编写相关页面代码时没有严格对输入进行验证,就可能存在SQL注入漏洞。
-
应用门槛低。对网站进行SQL注入攻击并不难,原理的学习也很容易。目前市面上存在很多编写好的SQL注入工具,即使是初学者,也可以凭借这些软件对网站进行SQL注入漏洞的测试以及攻击。常见的工具软件有sqlmap、HDSI等。
-
攻击危害大。网站存在SQL注入漏洞,相当于管理者向攻击者敞开了访问服务器的大门,攻击者可以利用SQL语句在服务器内部执行命令,根据权限不同,攻击者可能篡改信息,留下后门甚至控制整个服务器,对网站的正常运行带来影响,甚至直接让用户无法访问网站。
2.2.4 存在SQL注入的根本原因
存在SQL注入漏洞的根本原因,在于网站开发者在编写网页代码时,没有对代码进行认真检查,导致代码不规范[5]。在程序开发过程中,开发者不注重代码的编写标准,不严格的检测输入和过滤SQL语句和关键字,并且不专门过滤和阻止常见的输入框和url。因此,客户端可以通过全局变量get或post或者cookie/user-agent等参数向服务器端提交已经更变后的sql语句,引发SQL注入攻击。
2.3 SQL注入判断数据库类型
在整个SQL注入流程中,攻击者最先应该做的是确定服务器使用的数据库类型,确定了数据库类型后,攻击者就可以决定具体的SQL语法了。服务器常用的数据库类型有:MySQL、Oracle、Access以及SQL Server等。根据各种数据库中存在的特有属性和语法规则,我们可以对数据库类型进行判断。在SQL Server和MySQL中,MySQL是可以用version()或@@version来返回当前版本信息,如图2-3所示。但SQL Server也是可以使用@@version来返回版本信息的。所以,当我们输入version()>1和@@version>1时,可根据返回的结果进行判断,如果结果相同,则是MySQL,如果出现version()错误时,则为SQL Server。也可以通过注释来判断,MySQL的注释是“#”或者”-- ”(双减号加空格),而SQL Server的注释为”--”(双减号),这种方法在注入时通常特别有用;Access数据库的判断方式比较特殊,攻击者可以在注入点输入数据时,在末尾添加一个单引号,根据返回的错误信息判断数据库类型,如图2-3-1所示,如果返回的错误信息包含“Microsoft JET Database Engine错误‘80040e14’”字符串,说明服务器使用的是Access数据库;判断服务器使用的是否是Oracle数据库,方法很简单,在大多数数据库类型中,分号表示一个语句的结尾,但是因为Oracle数据库不支持多行查询,所以如果攻击者在查询语句中添加了分号,会返回错误信息。可以直接判断。由此,可直接判断出它到底是哪种数据库。
添加图片注释,不超过 140 字(可选)
图2-3 MySQL输出版本信息
添加图片注释,不超过 140 字(可选)
图2-3-1 Access数据库判断
2.4 章节摘要
本章介绍了SQL注入研究所需要的环境,对用户访问网站数据库时需要的SQL语言进行了介绍,同时介绍了SQL注入的攻击目标和特点,分析了SQL注入漏洞存在的根本原因。同时描述了常见的数据库中SQL注入的类型判断,为接下来的SQL注入研究做准备。
第三章:基于注入MySQL数据库的需求分析
3.1MySQL数据库概述
5.0版本之后的MySQL数据库有一个很利于攻击者的特点,它添加了一个信息数据库information_schema,这个数据库保存有服务器中所有其他数据库的信息,由系统自带,如图3-1所示。这就意味着,只要攻击者检测到存在SQL注入漏洞的服务器使用了MySQL数据库,就自动得到了一个数据库名,而且这个数据库还存有关于其他数据库的信息,通过information_schema数据库,攻击者可以查询到更多信息,如图3-1-1所示,具体信息如下:
通过schemata表里面的schema_name字段或者tables表和columns表里面的table_schema字段,攻击者可以获取到服务器中所有数据库的库名;
通过tables表或者columns表里面的table_name字段,攻击者可以获取到服务器的数据库中存在的所有表的表名;
通过columns表的column_name字段,攻击者可以获取到服务器数据库的所有表中的所有列名。
如图3-1-2所示,可用 “select schema_name from information_schema.schemata;” 进行查询 ;
添加图片注释,不超过 140 字(可选)
图3-1MySQL的imformation_schema表
添加图片注释,不超过 140 字(可选)
图3-1-1数据库information_schema中的所有表
添加图片注释,不超过 140 字(可选)
图3-1-2 MySQL查询语句
3.2需求分析方法选择
MySQL数据库作为搭建环境的数据库,使用带有SQL注入漏洞的PHP代码来实现测试攻击,首先进行的测试是显错注入和报错注入,之后会测试盲注,最后测试Head头注入和宽字节注入。在讲解到每一种注入方式的时候,都会有对应的环境和对应的注入方式进行攻击。从攻击过程中,演示SQL的原理和漏洞的存在。实现最终实现通过原理上预防的措施。
3.3 SQL注入攻击流程
想要找到SQL注入攻击的注入点,应首先确定网页中用户可以提交数据的地方,如图3-3-1所示,页面中英文的意思是让用户输入一个数字作为ID参数,然后会显示出我们需要的页面。 如图3-3-2。这边测试环境是为了方便,所以显示了用户的账号与密码。当到了这一步的时候,就是整个注入攻击的开始,从输入id的值页面存在页面变化可以了解到id=1这里存在与数据库交互的地方,作为黑客,会在id=1的地方输入一些代码去判断是否存在注入点。数值型的注入点,我们可以用“and 1=1” 和“and 1=2”去判断,当输入“and 1=1”返回的页面与“and 1=2” 返回的页面存在差异时,则可说明注入点为数值型。而字符型的注入点,类型较多,需要进行多次尝试,最为常用的是单引号(’)和双引号(“)。
从图3-3-3的数值型判断和图3-3-4的字符型判断可以看出,注入点为字符型判断以及构成注入点是为单引号。
添加图片注释,不超过 140 字(可选)
图3-3-1存在数据交互的页面
添加图片注释,不超过 140 字(可选)
图3-3-2 当输入id=1时的页面
添加图片注释,不超过 140 字(可选)
图3-3-3 数值型判断
添加图片注释,不超过 140 字(可选)
图3-3-4 字符型判断
3.3.1 猜测sql语句的构成
从判断出存在注入,并且注入点为单引号的时候,就意味着拿到了一把可以打开数据库的密钥。下一步就是摆脱数据库的锁。为了摆脱这个锁,就需要我们去猜测连接数据库的语句,也称为建模。从已知情况下判断,不难猜出,数据库语句大概为:“ SELECT * FROM tables WHERE id = ‘$id’ ”。因为注入点为单引号,所以可以大胆的猜测为’$id’。而离实际情况也差不多。实际语句为图3-3-1-1所示。
下一步,就是语句构建。我们的单引号传入数据库的地方,为$id的后面,而当我们只传一个单引号的时候,页面会返回错误信息,提示SQL语法错误,以及出现错误的位置。其实也可以猜到,一个额外的单引号肯定会让原有语句报错的。本来服务器应该接收的输入从数值变成了单引号,“SELECT * FROM users WHERE id='$id’' LIMIT 0,1”。那为了达到获取数据的目的,首先肯定是得让语句变得完整,其次再是加入自己的查询语句。这个时候,注释就特别有用了。MySQL的注释为“-- ” 在URL里面“-- ”会转化为“--+”。所以直接在注入点后加入“’--+”(单引号再加注释)。这样就可以把后面的语句都当注释处理。 如图3-3-1-2。整个页面变得正常。表明单引号加注释,完成了简单的注入。
添加图片注释,不超过 140 字(可选)
图3-3-1-1 SQL语句
添加图片注释,不超过 140 字(可选)
图3-3-1-2加入注释后的页面
3.4 获取数据需要的SQL语句
当黑客完整的拿到一个网站的注入点和实现了注入后,他这个时候需要的就是数据库的数据。这个时候获取数据库数据的SQL语句就尤为重要了。
3.4.1 order by
SQL使用Order by语句重新排序数据库的返回结果,默认的排序规则是升序。如图3-4-1-1,那这个order by在注入中又有什么作用呢?其实,它主要是用来查看存在注入点的网页支持显示多少字段。而并不是需要它的排序功能。比如order by 2不报错,order by 3 报错。如图3-4-1-2。整个表中只有id和name两个字段,我使用order by出了字段数,就可以进行接下来使用的语句查询了。
添加图片注释,不超过 140 字(可选)
图3-4-1-1 order by 查询
添加图片注释,不超过 140 字(可选)
图3-4-1-2 order by 判断字段
3.4.2 union
Union在SQL语句中称为联合查询,用于组合多个select语句的结果,但有一个重要的点,那就是,组合在一起的每个select语句拥有的列的数量应该一致,且对应的列的数据类型应相同,列的排列顺序也应该一样,长度可不相同。使用方法如图3-4-2-1。需要注意的是,union操作符选取不重复的值。如果需要重复值,则必须使用union all。
此时,黑客可以结合order by的用法。利用order by确定字段数,即列的数量。然后使用union进行联合查询以获取所需的数据。
添加图片注释,不超过 140 字(可选)
图3-4-2-1 union的使用方法
3.5完成建模后的注入
从3.4章节里面完成了建模后的语句,构造了完整的获取数据的sql语句。此时,即可开始进行注入以获取数据。
3.5.1 order by和union的联系使用
首先判断select语句中存在的字段数,如图3-5-1-1所示,在注入点输入order by 3时,数据库可以正常返回数据;但是如果输入的是order by 4,数据会返回错误信息。根据这个现象,可以确定select语句中存在的字段数是3。接下来就是union的用法了。根据图3-3-4,已经得知服务器端对数据库的查询语句中,最后的结尾存在一个LIMIT 0,1,这意味着它只显示一行。所以必须让前面的select 语句出错,而让后面的select语句执行,这就只能输入id=-1。如图3-5-1-2,当我输入“id=-1' union select 1,2,3 -- zyh”时,我们看到了结果,2和3为我们输入的数据,且显示了出来。说明2或3是可显示位。这个时候,只需要把2或3改成我们需要查询数据的语句。如图3-5-1-3,我把2改成了database(),把3改成version()。结果显示为数据库的名字和该MySQL的版本号。那么这个数据库就到手了。
添加图片注释,不超过 140 字(可选)
图3-5-1-1 order by 判断字段数
添加图片注释,不超过 140 字(可选)
图3-5-1-2 union显示了输入的值
添加图片注释,不超过 140 字(可选)
图3-5-1-3 得到数据库名和MySQL版本号
3.6完整获取整个数据库的过程
从章节3.3到3.5建立了完成SQL注入的一系列过程,接下来是需要把所有的数据都导出。这个其实考验的是黑客对SQL语法的运用。我们得知了当前数据库名为security。这个时候我们要做的是把数据库里面的表得知,在3.1章节我介绍了MySQL有一个information_schema数据库,想要获取数据库中的所有表名,可以利用这个库中tables表的tables_schema字段,并且他还有个字段table_name记录了该数据库的表名。那么黑客就可以根据这两个字段,获取security数据库里面的表。如图3-6-1-1,我在对应2的那个显示位输入了查询的SQL语句:“(select group_concat(table_name) from information_schema.tables where table_schema="security")”,数据库返回了4个表名。根据表的字面意思,大概可以判断出users表里面有着我们需要的账号密码。同理,用information_schema数据库的columns表中也可以找到所有字段对应的表名,就是table_name字段,在根据他还有个字段columns_name记录了表中的列。可获得users的列的名字。如图3-6-1-2,可得知users表中列的名字为username和password。这边提到一个点,就是group_concat这个函数,是为了将结果连接为一条数据进行显示。因为很多时候,可显示位只有一个,而需要的数据有多组的时候,这个函数的作用就特别明显了。
最后就是获取username和password的数据。如图3-6-1-3,获取了username和password的信息,达到了脱库的过程。图3-6-1-4,是从数据库中查看信息,根据数据库里面的信息,可以发现结果导向完全一致。表明注入攻击测试是成功的。
添加图片注释,不超过 140 字(可选)
图3-6-1-1 获取数据库security中的表
添加图片注释,不超过 140 字(可选)
图3-6-1-2 获取表users中的列
添加图片注释,不超过 140 字(可选)
图3-6-1-3 获取username和password的数据
添加图片注释,不超过 140 字(可选)
图3-6-1-4从MySQL数据库下查看数据
第四章:通用SQL注入手法的研究
4.1 SQL注入的各类手法分析
SQL注入中存在各种各样的注入手法,这些注入手段主要取决于要进行注入的网站存在什么样的方式的数据库交互。像有些网站,是不一定会有显示位的,那么第三章的注入岂不是就无从下手呢?有些网站的注入点是他们的请求头,比如是cookie、token、session。Use_agent等。也有可能是没有任何反馈点,需要自己进行根据页面的回应去判断是否进行了注入。这也叫盲注。注入手法奇奇怪怪,但万变不离其宗的是,要想进行SQL注入,首先要找到数据库交互的点。这里也分析一些SQL注入的常见手法[6]。
4.2 显错注入
所谓显错注入,其实就是存在显示位的注入点。在第三章完成的SQL注入就是显错注入的过程。只需要暴露出可显示位,即可通过可显示位来得到需要获取的数据。这个注入手法,当遇上没有显示位的时候,就无法使用,这也就意味着显错注入存在了极大的局限性。
4.3 报错注入
当显错注入无法使用时,其实还有一种比较特别的方法;叫做报错注入。
4.3.1 报错注入的使用存在场景
报错注入,虽然只是跟显错注入相差了一个字眼,但是区别上却是大有不同。报错注入,是根据数据库的特性机制,可人为的制造语法报错去执行SQL命令,数据库在返回错误信息时,攻击者想要获得的数据也包含的错误信息中。在显错注入受到限制的情况下且能返回错误信息的时候使用。如图4-3-1-1,一个存在注入点为单引号的网站,但是注入的时候,可以发现,并不存在显示位。当我们在注入点进行注入的时候,它返回的信息只有一串关于数据库的报错信息。这个时候,黑客又是怎么做的呢?
添加图片注释,不超过 140 字(可选)
图4-3-1-1 不存在显示位的测试
4.3.2 报错注入常用函数
从4-3-1-1章节里发现,注入成功后没有了可显示位,只留下一串数据库的报错信息。这个时候出场的就是报错注入需要用到的函数updatexml。Updatexml在报错注入这一块用法是updatexml(1,2,1)。通俗的解释一下,当第一个参数(即1)与第三个参数(即1)类型对应,第二个参数(即2)不符合Xpath格式的时候,就会进行报错。而且重要的是,它会把报错信息显示出来,这个也就是这个函数的使用需求。图4-3-2-1里可以看到,插入的命令为:“and updatexml(1,(concat('^',database(),'^')),1) -- zyh”。这里使用了concat函数将第二个参数字符串化,导致了第二个参数不符合Xpath格式,于是将我们输入的database报错了出来。
像类似updatexml这种能通过数据库报错输出信息的函数,还有floor、extractvalue、exp、polygon等函数。其原理也是类似于updatexml报错,这里也就不一一演示了。
添加图片注释,不超过 140 字(可选)
图4-3-2-1 报错注入updatexml函数用法
4.4 盲注
可能有些开发人员遇过显错注入和报错注入,然后就将显示位和数据库的报错信息都隐藏了。这个时候,黑客遇上这种情况,又该如何去处理呢?嘿嘿,提到这个点,盲注就该闪亮登场了。
盲注,顾名思义,就是有着一种盲目的状态,至少在状态方面来说,确定不了任何的攻击方向。盲注的整个过程都看不到任何返回数据,攻击者只能进行猜测,关键在于猜测的基础是什么,基础就是服务器在处理攻击者给出的不同命令时表现出的差异,包括响应时间差异和返回结果差异。也就是说要想实现这个感觉判断的差异,需要构造一条判断的语句去测试,那么这条语句必须是布尔表达式。SQL语句会根据布尔表达式的结果做出不同选择,服务器又根据SQL语句的选择给出不同响应,攻击者根据响应的不同去判断,做出不同的反应是否成功注入。所以,这个盲注根据布尔表达式的不同,可分为布尔盲注和时间盲注。
4.4.1 布尔盲注
如图4-4-1-1,当我们测试出一个网站存在注入点,但是全没有任何返回的信息时,我们就需要考虑到盲注进行攻击。其实想到了用盲注去攻击,它的攻击方法就比较简单了,length函数可以简单的帮到黑客去判断数据库database的长度。如图4-4-1-2。使用“and length(database())=8 -- zyh”判断出数据库字段长度为8。知道了数据库的长度,还需要判断数据库的具体名字。这个时候就需要用到aciss函数和substr函数的结合使用。aciss有128个。它可以将字符或字母用数字表示。而用数字就可以进行大小比较去判断。substr(string,start,<length>)函数是从string的start位置开始提取字符串,两个函数结合使用做到了精确提取了每一个字符。如图4-4-1-3,使用“and ascii(substr(database(),1,1))=115 -- zyh”结合图4-4-1-4的ascii表,判断出数据库名第一个字段为s,依此方法进行一步一步判断,可获取整个数据库信息。
添加图片注释,不超过 140 字(可选)
图4-4-1-1 盲注的回应过程-判断出注入点却无任何返回的信息
添加图片注释,不超过 140 字(可选)
图4-4-1-2 使用length函数判断出数据库字段长度为8
添加图片注释,不超过 140 字(可选)
图4-4-1-3 使用ascii和substr函数判断数据库名
添加图片注释,不超过 140 字(可选)
图4-4-1-4 ASCII表
4.4.2 时间盲注
时间盲注,判断点跟布尔盲注差不多,都是经过页面的不同反应去判断注入情况。如图4-4-2-1,注入点同样是单引号,但直接去用length()函数判断数据库字段长度的时候,它没有变化,无法进行判断。此时就需要使用sleep函数。用到的命令为“and if(length(database())=8,sleep(4),1) -- zyh”只需要通过页面的跳转状态来判断是否注入成功。
值得一提的是,其实盲注一般都会结合工具去使用,这样会效率高。只需要判断出一个注入点。结合工具即可快速脱库。
添加图片注释,不超过 140 字(可选)
图4-4-2-1 时间盲注注入后,会发现页面存在sleep情况。
4.5 Head头注入
Head头注入,就是在进行SQL注入攻击时,将注入语句放在HTTP的头部。HTTP头中包含各式各样的信息,很多网站会在用户访问时利用请求HTTP头中的IP等信息记录用户身份,这样用户在之后访问该网站时,仍保持之前的状态。网站也会区别登录地址和设备,达到更高的自适应效果。这边罗列一下常见http头注入参数:
Cookie:用于标识用户身份,通常由服务器为用户设置,存储在用户本地,对用户进行会话跟踪。需要加密。
Host:用于标识客户端想要访问的服务器的域名和端口号;
Rerferer:用于标识浏览器从哪个页面转到当前页面;
User-Agent:用于标识客户端所在的操作系统及浏览器的相关信息,服务器通常会把这些记录保存进数据库;
X-Forwarded-For:XFF头,用于标识请求端的真实IP地址。虽然有部分网站处于安全原因会记录该数据,但是XFF头是可以进行修改的。
4.5.1 Head头注入的存在场景及注入攻击方式
很多时候,黑客通过弱口令爆破或其他方式进入了一个网站,但可能只是个用户权限,这个时候想拿到管理员权限或者说取得数据库信息,又应该如何下手呢?如图4-5-1-1。登录一个页面后,会记录User-Agent的值。这个时候黑客通常会采取抓包的形式查看并判断记录的值。如图4-5-1-2.可以发现正常情况下的抓包发包跟登录情况是一样的。但可以注意到,User-Agent头里的数据是一起传到数据库里的。于是,抓包后修改User-Agent头,就可以直接进行注入了。如图4-5-1-3,可以发现,把User-Agent头的数据改成“zyh' and updatexml(1,concat('^',database(),'^'),1) and '1'='1”。成功的把数据库的字段名给暴露了出来。一般黑客会有自己的小工具,如图4-5-1-4,使用Modify-Header小工具可以轻松修改User-Agent头数据。从而达到了可快速注入的效果。
添加图片注释,不超过 140 字(可选)
图4-5-1-1登录一个网站后,会记录User-Agent的值
添加图片注释,不超过 140 字(可选)
图4-5-1-2正常情况下的抓包发包情景
添加图片注释,不超过 140 字(可选)
图4-5-1-3修改User-Agent后的抓包发包情景
添加图片注释,不超过 140 字(可选)
图4-5-1-4 使用小工具直接进行修改User-Agent值
4.6宽字节注入
很多时候,开发人员在经历过一连串的被黑客支配的恐惧后,会想方设法的去设定一些点,让黑客无从下手。例如:过滤一些特殊字符单引号,或者一些特殊函数select。最常见的就是单引号过滤。但是这些过滤手法尽管已经用正则表达式、数据验证、URL重写等多种手段进行防御,但都见效甚微。举个例子,如图4-6-1,当开发人员用and字符作为过滤手段时,黑客可以用双写绕过,或base64转码、ascii转码等绕过手段进行绕过。有些甚至直接以二进制或者16进制或用计算机能识别的语言去拼凑出想要的SQL语句进行绕过。当方法奇奇怪怪的时候,开发人员便难以招架。于是便想着从代码层面入手。PHP存在一些函数,当他们遇到单引号双引号等特殊字符时,会自动在它们前面加个反斜杠“\”进行转义,从而使得黑客构造的语句直接失效。如图4-6-2所示,在url里传入了“-1' union select 1,database(),3 -- zyh”语句,而传进数据库里的语句却变成了“-1\' union select 1,database(),3 -- zyh”。多了这个反斜杠,使得传入的SQL语句无法达到黑客的预期的要求,从而使得系统不被黑客攻击,成功预防了注入攻击。
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
如图4-6-1 双写绕过and字符的过滤
添加图片注释,不超过 140 字(可选)
如图4-6-2 传进去的数据被加入的反斜杠
4.6.1 宽字节注入常用函数
宽字节是相对于ascii这样的单字节而言的;使用一个字节表示一个字符,共定义了128个字符,但是由于很多国家的字符远超过128个,就必须使用多个字节表示一个字符,宽字节也应运而生,像是GB2312、BIG5、GBK等都是宽字节,这些宽字节的长度只有两个字节。以我国使用的GBK编码为例,使用GBK编码的汉字就占用了两个字节。还有存在一个叫做UTF-8的编码方式,它使用可变字节编码字符。
正如4.6章节说到的,添加反斜杠“\”后将转义特殊字符。而在MySQL中,是什么功能扮演这个角色呢。通常会有这几个函数,addslashes、mysql_real_string、mysql_escape_string等。还有的就是一种叫做“魔术引号开关”的PHP防御配置函数magic_quote_gpc。该函数可以用来对用户提交的数据进行分析、判断和处理,通过get或者post方法传递过来的数据,或者是保存在cookie中的数据,都会先通过这个函数。它会在数据中添加适当的转移符号,保证用户输入数据不会被当作指令执行,该函数对SQL注入由很好的防护作用。
4.6.2 宽字节注入存在场景
为什么会出现宽字节注入呢,其实说到底,是可以这么去解释的:计算机呢,不是中国人发明的,是英语国家的人发明的。所以它也存在不兼容中国的文字和语言。正常的英文都是单字符,他们最多就用26个英文字符组成的语言。而中国文字,都知道是博大精深对吧。如图4-6-2-1,像“%27”这是一个单字节,经url解码后,就是一个单引号。而像“%d5%5c”则是双字节,它经过url解码后是汉字“誠”。那么在某些开发程序员使用MySQL的编码时设置的只要不是uft-8编码,如“SET NAME GBK”或SET character_set_client=gbk,类似于这样的配置就会引发编码转换从而导致的SQL漏洞。
如图4-6-2-2,在一个编码使用的是GBK的系统中存在SQL注入漏洞,但这个系统使用了魔术引号“magic_quote_gpc”,所以一般的注入手段是没有办法起到作用的。这里使用“?id=-1%df' union select 1,database(),3 -- zyh”语句,方法是用“%df”去与反斜杠“\”拼凑成一个汉字。如图4-6-2-3,从url编码上分析解释,“%df”与反斜杠“\”拼凑成了一个“運”字。 因为这个“運”字将反斜杠“\”一并过滤掉了,从而使得SQL语句再次生效,达到了进行注入攻击的目的。
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
图4-6-2-1 经url转码后的汉字和字符
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
图4-6-2-2 加入“%df”与反斜杠“\”构成汉字,达到注入效果
添加图片注释,不超过 140 字(可选)
图4-6-2-3 “%df”与反斜杠“\”拼凑成了“運”字
第五章:基于SQL注入攻击的通用防注入研究
5.1 如何进行SQL注入的补救和预防措施
从整个第四章到这里,讲解了一系列的注入手法以及注入所需要的一些条件,不可否认的是,这些注入一旦起到作用,都将带给网站管理员巨大的损失。那该如何进行补救和预防呢?
5.1.1 SQL注入的补救措施
对于受到SQL注入攻击后,如何进行补救措施。这对某些网站管理员尤为重要。下面是SQL补救的一些措施:
1、定期检查服务器日志文件:用户访问服务器的所有行为都会被日志记录下载,SQL注入的行为也不例外,管理员应该注意日志中的一些异常记录。
2、对网站进行备份:如果攻击已经发生,但还没有完全解决,为了保证网站业务的效率和正常运行,可以从备份的文件中恢复网站数据,同时隔离或者删除之前出现问题的文件,避免攻击者对网页或文件的恶意修改。
3、分析并修补漏洞:使用网络上比较有名SQL注入的工具,例如NBSI或者sqlmap等工具对网站进行测试,
4、对网站代码进行审计,尤其注意传递用户输入参数的部分是否对SQL注入进行了正确的过滤,对可能存在问题的代码进行修复。修复后,使用措施3中的工具对网站进行测试,确保之前对代码的修改确实成功,且不存在其他有问题的代码。
5、对服务器定期杀毒,检查服务器内部是否存在任何病毒或者木马程序。
6、网站打补丁后,经过一周左右的严密监控和检查,包括网站的运行情况及服务器日志监控。
5.1.2 SQL注入的预防研究
5.1.1章节阐述了针对SQL注入的补救措施,这一章节谈谈对SQL注入的预防研究。目前,在预防SQL注入攻击时,研究人员主要关注以下几个角度:
-
数据验证:服务器接收用户输入数据,在将数据传递给数据库之前,检查数据中是否存在敏感字符,对其进行替换或删除,也要检查数据类型是否符合要求。
-
数据编码:攻击者在注入时,参数中常常包含被替换的字符,这些字符会在数据库中被转换回去。应用程序可以对这些字符进行特殊编码,最终形成数据库可识别的正常字符。
-
使用正则表达式:开发人员可以使用正则表达式建立一个输入白名单,里面包含网站允许的所有合法输入,不符合这个白名单的输入一律拒绝。这种方法存在合法用户无法通过的情况。
-
URL重写技术:服务器在接收到一个请求后,对请求进行拦截,并将请求中的URL修改成服务器中其他资源的路径。在这个过程中,服务器会对URL进行检查,根据其内容进行重定向。
-
入侵检测系统:入侵检测系统,简称IDS。在进行正式的入侵检测前,该系统会利用机器学习技术构建一个查询模型,使用该查询模型对网络中的流量进行实时监控,检测传输数据是否与查询模型匹配。这种方法的检测速度很快,但是检测质量完全取决于查询模型是否健壮,即构建查询模型的数据和学习算法是否全面。如果训练数据出现了问题,可能会出现大量误报的情况。
-
动态检测方法:该方法由两部分组成:离线代码转换器和分析树核查器。整个流程如下:离线代码转换器对网站的源代码进行重构,数据库查询语句部分使用无害的预备输入数据作为参数,用户在对数据库进行查询时,重构的程序会调用分析树核查器,比较由用户原始输入构成的查询语句和由无害预备输入构成的查询语句之间,结构是否相同,如果结构相同,进行数据库查询,否则拒绝查询。动态检测的方法速度和精度都很高,但是在运行前需要对网站代码进行重构。
除了以上的6个点,其实还有一个点是最让开发人员忽略的。那就是预处理机制和参数化查询:预编译出参数,查询时不进行语句拼接,直接使用预编译的参数。不用字符串连接建立 SQL 查询,而是使用参数化查询方法获取信息,这种方式编写的代码可以有效减少攻击,如图5-1-2-1,预编译与参数化查询结合使用的语句示例。但由于编写代码复杂繁琐,被一些开发人员所摒弃。
添加图片注释,不超过 140 字(可选)
图5-1-2-1 MySQL+PHP中关于PDO的预处理和参数化查询示例
5.2 针对SQL注入的防范方法
针对SQL注入的预防御措施,结合第四章的SQL注入手法研究,网站管理者可以采取以下防范手段:
防范手段一:对SQL查询语句进行预编译(Prepared Statement)。该方法在提高效率和安全性上都十分有效。在查询效率上,如果需要对同一查询语句进行多次查询时,可以先让数据库管理系统对预编译语句进行解析,在真正执行查询操作时,直接传入参数,可以减少大量查询时间;在安全性上,因为预编译的方法是以纯文本的形式传递参数的,不会在本地将参数拼接到命令上,数据和代码不在一起,从理论上讲,使用SQL预编译语句,可以完全防止SQL注入漏洞的出现。
防范手段二:使用存储过程。存储过程主要是为了提高在数据库进行查询的速度,和预编译很像,只不过存储过程要在数据库中定义并存储好查询语句,之后应用程序想要使用时,直接调用存储好的存储过程就可以。并不是说使用存储过程就可以预防SQL注入攻击,如果存储过程在定义时没有正确过滤输入数据,或者直接使用连字符形成查询语句,都可能导致攻击的发生。不管是使用预编译还是存储过程,想要预防SQL注入漏洞,都要保持固定的查询语句格式,否则仍旧需要对输入进行仔细检查。
防范手段三:检查用户输入。
(1)在检查用户输入方面,白名单是最为强力的手段。白名单模式用于制定输入数据类型。例如,ID、UID值必须是整数。然而,在很多情况下,用户的输入类型很可能是字符串,因此在不适合使用白名单的情况下,就要依赖其他方法防止SQL注入攻击了。
(2)对输入进行编码或使用字符转义。字符转义是一个很常见的概念,通常是在具有特殊作用的字符前加上反斜杠,表示该字符只表示字符本身,没有特殊作用。该功能在数据库管理系统中也存在,可以参考前面介绍宽字节注入时提到的相关内容。举例来说,MySQL中存在两个函数,都会在特殊字符前加上反斜杠,进行转义,两个函数分别是mysql_real_escape_string()和mysql_escape_string(),如果函数执行成功,就会返回转义后的字符串。有一点需要注意,会被这两个函数转义的字符并不多,只包括\x00、\xla、换行符(\n)、回车符(\r)、反斜杠本身(\)、单引号(’)以及双引号(”),在实际攻击中,攻击者还会利用许多特殊字符完成攻击,比如说“!、@、#、$、%、&、*、[、]、=”这些符号,所以对SQL注入攻击的防护并不完善。除了这两个函数外,还有类似的函数addsl ashes()和addcslashes()也能实现相似功能。
(3)对输入进行过滤。这个方法使用一份黑名单,黑名单中列出了所有不允许通过,或者需要进行替换的输入。这种方法存在很大的问题,一方面可能对有害输入过滤不全,让攻击者绕过安全检查实现攻击,另一方面可能拦截了正常的用户输入,比如说黑名单中包括“union”字符串,那么用户正常输入的“union select”会被过滤为“select”,语义不完整。所以黑名单的设立必须十分小心谨慎,既能防范攻击,又能满足正常的业务需求。
防范手段四:关闭网站的错误信息显示。在前面介绍SQL注入的注入手法时,提到了一种手法叫做报错注入,这种手法之所以能够成功,就是因为网站的报错信息中会泄露很多和服务器、数据库有关的信息,这些信息可能会帮助攻击者进行SQL注入。所以在进行网站建设时,应该单独建立一个404页面,一旦发生错误的情况,就重定向到该页面。
防范手段五:权限最小化。即便网站真的存在SQL注入漏洞,如果数据库配置得当,攻击者所能进行的操作也很少。因此开发人员应严格仔细设置网站权限,实现权限最小化的要求。比如说,给每个应用程序设立不同的账户,每个账户进行不同的权限配置,这样可以对每个用户的操作进行追踪,也实现了权限隔离。
防范手段六:除了在代码的角度和权限控制的角度对SQL注入攻击进行防护外,还应该为服务器配备专业的防护设备和防护软件,比如为服务器设立应用防火墙。
5.3 结论
在我看来,如何去针对SQL注入的预防,可以从存在SQL注入的点,和各类的SQL注入手法进行研究。基于显错注入和报错注入,关键在于他存在可显示出SQL的查询数据或者是数据库的报错信息。这点可能先从过滤点一些关键字符和函数以及将数据库的报错信息关闭。从而达到防范的措施。当对于Head头注入来说,可对用户传进来的数据先进行检查。例如进行白名单模式,将用户输入的数据进行数据类型检查和一些编码过滤,达到防御效果。当遇到宽字节注入的时候,对编码的控制就尤为关键。因为宽字节注入就是利用编码的效果进行注入攻击。
那么,如何进行有效的防止SQL注入呢,当我们进行过滤检查、编码控制、关闭数据库报错显示以及用户输入检查。除此之外,网站开发人员还可以实现参数化查询,检查用户传入数据的合法性;在应用层面,建立专门的404页面,实现权限最小化;在网络层面,为服务器设立防火墙等防护软件。这样结合使用才是最有效的防范措施。
5.4 本章小结
本章首先分析了在受到了SQL注入攻击时如何先进行最有效的补救措施,并对存在SQL注入漏洞的系统提出了改进的方法。与此同时,根据提出的补救措施与改进方法,解决两者中可能出现的问题。本章还介绍了如果阻止SQL注入漏洞的出现,参数化查询防止了黑客构造了的语句直接改变原有的数据库的SQL语句。关闭数据库的报错信息,能最大限度的为敏感信息提供保护。且权限最小化是完全能避开其他方式的攻击。网络层面的WAF和IPS、IDS的防护。达到了目前为止最大的安全化。
第六章:结束语
信息化时代,随着科技水平的提升,计算机技术与网络技术飞速发展,人们访问互联网的方式越来越多,网络信息共享已经成为了每个人生活的一部分,是信息传递的主要方式。而以网页和数据库为基础的动态网页成为了网络世界的生力军,这也就导致SQL注入漏洞随处可见。针对该漏洞的SQL注入攻击的原理十分简单,入门门槛低,危害性大,但是难以防护,同时网上存在很多自动化工具。尽管如此,SQL注入攻击并没有引起网站开发和维护人员的重视。如此种种,极大的危害了网站安全。因此,越来越的研究员开始将目光聚焦到SQL注入的预防与防御上。
本篇文章介绍了实现SQL注入攻击的五种注入手法,五种手法均是基于MySQL的数据库进行设计。基于参数化查询技术的SQL注入攻击防御方法,目前研究较少,但可以看出,未来,在SQL注入的防御方面,参数化查询具有一定优势。目前有很多网站使用SQL通用防注入系统对SQL注入攻击进行防御,这是一个开源项目,网站的开发和管理人员可以根据需要对代码进行修改,实现对自己网站的防御。
本人的目标是希望通过努力研究与学习,能够找到一个完全防御SQL注入的方式。
参考文献:
[1] 高少杰. sql注入攻击防御方法研究.云南大学, 2010
[2] 胡敏. Web系统下提高MySQL数据库安全性的研究和实现.北京邮电大学, 2015
[3] 隋亮. 基于渗透测试的SQL注入漏洞检测与防范.东华大学, 2014
[4] 李鑫.张维伟.隋子畅.郑力新. 新型SQL注入及其防御技术研究与分析.华侨大学工学院;东北林业大学信息与计算机工程学院, 2016(02)
[5] 刘笑杭. SQL注入漏洞检测研究.杭州电子科技大学, 2014
[6] 魏星. 基于手工SQL注入的Web渗透测试技术研究.中北大学, 2015
[7] 张慧琳.丁羽.张利华.段镭.张超.韦韬.李冠成.韩心慧. 基于敏感字符的SQL注入攻击防御方法.北京大学计算机科学技术研究所;加州大学伯克利分校;百度美国有限责任公司, 2016(10)
[8] 刘文生.乐德广.刘伟. SQL注入攻击与防御技术研究.泉州市公安局公共信息网络安全监察支队;常熟理工学院计算机学院, 2015(09)
[9] 吕康.凡金伟. Php+mySql注入漏洞分析与研究.郑州大学;郑州商业贸易技师学院, 2008(10)
[10] 孟婷. MySQL注入攻击及防范方法.天津市房地产经济技术信息中心, 2013(11)
[11] Sruthi Bandhakavi, Prithvi Bisht,P. Madhusudan, V. N. Venkatakrislnan. CANDID: Preventing SQL injection Attacks using Dynamic Candidate Evaluations.CCS’07.Alexandria,Virginia,USA.2007.Newyork.ACM.2007,12-24.
[12] Fredrik Valeur,Darren Mutz,Giovanni Vigna. A Learning-Based Approach to the Detecti on of SQL Attacks.In Proceedings of the Conference on Detection of Intrusions and Malware and Vulnerability Assessment.Vienna,Austria.2005.Berlin.Springer.2005.123-140.
致谢
银杏泛黄前,步入松田校区;海棠凋零后,难舍计科大系。四年时光,如同细沙,无声流逝于指间。 昨天的相聚依然历历在目,今天的离别已经近在眼前。我人生中短暂的四年,我人生中重要的四年,有幸能够和各位师长,同学一起渡过,我一直心怀感激。
翻过这最后一页的致谢,我也翻过了四年的大学生活。回想这 20 年来的求学经历,迷茫、困惑、愉悦、执着。无论是遭遇挫折时的泪水,还是获得成功时的欢笑,都有父母在一旁默默、不断支持。谢谢你们,儿子已经长大,今后的生活,我会更加努力。
雄关漫道真如铁,而今迈步从头越。走出校门,我即将踏上一段崭新的征途。感谢一路曾有老师扶持,有同学朋友相伴。再道一声:保重老师,珍重朋友!
2020 年 4 月