龙空技术网

SQL注入最易懂系列教程(2.union联合查询注入)

python黑客爱好者 2196

前言:

此刻大家对“mysql联合查询union”可能比较关注,看官们都想要分析一些“mysql联合查询union”的相关资讯。那么小编在网上搜集了一些关于“mysql联合查询union””的相关内容,希望我们能喜欢,各位老铁们快快来学习一下吧!

前一篇我们讲了SQL注入的原理,分类,这一篇我们以DVWA漏洞演示环境讲解union联合查询

DVWA简介

DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。

需要注意的是,

DVWA的搭建这里就不在赘述,网上有相关教程

我总结了下手工注入的思路,大致步骤如下:

1.判断是否存在注入,注入是字符型还是数字型

2.猜解SQL查询语句中的字段数

3.确定显示的字段顺序

4.获取当前数据库

5.获取数据库中的表

6.获取表中的字段名

7.下载数据

下面我们对四种级别的代码进行分析:

1.判断是否存在注入,注入是字符型还是数字型

输入1,查询成功:

上一篇我们讲了

我们在输入框中输入1,点击submit,页面返回如上图页面。是web应用查询了数据库,获取了useid为1的数据。SQL语句是:

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

where有三种形式,如下图所示

POC(全称: Proof of Concept),意思是:漏洞验证代码

我们上一节讲到了SQL注入的分类:

如果where语句是图中第一行,我们称为数字型注入点。

如果where语句是图中第二、三行,我们称为字符型注入点。

图中红色部分为我们渗透测试所要用到的代码

a.我们先验证这里是否存在漏洞

输入1,查询成功:

接着我们输入1',然后点submit

报错,说明这里存在注入。

b.接着,我们判断是字符型注入还是数字型注入

我们依次输入三种POC

输入1 or 1024=1024

返回结果是userid =1的结果并没有注入成功

输入 1' or '1024'='1024'

这里返回这么多结果,表明where语句被成功的or条件处理

输入 1" or "1024"="1024"

返回结果是userid =1的结果并没有注入成功

由此我们判断这里使用的变量时用单引号闭合的,注入类型为字符型注入。

2.猜解SQL查询语句中的字段数

输入1′ order by 1 #,显示正常:

(这里我们解释下 order by 1的意思,order by 1是sql语句,意思是按照查询的第一个字段排序)

(这里我们解释下#的意思,#是sql语句中的注释符,sql语句是需要闭合的,我们用注释符号来闭合)

输入1′ order by 2 #,显示正常:

输入1′ order by 3 #,查询失败

说明执行的SQL查询语句中只有两个字段,即这里的First name、Surname。

这里我们讨论下,为甚么要猜解SQL查询语句中的字段数呢?

我们这节的题目是union联合查询,比如我想查找一下别的表的数据,比如admin表,要想查找别的表的数据,咱们就需要一个联合查询。

联合查询就是将多张表合在一条sql语句一块查询,比如:selectid,news,date from adout where id = 3 union select id ,username,password from admin,联合查询需要注意一个问题,那就是前后select 中字段数目必须一样,而且前面每个字段类型必须和后面每个字段的类型相兼容。

所以我们要构造union后面的查询语句,就需要知道union前面的查询语句的字段数。

3.确定显示的字段

输入1′ union select 1,2 #,查询成功:

这节我们讲的是union联合查询注入,属于回显注入,我们就根据回显的类容看到数据库中的信息,所以我们这里确定回显的字段。这里第一个字段和第二个都回显

4.获取当前数据库

输入1′ union select 1,database() #,查询成功:

说明当前的数据库为dvwa。

5.获取数据库中的表

输入xx' union select 1,table_name from information_schema.tables where table_schema='dvwa'-- 查询成功:

6.获取表中的字段名

输入xx' union select 1,column_name from information_schema.columns where table_name='users'-- ,查询成功

说明users表中有8个字段,分别是user_id,first_name,last_name,user,password,avatar,last_login,failed_login。

其中user,password字段就是我们想要得到的账号密码

7.下载数据

输入xx' union select user,password from users--,查询成功:

这里我们就得到了登录用的账号和密码。

至于为什么输入这些语句就能得到想要的数据我们下节内容在解释。

标签: #mysql联合查询union #mysql联合查询注入

上一篇mysql为什么不让删外键

下一篇没有了