网络安全攻防:Web安全之SQL注入
几乎所有 Web应用程序都依赖数据库来管理在应用程序中处理的数据。在许多情况下,这些数据负责处理核心应用程序逻辑,保存用户账户、权限、应用程序配置设置等。大多数数据库都保存有结构化、可以使用预先定义的查询格式或语言访问的数据,并包含内部逻辑来管理这些数据。本文介绍SQL注入攻击如何利用语言的漏洞来获取数据库中的数据。
1. 原理
首先,SQL语言是一门解释型语言。所谓的解释型语言就是一种在运行时由一个运行时组件(runtimecomponent)解释语言代码并执行其中指令的语言。与之相对的还有编译型语言,它的代码在生成时转换成机器指令,然后在运行时直接由使用该语言的计算机处理器执行这些指令。
从理论上讲,任何语言都可以使用编译器或解释器来执行,这种区别并不是语言本身的内在特性。但大多数语言仅通过上述一种方法来执行,SQL语言就是这样。
基于解释型语言的执行方式,会产生一系列叫作代码注入的漏洞,SQL注入就是其中的一种。在任何实际用途的Web应用程序都会有用户交互环节,会收到用户提交的数据,对其进行处理并执行相应的操作。因此,解释器处理的数据其实是由程序员编写的SQL语句代码和用户提交的数据共同组成的。在这个时候,攻击者可以提交专门设计过的SQL语句,向Web应用程序攻击。结果,解释器就会将这其中一部分的输入解释成程序指令执行,就像一开始程序员编写的代码一样。因此,SQL注入漏洞就随之形成了。
除了语言本身的原因,SQL注入产生的另一个原因就是未过滤问题。在编写Web应用时,由于其自主访问控制的性质,程序员往往会对用户输入的信息进行一定程度上的过滤操作,过滤掉一些危险的字符,如or、单引号、注释符等。但往往有些经验不足的程序员会忽视这一问题,只是进行简单的过滤,从而让攻击者有机可乘。
SQL注入漏洞存在时间非常久,在Web应用高速发展的今天,已经很难见到SQL注入漏洞了。但是学习的目的在于了解其根本以及如何防范这种漏洞的产生。
2. 注入分类
接下来了解一下具体的SQL实施与分类。
在实战中,主要会接触到3个不同类型的注入点,它们分别是数字型、字符型和搜索型。在编写实际的Web应用程序时,程序员会根据不同的数据类型,编写不同的查询代码如下。
每个类型在输入数据的时候,对数据做了一定的规范,因此,才产生了这样的划分,我们会在接下来的实例介绍中重点去区分数字型与字符型。要提前申明一点,虽然这里将注入点划分了一定的类型,但是注入的步骤与原理都是一致的,因此,这种区分只是从数据角度去划分的。
接下来将对SQL注入执行的步骤进行实例分析,在整个分析过程中,我们会将数字型与字符型细分开来,并且会先对手工SQL注入进行剖析,然后再教大家去使用工具。对于从事安全的人员来说,工具只是实现渗透的一种手段,不能过多依赖于工具的操作。工具也是安全人员为了简化步骤而编写出来的。对于刚刚接触安全的人来说,工具会更方便,了解原理才能真正掌握了这个漏洞。
在DVWA中的SQL Injection,在其中输入框中输入1,然后提交,如图1所示。
图1 ID:1
这里要先对注入点的类型进行判断,按照一般的步骤,输入数字时会先考虑这是一个数字型的注入点,所以会先按照数字型的方式操作注入点。
在其中输入1 and 1=1,如图2所示。
图2 1D:1 and 1=1
在图2中,我们可以看到ID的数据变成了 1 and 1=1,很明显,这里的ID是一个字符型。所以对注入点类型的判断是字符型。
接下来判断该注入点是否有效。因为在实际操作中,某些应用程序虽然允许此类输入操作的发生,但是它会在内部逻辑中过滤掉该部分。可以通过一个经典的操作来判断注入点是否有效。
在其中输入1’and‘1’=’1时,如图3所示。
图3 ID:1’and‘1’=’1
之后再输入 1’and‘1’=’2,如图4所示。
图4 ID:1’and‘1’=’2
这里会出现两种不同的结果,而这两种结果证明这个注入点是有效的。and 1=1 是一个永真命题,and后面的条件永远成立,而and1=2正好相反,1=2是一个永假命题,and后面的条件不成立。对于Web应用来说,在条件不成立的情况下也不会将结果返回给用户,所以在图4中看不到数据。
前面的操作是SQL注入点判断的基本操作。后续对于不同的数据库有不同的操作。数据库大致可以分成Access数据库、MySQL数据库、SQLServer数据库、Oracle数据库等。Access数据库是比较早期应用于Web应用的数据库。早期的Web应用主要以显示大量文本数据的静态网页组成。但是,近几年Access数据库的使用逐渐减小,因为它不能适应大量用户的访问,并且安全性没有其他数据库高。而现在使用较多的是MySQL数据库。SQLServer和Oracle在大型公司比较适用。
MySQL 数据库允许使用联合查询的方式,这样查询更加便捷。接下来,我们继续刚才的操作,判断完注入点之后,需要判断该数据表存在的列数,输入1’orderby 1#,如图5所示。
图5 ID:1’order by 1#
order by是根据列值查找的命令,#起到的作用是注释,防止后续语句的干扰。可以继续尝试输入:
运行结果,如图6所示。
图6 列值查找
它会显示错误,找不到列值为6的列。这是因为该表中不存在6列,按照这个步骤,可以从1开始,逐步往上增加,直到出现一个数报错为止,这样,就可以知道该表中具体有多少列,当然,DVWA经过测试可以知道一共有2列。
知道列数之后,我们要看 MySQL 数据库的版本,因为 MySQL5.0以后的版本具有information_schema数据库,里面存有所有数据库的数据表名和列名,如图7所示。
图7 information_schema数据库
利用这个数据库来进行数据的检索,所以在此之前需要查看该应用使用的MySQL数据库版本,输入:
提交结果,如图8所示。
图8 查看版本
可以看到数据库的版本是 5.0.51a-3ubuntu5,知道了版本之后,就可以使用information_shchema来完成后续的操作。输入:
提交结果,如图9所示。
图9 查看表名
可以看到,图中显示出来两个表名。然后再来理解上面输入的语句,information_schema数据库中含有 tables 这个数据表,条件是表数据库名与database()相同,而 database()正是当前查询的数据库。
然后查询列名,输入:
运行结果,如图10所示。
图10 查看列名
一共可以看到6个列名,输入语句其实与上面那句类似,就是找到这个数据表中的列名。有了这些数据,就可以列出想要的数据了,输入:
运行结果,如图11所示。
图11 列出数据
这里的密码是使用MD5加密的,可以利用工具在线解密。
3. SQL注入工具
SQL注入工具有很多,比较好用的有Pangolin和SQLMap工具。这两个工具对于初学者来说,上手难度不大。
Pangolin 是一款帮助渗透测试人员进行 SQL 注入(SQLInjeciton)测试的安全工具。Pangolin与JSky(Web应用安全漏洞扫描器、Web应用安全评估工具)都是NOSEC公司的产品。Pangolin具备友好的图形界面并支持测试几乎所有数据库(Access、MsSQL、MySQL、Oracle、Informix、DB2、Sybase、PostgreSQL、SQLite)。Pangolin能够通过一系列非常简单的操作,达到最大化的攻击测试效果。它从检测注入开始到最后控制目标系统,都给出了测试步骤。Pangolin是目前国内使用率最高的SQL注入测试的安全软件。
SQLMap是一个自动SQL注入工具,其可执行一个广泛的数据库,管理系统后端指纹,检索DBMS数据库、usernames、表格、列,并列举整个DBMS信息。SQLMap提供转储数据库表以及MySQL、PostgreSQL、SQLServer服务器下载或上传任何文件并执行任意代码的能力。
在windows命令行中输入:
运行结果,如图12所示。
图12 获取数据库名
这里可以看到数据库的名称“dvwa”,之后输入:
运行结果,如图13所示。
图13 获取数据库表名
可以看到该数据库中有两个表,之后输入:
运行结果,如图14所示。
图14 获取数据库列名
可以看到一共有6个列名,之后就dump数据就可以了。输入:
运行结果,如图15所示。
图15 SQLMap运行结果
SQLMap自带字典可以来破译比较弱的密码。从操作上看,SQLMap是一款功能比较强大的自动注入工具,但是在安全级别较高的应用中,SQLMap的使用还是很有限的。
4. 预防SQL注入
对于服务器层面的防范,应该保证生产环境的Webshell是关闭错误信息的。例如,PHP生产环境的配置php.ini中的display_error是off,这样就可以关闭服务器的错误提示。另外可以从编码方面去预防SQL注入。
使用预编译语句,是防御SQL注入的最佳方式,就是使用预编译语句绑定变量。例如,JSP中使用的预编译的SQL语句:
从上述代码可以看到“?”处与后面输入的变量相互绑定,之后攻击者如果再使用and1=1之类的注入语句,应用程序会将整个部分当作是username来检索数据库,并不会造成修改语义的问题。对于有些无法使用预编译的部分程序,还有其他方法可以预防。
检查变量类型和格式也是一个不错的方法。如果要求用户输入的数据是整型的,那么就可以在查询数据库之前检查一下获取到的变量是否为整型,如果不为整型就重新校正。还有一些特殊的格式类型,如日期、时间、邮箱等格式。总地来说,只要有固定格式的变量,在SQL语句执行前,应该严格按照格式去检查,可以最大程度上预防SQL注入攻击。
还有一种方法就是过滤掉特殊的符号。在SQL注入时,往往需要一些特殊的符号帮助我们编写语句,如单引号(’)、井号(#)、双引号(”)等。可以将这些符号都进行转义处理或使用正则表达式过滤掉。
除了编码层面的预防,还需要做到数据库层面的权限管理,尽量减少在数据库中使用Root权限直接查询的次数。如果有多个应用程序使用同一个数据库,那么数据库应该分配好每个应用程序的权限。
推荐系统
windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载
语言:中文版系统大小:5.31GB系统类型:Win11windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化
微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载
语言:中文版系统大小:5.31GB系统类型:Win11微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载
微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件
语言:中文版系统大小:0MB系统类型:Win11微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为
雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载
语言:中文版系统大小:4.75GB系统类型:雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统
雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO
语言:中文版系统大小:5.91GB系统类型:Win7雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户
番茄花园Ghost Win7 x64 SP1稳定装机版2022年7月(64位) 高速下载
语言:中文版系统大小:3.91GB系统类型:Win7欢迎使用 番茄花园 Ghost Win7 x64 SP1 2022.07 极速装机版 专业装机版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,集成最全面的硬件驱动,精心挑选的系统维护工具,加上独有人性化的设计。是电脑城、个人、公司快速装机之首选!拥有此系统
番茄花园 Windows 10 极速企业版 版本1903 2022年7月(32位) ISO镜像快速下载
语言:中文版系统大小:3.98GB系统类型:Win10番茄花园 Windows 10 32位极速企业版 v2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程中自动激活
新萝卜家园电脑城专用系统 Windows10 x86 企业版 版本1507 2022年7月(32位) ISO镜像高速下载
语言:中文版系统大小:3.98GB系统类型:Win10新萝卜家园电脑城专用系统 Windows10 x86企业版 2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程
热门系统
- 1华硕笔记本&台式机专用系统 GhostWin7 32位正式旗舰版2018年8月(32位)ISO镜像下载
- 2深度技术 Windows 10 x86 企业版 电脑城装机版2018年10月(32位) ISO镜像免费下载
- 3电脑公司 装机专用系统Windows10 x86喜迎国庆 企业版2020年10月(32位) ISO镜像快速下载
- 4雨林木风 Ghost Win7 SP1 装机版 2020年4月(32位) 提供下载
- 5深度技术 Windows 10 x86 企业版 六一节 电脑城装机版 版本1903 2022年6月(32位) ISO镜像免费下载
- 6深度技术 Windows 10 x64 企业版 电脑城装机版2021年1月(64位) 高速下载
- 7新萝卜家园电脑城专用系统 Windows10 x64 企业版2019年10月(64位) ISO镜像免费下载
- 8新萝卜家园 GhostWin7 SP1 最新电脑城极速装机版2018年8月(32位)ISO镜像下载
- 9电脑公司Ghost Win8.1 x32 精选纯净版2022年5月(免激活) ISO镜像高速下载
- 10新萝卜家园Ghost Win8.1 X32 最新纯净版2018年05(自动激活) ISO镜像免费下载
热门文章
- 1迅雷云播“手机看片神器”使用教程(随时随地秒速离线云播放)
- 2微信公众号怎么年审? 微信公众号年审流程及所需材料介绍
- 3Win10怎么设置网络按流量计费 Win10网络设置流量收费教程
- 4i7 6700主频是多少 i7-6700参数详解
- 5Steam提示“需要在线进行更新,请确认您的网络连接正常”怎么办?
- 6win7蓝屏代码7f指什 怎么解决 很严重
- 7安卓手机安装运行win7系统教程 安卓手机装win7系统教程
- 8aoc一体机电脑win10改win7系统及bios设置
- 9华硕b460主板装win7系统及bios设置教程 10代CPU安装Win7教程 BIOS设置 U盘启动 完美支持USB驱动
- 10高通骁龙8cx怎么样 高通骁龙8cx处理器详细介绍
常用系统
- 1新萝卜家园 Ghost Win7 x64 SP1 最新极速版2018年8月(64位)ISO镜像下载
- 2电脑公司Ghost Win8.1 x32 精选纯净版2018年10月(免激活) ISO镜像快速下载
- 3笔记本系统Ghost Win8.1 (32位) 极速纯净版2019年11月(免激活) ISO镜像高速下载
- 4雨林木风Ghost Win7 x64 SP1 极速装机版2022年6月(64位) 高速下载
- 5番茄花园GhostWin7 SP1电脑城新春特别 极速装机版2022年2月(32位) 最新高速下载
- 6电脑公司Ghost Win8.1 X64位 六一节 纯净版2020年6月(自动激活) ISO镜像快速下载
- 7笔记本系统Ghost Win8.1 (X64) 全新纯净版2019年12月(永久激活) 提供下载
- 8笔记本系统Ghost Win8.1 (X64) 全新纯净版2020年7月(永久激活) 提供下载
- 9笔记本系统Ghost Win8.1 (X64) 全新纯净版2019年10月(永久激活) 提供下载
- 10雨林木风系统 Ghost XP SP3 装机版 YN2020年11月 ISO镜像高速下载