原理
基本流程
分类
利用工具sqlmap
防御
一、SQL注入
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行指定的SQL语句。具体来说,它是利用现有应用程序,将SQL语句注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入SQL语句得到一个存在安全漏洞的网站上的数据,而不是按照设计者意图去执行SQL语句。
SQL注入的概念
(1)SQL注入漏洞原理
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。
(2)SQL注入漏洞对于数据安全的影响
- 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
- 网页篡改:通过操作数据库对特定网页进行篡改。
- 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
- 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
- 服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
- 破坏硬盘数据,瘫痪全系统。
- 一些类型的数据库系统能够让SQL指令操作文件系统,这使得SQL注入的危害被进一步放大。
(3)SQL注入漏洞的方法
1.数字注入
在浏览器地址栏输入:learn.me/sql/article.php?id=1,这是一个get型接口,发送这个请求相当于调用一个查询语句:
$sql = "SELECT * FROM article WHERE id =",$id
正常情况下,应该返回一个id=1的文章信息。那么,如果在浏览器地址栏输入:learn.me/sql/article.php?id=-1 OR 1 =1,这就是一个SQL注入攻击了,可能会返回所有文章的相关信息。为什么会这样呢?
这是因为,id = -1永远是false,1=1永远是true,所有整个where语句永远是ture,所以where条件相当于没有加where条件,那么查询的结果相当于整张表的内容
2.字符串注入
有这样一个用户登录场景:登录界面包括用户名和密码输入框,以及提交按钮。输入用户名和密码,提交。
这是一个post请求,登录时调用接口learn.me/sql/login.html,首先连接数据库,然后后台对post请求参数中携带的用户名、密码进行参数校验,即sql的查询过程。假设正确的用户名和密码为user和pwd123,输入正确的用户名和密码、提交,相当于调用了以下的SQL语句:
SELECT * FROM user WHERE username = 'user' ADN password = 'pwd123'
由于用户名和密码都是字符串,SQL注入方法即把参数携带的数据变成mysql中注释的字符串。
(4)SQL注入的三个特点
1、隐蔽性强
一方面是因为普通防火墙对HTTP/HTTPS全开放的。另一方面,对Wed应用攻击的变化非常多。传统的基于特征检测的IDS对此类攻击几乎没有作用。
2、攻击时间短
可在短短几秒到几分钟之内完成一次数据窃取、一次木马种植、完成对整个数据库或Web服务器的控制,以至于非常困难做出人为反应。据推算,互联网每39秒就会有一次攻击。(当然不仅仅是指SQL注入)
3、危害性大
现在几乎所有的银行、证券、电信、移动、政府以及电子商务企业都提供在线交易、查询和交互服务。用户的机密信息包括账户、个体机密信息(如身份证)、交易信息等等都是通过Wed储存于后台数据库中。这样,在线服务器一旦瘫痪,或虽在正常运行,但后台数据已被更改或窃取,都将造成企业和个人的巨大损失。
二、利用sqlmap工具
1、工具介绍
sqlmap + python2.7
sqlmap是一款非常强大的开源sql自动化注入工具,可以用来检测和利用sql注入漏洞,具体工具可以到https://github.com/sdc5730399/information-security下载
2、爆破过程
获取PHPSESSID,如下图所示
爆数据库
D:\InternetB\sqlmap\sqlmapproject-sqlmap-dd450b5>python sqlmap.py -u “http://192.168.216.133/vulnerabilities/sqli/?id=1&Submit=Submit” --cookie=“PHPSESSID=j9e9rjbjirtahsl4u45rahbbt1; security=low” --dbs --batch
三、SQL注入攻击原理
SQL注入是利用web应用程序数据层输入验证不完善的安全漏洞实施的一种代码注入攻击,是由于用户输入的恶意内容网页没能正确地过滤消除SQL语言中的字符串转义字符,如单引号、双引号、反引号、分号、圆括号、百分号、注释符等等,由于目前大部分的web应用程序都依赖于后台数据库中的内容,根据web应用程序用户输入的内容生成SQL查询和操作语句,来获取和更新后台数据库中的内容,就简单拿“万能密码”来说,攻击者在登录界面输入用户名:admin’ or ‘1’='1, 口令随便输入,如果web应用程序或者后台没有对用户输入的内容进行检查的话,攻击者即使不知道口令,一样能以admin的身份登录系统。
所以网页永远不要相信用户输入的内容,尽可能的将每个用户输入的内容都当初攻击者输入的内容来检查,这样才能更好保证数据库的安全,保证数据不泄露出去。
四、防御
SQL注入攻击的防御手段:
我们要清楚的知道,常见的SQL注入攻击都是因为web程序没有对用户输入的内容进行严格的检查过滤造成的,所以对SQL注入攻击的防范措施主要依靠对用户输入的特殊符号进行严格的验证机制,对输入的参数类型和长度严格检查和限制。
分类:
1、使用类型安全(type-safe)的参数编码机制
在web程序中利用用户输入参数来构造动态SQL语句时,应特别注意参数的类型安全,使用能够确保类型安全的参数编码机制。
2、对所有来自外部的用户输入,都当成攻击者的输入来检查
对输入的内容严格以“限制、拒绝、净化”的流程进行完备检查,例如整数型参数限制包含非数字符号,字符类型参数限制包含引号、括号、分号和百分号等SQL语句相关的符号。
3、将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
4、加强SQL数据库服务器的配置与连接
如避免将敏感信息以明文的方式存放在数据库中;以最小权限原则配置web程序连接数据库的查询操作权限。