mysql的注入类型,SQL注入最易懂系列教程(1.原理和分类)

SQL注入最易懂系列教程(1.原理和分类)

作者:PHPYuan 时间:2018-07-07 23:41:35

前置技能1.了解SQL语言、语法、操作、常用函数

(基本的SQL数据库操作是进行SQL注入攻击的基础)

2.了解PHP语言,以及PHP+SQL的常用组合操作

1.什么是SQL注入

所谓SQL注入,就是通过把SQL命令插入到 Web表单提交 或 URL 或 页面请求等的查询字符串中,最终达到欺骗服务器执行恶意的SQL命令。

注:从这句话看出常见的注入点在

a. web表单

b. URL链接中

c. 登录框(页面请求查询)

2.SQL注入原理

SQL注入(SQLInjection)是这样一种漏洞:当我们的Web app 在向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。

SQL注入漏洞的本质是把用户输入的数据当做代码来执行,违背了“数据与代码分离”的原则。

SQL注入漏洞有两个关键条件,理解这两个条件可以帮助我们理解并防御SQL注入漏洞:用户能控制输入的内容

Web应用执行的代码中,拼接了用户输入的内容

我们以DVWA漏洞演示环境举列子

我们在输入框中输入1,点击submit,页面返回如图红框中数据。

这里有经验的渗透老司机就知道,是web应用查询了数据库,获取了useid为1的数据。

这里我们大胆猜测一下这里的SQL语句长什么样子呢

select Firstname, sunname from XXX where userid= 我们输入的ID

1c1507085ebc39c4d56ce6941f066a64.png

当我们在输入框中输入1时sql语句为:

select Firstname, sunname from XXX where userid= '1'

由回显数据我们得到Id为1的firstname,sunname的字段内容

但是当我们在输入框中输入如下内容时

1' union select 1,database()%23(‘%23’为’#’的url编码,’#’为mysql注释符,注释掉后面的语句)

此时执行的数据库命令是:

select Firstname, sunname from XXX where userid= '1' union select 1,databsae()#

不仅可以得到id为1的firstname,sunname字段内容,还可以得到当前数据库名

c31ef7fd061549bb2876034c7b17d619.png

这样如果攻击者构造更多的SQL语句,哪么数据库里的信息都会被攻击者得到,造成数据泄露。

3.SQL注入的产生动态字符串构建

不正确的处理转义字符(宽字节注入)

不正确的处理类型(报错泄露信息)

不正确的处理联合查询

不正确的处理错误(报错泄露信息)

不正确的处理多次提交(二次注入)

不安全的数据库配置

默认预先安装的用户

以root、SYSTEM 或者Administrator权限系统用户来运行

默认允许很多系统函数(如xp_cmdshell, OPENROWSET 等)

4.SQL注入的作用绕过登录验证(万能密码等)

获取敏感数据(获取数据库中的信息)

文件操作(读取、写入文件等)

执行系统命令

等等

5.常见的SQL注入分类

A.按照数据库执行结果是否显示到页面上分类

a.SQL回显注入(数据库的执行结果直接显示到页面上)

SQL回显注入又可以分为:

01:union联合查询注入

02:报错注入

b.SQL盲住(不显示到页面上)

SQL 盲住又可以分为:

01:布尔盲住

02:时间注入

B.按照注入点类型来分类数字型注入点

在 Web 端大概是 http://xxx.com/news.php?id=1 这种形式,其注入点 id 类型为数字,所以叫数字型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where id=1。

字符型注入点

在 Web 端大概是 http://xxx.com/news.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name='admin'。有时候是是双引号:where name="admin",注意多了引号。

搜索型注入点

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。 此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%'。

C.按照数据提交的方式来分类

这种分类其实只是 HTTP 传递数据的方式不同,严格来讲和 SQL 没多大关系,但是在编写 PoC (漏洞验证程序)的时候,这会影响到我们的代码中发送数据的形式,所以我在这里提出来了。GET 注入

提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接 http://xxx.com/news.php?id=1 , id 是注入点。

POST 注入

使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。

Cookie 注入

HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。

HTTP 头部注入

注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

分享到:

>> 下一篇:MySQL——如何快速对比数据? (2018-07-08 10:46)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值