安全漏洞中的屠龙刀——SQL注入

one、概念

SQL注入(SQL Injection)就是攻击者将SQL语句通过Web网页注入到网站后台的数据库中,从而对数据库进行控制或者破坏。SQL注入是一种主流的攻击方式。在OWASP Top 10中,一直稳居第一。

two、原理

SQL注入攻击的原理就是由于Web后台对用户输入的数据不进行严格的检查导致的,使得攻击者可以通过在post/get等web表单、输入域名或页面请求的查询字符串中插入恶意的SQL命令,并被web服务器执行,从而绕过PHP等脚本的不严谨导致的漏洞,与数据库进行交互,而这些都不是设计者本来的设计意图。

three、类型

1、按照注入点类型来分类

在进行SQL注入的时候我们需要判断注入点的闭合条件,可将SQL注入点大致分为三类:数字型注入点、字符型注入点、搜索型注入点。

a、数字型注入点

顾名思义就是输入数据是数字的就是数字型注入,在使用带关于ID啊,岁数啊!就是这种注入点,而由于在弱数据类型中,是没有数据类型这一概念的(其实有但是不那么严谨),就比如说,PHP中输入的数据,PHP是可以自动推导出数据的数据类型的,而Python中是将输入的数据全部转换成字符串。

例如:
select * from 表名 where 数字型参数 = 1

b、字符型注入点

字符型注入点就是输入的数据是字符型,字符型与数字型的区别就是有没有引号括起来,但是一般情况下数字型也可以括起来,而字符型就行不行了,必须有引号。在使用带关于姓名,地址,就是这种注入点。

例如:
select * from 表名 where 字符型参数 = 'text'

c、搜索型注入点

搜索型注入点是在进行数据搜索时没过滤搜索参数,一般在链接地址中有"keyword=关键字",直接通过搜索框表单提交。

例如:
select * from 表名 where 字段 like '%关键字%'

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

这种分类就是通过判断向数据库进行提交用到了那种提交方式,比较常用的有GET、POSH方式。

a、GET 注入

这种注入方式是通过GET请求方式向服务器提交数据,注入点位置在GET数据部分,在URL中显示。

b、POST注入

使用了POST请求方式向服务器提交数据,注入点位置在POST数据部分,没有在URL中显示。

d、HTTP头部注入

这种注入一般在在 HTTP 请求头部的某个字段中,比如UA或者cooke都有可能。

3、按照执行效果来分类

我们可以通过注入后,对返回的执行效果进行分析,可分为布尔型,时间型,报错型。

a、基于报错注入

基于报错注入是没有数据的回显位,也就是说即使构造语句成功,我们也没有办法看到数据的显示,但是这种注入型却可以通过页面执行后返回的错误信息显示在页面上,这时候我们可以利用这点来构造报错显示sql语句。

b、基于布尔的盲注

布尔的盲注就是说通过判断执行后返回效果,即真假两种答案进行语句猜测。
布尔型盲注是由于页面提交数据在与数据交互是完全没有在页面上出现回显数据,只会出现数据提交正确和错误两种不同页面(注意区别于报错型,报错会出现报错信息,而布尔型不会)。

例如:A问一个哑巴事情,对就点头,错就摇头。
场景如下:
A:“朋友,你是不姓张?”
哑巴:摇头
A:“我知道了,你姓李吗?”
哑巴:点头
A:“原来姓李”
然后A开始了新一轮的猜测

c、基于时间的盲注

时间型的注入遇到的条件更为苛刻,由于交互完成以后网站没有错误和正确的页面的回显,这种情况我们可以利用条件语句与时间延迟语句进行判断,关键函数是sleep()

4、按照组合查询来分类

a、联合查询注入

联合查询注入是可以使用union all的情况下的注入。

b、堆查询注入

堆查询注入是说可以同时执行多条SQL语句。

c、宽字节注入

宽字节注入就是由于后台机制会给特殊字符添加转义字符来达到防御的目的,即%--->\ 等, 但是当我们输入%5c%27,即(’),后台对%5c添加转义%df等于的我们输入的%5c%27组合就被添加为%df%5c%27,由于%df%5c是一个宽字节汉字,语句就会形成縗%27 -->縗'

four、危害

SQL注入作为OWASP Top 10的第一名,说明其危害性是可以说显而易见的。当攻击者控制一个企业的数据库的时候,可以想象下,我们如果在这个企业上有金额或者姓名、身份证等隐私数据将会被曝光,这是非常可怕的。

以下是说可能涉及到的危害:

  • 1、数据库信息泄露
  • 2、网页被篡改
  • 3、管理数据库后台
  • 4、盗取各类用户帐号
  • 5、控制网站服务器数据
  • 6、盗窃所属网站公司的商业价值资料

five、SQL注入攻击流程

攻击流程:

  • 1、判断交互方式
    在进行SQL注入时,我们需要知道是客户端使用什么方式与服务器进行交互的,一般是getpost
  • 2、寻找注入点,进行猜测注入,打破构造
    通过SQL语句进行测试注入,找出网页的语言漏洞,个人感觉这是最关键的一步。
    若不执行,说明注入是失败;若报错,说明语句可能有效;若执行语句并返回预计值,说明注入成功。
    常见的闭合有:''""()('')("")[]{}
  • 3、注入成功后,使用SQL语句进行数据库信息采集
    这一步就是需要熟悉SQL语句,从而查询数据库的基本信息。比如:寻找显示数据多少、数据库名称、数据库的表、数据库的列等等。
  • 4、当得到数据库信息后,我们就可以开始撰写报告了
    到了这一步基本渗透测试就完成了,然后整理信息,提交漏洞报告。

测试SQL:

检测SQL一般分两种:手工检查、全自动检测

  • 手工检查
    一般使用盲打的方式,就是不知道后台代码,靠自己的经验去猜测,或者使用一些比较敏感的符号''""()('')("")[]{}
    反正见到输入框或者是URL参数就是加代码。

  • 全自动检测
    检测工具:啊d注入工具、明小子、Pangolin、Sqlmap(推荐)

任何的检测方式都有利有弊,所以真正厉害的大牛,都是使用半手工半自动。

常见函数:

select system_user()--系统用户名
select user()--用户名
select current_user()--当前用户名
select session_user()--连接数据库用的用户名
select database()--数据库名
select version()--mysql数据库版本
select load_file(路径)--mysql读取本地文件的函数
select @@datadir--数据库路径
select @@basedir--mysql安装路径
select @@version_compile_os--操作系统

Six、防御措施

  • 过滤特殊字符
  • 使用严谨的函数
  • 尽量避免用户输入的数据与数据库直接交互
  • 多层验证
  • 对数据库信息进行密文加密
  • 尽量避免使用ROOT最高权限操作数据库

做一个网络的维护者,而不是攻击者!

你可能感兴趣的:(hack,mysql,sql,web,安全漏洞)